From 720a11a862f922adf2e8ad07bb77f4745c4a3519 Mon Sep 17 00:00:00 2001 From: moi15moi <80980684+moi15moi@users.noreply.github.com> Date: Sat, 10 May 2025 22:15:10 -0400 Subject: [PATCH] Don't assume particuliar order of AttachedFile segment The previous code was assuming that, in the AttachedFile, the name and mime type were always before the data. This isn't true because the order is not guaranteed by the Matroska specification. --- .../media/extractor/AssMatroskaExtractor.kt | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib_ass_media/src/main/java/io/github/peerless2012/ass/media/extractor/AssMatroskaExtractor.kt b/lib_ass_media/src/main/java/io/github/peerless2012/ass/media/extractor/AssMatroskaExtractor.kt index 0531f79..4870263 100644 --- a/lib_ass_media/src/main/java/io/github/peerless2012/ass/media/extractor/AssMatroskaExtractor.kt +++ b/lib_ass_media/src/main/java/io/github/peerless2012/ass/media/extractor/AssMatroskaExtractor.kt @@ -20,6 +20,7 @@ class AssMatroskaExtractor( private var currentAttachmentName: String? = null private var currentAttachmentMime: String? = null + private var currentAttachmentData: ByteArray? = null internal val subtitleSample = subtitleSampleField.get(this) as ParsableByteArray @@ -65,7 +66,17 @@ class AssMatroskaExtractor( assHandler.setVideoSize(track.width, track.height) super.endMasterElement(id) } - ID_ATTACHED_FILE -> clearAttachment() + ID_ATTACHED_FILE -> { + val attachmentName = requireNotNull(currentAttachmentName) + val attachmentMime = requireNotNull(currentAttachmentMime) + val attachmentData = requireNotNull(currentAttachmentData) + + // Only add fonts if an ASS track was detected to support lazy initialization + if (assHandler.hasTracks() && attachmentMime in fontMimeTypes) { + assHandler.ass.addFont(attachmentName, attachmentData) + } + clearAttachment() + } else -> super.endMasterElement(id) } } @@ -81,17 +92,8 @@ class AssMatroskaExtractor( override fun binaryElement(id: Int, contentSize: Int, input: ExtractorInput) { when (id) { ID_FILE_DATA -> { - val attachmentName = requireNotNull(currentAttachmentName) - val attachmentMime = requireNotNull(currentAttachmentMime) - - // Only add fonts if an ASS track was detected to support lazy initialization - if (assHandler.hasTracks() && attachmentMime in fontMimeTypes) { - val data = ByteArray(contentSize) - input.readFully(data, 0, contentSize) - assHandler.ass.addFont(attachmentName, data) - } else { - input.skipFully(contentSize) - } + currentAttachmentData = ByteArray(contentSize) + input.readFully(currentAttachmentData!!, 0, contentSize) } else -> super.binaryElement(id, contentSize, input) } @@ -100,6 +102,7 @@ class AssMatroskaExtractor( private fun clearAttachment() { currentAttachmentName = null currentAttachmentMime = null + currentAttachmentData = null } companion object {