Skip to content

Commit

Permalink
Fix start timestamps
Browse files Browse the repository at this point in the history
Signed-off-by: Ethan Dye <[email protected]>
  • Loading branch information
ecdye committed Oct 3, 2024
1 parent 450805e commit 757e00a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 25 deletions.
4 changes: 1 addition & 3 deletions Sources/macSubtitleOCR/Subtitles/Subtitle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Subtitle {
var numberOfColors: Int?
var endTimestamp: TimeInterval?

init(index: Int? = nil, text: String? = nil, startTimestamp: TimeInterval? = nil, endTimestamp: TimeInterval? = nil, imageXOffset: Int? = nil, imageYOffset: Int? = nil, imageWidth: Int? = nil, imageHeight: Int? = nil, imageEvenOffset: Int? = nil, imageOddOffset: Int? = nil, imageData: Data? = nil, imagePalette: [UInt8]? = nil, imageAlpha: [UInt8]? = nil, imageStride: Int? = nil, numberOfColors: Int? = nil) {
init(index: Int? = nil, text: String? = nil, startTimestamp: TimeInterval? = nil, endTimestamp: TimeInterval? = nil, imageXOffset: Int? = nil, imageYOffset: Int? = nil, imageWidth: Int? = nil, imageHeight: Int? = nil, imageData: Data? = nil, imagePalette: [UInt8]? = nil, imageAlpha: [UInt8]? = nil, imageStride: Int? = nil, numberOfColors: Int? = nil) {
self.index = index
self.text = text
self.startTimestamp = startTimestamp
Expand All @@ -35,8 +35,6 @@ class Subtitle {
self.imageYOffset = imageYOffset
self.imageWidth = imageWidth
self.imageHeight = imageHeight
self.imageEvenOffset = imageEvenOffset
self.imageOddOffset = imageOddOffset
self.imageData = imageData
self.imagePalette = imagePalette
self.imageAlpha = imageAlpha
Expand Down
22 changes: 21 additions & 1 deletion Sources/macSubtitleOCR/Subtitles/VobSub/VobSub.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class VobSub {

if let timestampMatch, let offsetMatch {
let timestampString = (line as NSString).substring(with: timestampMatch.range(at: 1))
let timestamp = dateFormatter.date(from: timestampString)?.timeIntervalSinceReferenceDate
let timestamp = extractTimestamp(from: timestampString)
let offsetString = (line as NSString).substring(with: offsetMatch.range(at: 1))
if let offset = Int(offsetString, radix: 16), let timestamp {
subtitles.append(IdxSubtitleReference(timestamp: timestamp, offset: offset))
Expand All @@ -87,6 +87,26 @@ class VobSub {
return subtitles
}

func extractTimestamp(from idxTimestamp: String) -> TimeInterval? {
// Split the timestamp into components (hours, minutes, seconds, milliseconds)
let components = idxTimestamp.split(separator: ":")

// Ensure we have exactly 4 components (hh:mm:ss:ms)
guard components.count == 4,
let hours = Double(components[0]),
let minutes = Double(components[1]),
let seconds = Double(components[2]),
let milliseconds = Double(components[3])
else {
return nil
}

// Convert everything to seconds
let totalSeconds = (hours * 3600) + (minutes * 60) + seconds + (milliseconds / 1000)

return totalSeconds
}

func extractSubtitleImages(subFile: FileHandle, idxReference: [IdxSubtitleReference]) throws {
var idx = 0
for subtitle in idxReference {
Expand Down
22 changes: 1 addition & 21 deletions Sources/macSubtitleOCR/Subtitles/VobSub/VobSubParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ func readSubFrame(pic: inout Subtitle, subFile: FileHandle, offset: UInt64, next
var relativeControlOffset = 0
var rleLengthFound = 0

// logger.info("Reading subtitle frame at offset \(offset) with next offset \(nextOffset)")
print("Reading subtitle frame at offset \(offset) with next offset \(nextOffset)")
subFile.seek(toFileOffset: offset)
repeat {
let startOffset = subFile.offsetInFile
Expand Down Expand Up @@ -168,11 +166,7 @@ func readSubFrame(pic: inout Subtitle, subFile: FileHandle, offset: UInt64, next
let dimensions = (width: pic.imageWidth!, height: pic.imageHeight!)
logger.debug("Dimensions: width: \(dimensions.width), height: \(dimensions.height)")
case 6:
pic.imageEvenOffset = (Int(controlHeader.value(ofType: UInt16.self, at: index)!) - 4)
pic.imageOddOffset = (Int(controlHeader.value(ofType: UInt16.self, at: index + 2)!) - 4)
index += 4
let rleOffsets = (even: pic.imageEvenOffset!, odd: pic.imageOddOffset!)
logger.debug("RLE Offsets: even: \(rleOffsets.even), odd: \(rleOffsets.odd)")
break // RLE offsets (not implemented)
case 7:
break // Color / Alpha updates (not implemented)
default:
Expand All @@ -199,24 +193,10 @@ func decodePalette(subPicture: Subtitle, masterPalette: [UInt8]) -> [UInt8] {
}

func decodeImage(subtitle: Subtitle, fileBuffer _: FileHandle) throws -> Data {
let sizeEven: Int
let sizeOdd: Int
let width = subtitle.imageWidth!
let height = subtitle.imageHeight!
var bitmap = Data(repeating: 0, count: width * height * subtitle.imageStride!)

if subtitle.imageOddOffset! > subtitle.imageEvenOffset! {
sizeEven = subtitle.imageOddOffset! - subtitle.imageEvenOffset!
sizeOdd = subtitle.imageData!.count - subtitle.imageOddOffset!
} else {
sizeOdd = subtitle.imageEvenOffset! - subtitle.imageOddOffset!
sizeEven = subtitle.imageData!.count - subtitle.imageEvenOffset!
}

guard sizeEven > 0, sizeOdd > 0 else {
throw VobSubError.invalidRLEBufferOffset
}

let rleData = RLEData(data: subtitle.imageData!, width: width, height: height)
bitmap = try rleData.decodeVobSub()

Expand Down

0 comments on commit 757e00a

Please sign in to comment.