From 4db2ca63351a4abaf0daf3c1a65913b846215ab9 Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Thu, 13 Feb 2025 00:38:26 +0800 Subject: [PATCH 01/14] Add layer in cue and output. --- .../java/androidx/media3/common/text/Cue.java | 40 +++++++++++++++++-- .../exoplayer/text/MergingCuesResolver.java | 9 ++++- .../media3/extractor/text/CuesWithTiming.java | 9 ++++- .../androidx/media3/ui/SubtitlePainter.java | 5 ++- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java index 84a99393656..1701f8da0d2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java @@ -309,6 +309,11 @@ public final class Cue { */ public final float shearDegrees; + /** + * The layer for cue, the larger cue will render above the smaller cue. + */ + public final int layer; + private Cue( @Nullable CharSequence text, @Nullable Alignment textAlignment, @@ -326,7 +331,8 @@ private Cue( boolean windowColorSet, int windowColor, @VerticalType int verticalType, - float shearDegrees) { + float shearDegrees, + int layer) { // Exactly one of text or bitmap should be set. if (text == null) { Assertions.checkNotNull(bitmap); @@ -356,6 +362,7 @@ private Cue( this.textSize = textSize; this.verticalType = verticalType; this.shearDegrees = shearDegrees; + this.layer = layer; } /** Returns a new {@link Cue.Builder} initialized with the same values as this Cue. */ @@ -391,7 +398,8 @@ public boolean equals(@Nullable Object obj) { && textSizeType == that.textSizeType && textSize == that.textSize && verticalType == that.verticalType - && shearDegrees == that.shearDegrees; + && shearDegrees == that.shearDegrees + && layer == that.layer; } @Override @@ -413,7 +421,8 @@ public int hashCode() { textSizeType, textSize, verticalType, - shearDegrees); + shearDegrees, + layer); } /** A builder for {@link Cue} objects. */ @@ -436,6 +445,7 @@ public static final class Builder { @ColorInt private int windowColor; private @VerticalType int verticalType; private float shearDegrees; + private int layer; public Builder() { text = null; @@ -474,6 +484,7 @@ private Builder(Cue cue) { windowColor = cue.windowColor; verticalType = cue.verticalType; shearDegrees = cue.shearDegrees; + layer = cue.layer; } /** @@ -806,6 +817,21 @@ public Builder setShearDegrees(float shearDegrees) { return verticalType; } + /** Sets the layer for this Cue. */ + @CanIgnoreReturnValue + public Builder setLayer(int layer) { + this.layer = layer; + return this; + } + + /** + * Gets the layer for this Cue. + */ + @Pure + public @VerticalType int getLayer() { + return layer; + } + /** Build the cue. */ public Cue build() { return new Cue( @@ -825,7 +851,8 @@ public Cue build() { windowColorSet, windowColor, verticalType, - shearDegrees); + shearDegrees, + layer); } } @@ -848,6 +875,7 @@ public Cue build() { private static final String FIELD_WINDOW_COLOR_SET = Util.intToStringMaxRadix(14); private static final String FIELD_VERTICAL_TYPE = Util.intToStringMaxRadix(15); private static final String FIELD_SHEAR_DEGREES = Util.intToStringMaxRadix(16); + private static final String FIELD_LAYER = Util.intToStringMaxRadix(19); /** * Returns a {@link Bundle} that can be serialized to bytes. @@ -923,6 +951,7 @@ private Bundle toBundleWithoutBitmap() { bundle.putInt(FIELD_WINDOW_COLOR, windowColor); bundle.putInt(FIELD_VERTICAL_TYPE, verticalType); bundle.putFloat(FIELD_SHEAR_DEGREES, shearDegrees); + bundle.putInt(FIELD_LAYER, layer); return bundle; } @@ -995,6 +1024,9 @@ public static Cue fromBundle(Bundle bundle) { if (bundle.containsKey(FIELD_SHEAR_DEGREES)) { builder.setShearDegrees(bundle.getFloat(FIELD_SHEAR_DEGREES)); } + if (bundle.containsKey(FIELD_LAYER)) { + builder.setLayer(bundle.getInt(FIELD_LAYER)); + } return builder.build(); } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java index f015f059fc6..cb4b712441f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java @@ -52,6 +52,12 @@ .compound( Ordering.natural().reverse().onResultOf((CuesWithTiming c) -> c.durationUs)); + /** + * An {@link Ordering} which sorts cues in ascending layer priority + */ + private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = + Ordering.natural().onResultOf(c -> c.layer); + /** Sorted by {@link CuesWithTiming#startTimeUs} ascending. */ private final List cuesWithTimingList; @@ -97,7 +103,8 @@ public ImmutableList getCuesAtTimeUs(long timeUs) { for (int i = 0; i < sortedResult.size(); i++) { result.addAll(sortedResult.get(i).cues); } - return result.build(); + // sort by layer + return ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, result.build()); } @Override diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java index cb8a6ea8f00..c8f250b700b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java @@ -21,12 +21,19 @@ import androidx.media3.common.text.Cue; import androidx.media3.common.util.UnstableApi; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Ordering; import java.util.List; /** A list of {@link Cue} instances with a start time and duration. */ @UnstableApi public class CuesWithTiming { + /** + * An {@link Ordering} which sorts cues in ascending layer priority + */ + private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = + Ordering.natural().onResultOf(c -> c.layer); + /** The cues to show on screen. */ public final ImmutableList cues; @@ -68,7 +75,7 @@ public class CuesWithTiming { /** Creates an instance. */ public CuesWithTiming(List cues, long startTimeUs, long durationUs) { - this.cues = ImmutableList.copyOf(cues); + this.cues = ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, cues); this.startTimeUs = startTimeUs; this.durationUs = durationUs; this.endTimeUs = diff --git a/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java b/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java index 4d298da946d..bf19070e763 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java @@ -85,6 +85,7 @@ private int parentTop; private int parentRight; private int parentBottom; + private int cueLayer; // Derived drawing variables. private @MonotonicNonNull StaticLayout textLayout; @@ -184,7 +185,8 @@ public void draw( && this.parentLeft == cueBoxLeft && this.parentTop == cueBoxTop && this.parentRight == cueBoxRight - && this.parentBottom == cueBoxBottom) { + && this.parentBottom == cueBoxBottom + && this.cueLayer == cue.layer) { // We can use the cached layout. drawLayout(canvas, isTextCue); return; @@ -213,6 +215,7 @@ public void draw( this.parentTop = cueBoxTop; this.parentRight = cueBoxRight; this.parentBottom = cueBoxBottom; + this.cueLayer = cue.layer; if (isTextCue) { Assertions.checkNotNull(cueText); From 8af30d97d8b6b3ff66b06d97702c63df37c61c3b Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Thu, 13 Feb 2025 00:40:03 +0800 Subject: [PATCH 02/14] Add layer support for ssa parser. --- demos/main/src/main/assets/media.exolist.json | 7 +++++ .../extractor/text/ssa/SsaDialogueFormat.java | 10 +++++-- .../media3/extractor/text/ssa/SsaParser.java | 26 +++++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index fd9ea623245..cff5682fcb4 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -705,6 +705,13 @@ "subtitle_mime_type": "text/x-ssa", "subtitle_language": "en" }, + { + "name": "SubStation Layer Render", + "uri": "https://storage.googleapis.com/exoplayer-test-media-1/gen-3/screens/dash-vod-single-segment/video-avc-baseline-480.mp4", + "subtitle_uri": "https://storage.googleapis.com/exoplayer-test-media-1/ssa/test-subs-layer.ass", + "subtitle_mime_type": "text/x-ssa", + "subtitle_language": "en" + }, { "name": "MPEG-4 Timed Text", "uri": "https://storage.googleapis.com/exoplayer-test-media-1/mp4/dizzy-with-tx3g.mp4" diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java index 360ab05d520..f9b1128b440 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java @@ -32,6 +32,7 @@ */ /* package */ final class SsaDialogueFormat { + public final int layerIndex; public final int startTimeIndex; public final int endTimeIndex; public final int styleIndex; @@ -39,7 +40,8 @@ public final int length; private SsaDialogueFormat( - int startTimeIndex, int endTimeIndex, int styleIndex, int textIndex, int length) { + int layerIndex, int startTimeIndex, int endTimeIndex, int styleIndex, int textIndex, int length) { + this.layerIndex = layerIndex; this.startTimeIndex = startTimeIndex; this.endTimeIndex = endTimeIndex; this.styleIndex = styleIndex; @@ -54,6 +56,7 @@ private SsaDialogueFormat( */ @Nullable public static SsaDialogueFormat fromFormatLine(String formatLine) { + int layerIndex = C.INDEX_UNSET; int startTimeIndex = C.INDEX_UNSET; int endTimeIndex = C.INDEX_UNSET; int styleIndex = C.INDEX_UNSET; @@ -62,6 +65,9 @@ public static SsaDialogueFormat fromFormatLine(String formatLine) { String[] keys = TextUtils.split(formatLine.substring(FORMAT_LINE_PREFIX.length()), ","); for (int i = 0; i < keys.length; i++) { switch (Ascii.toLowerCase(keys[i].trim())) { + case "layer": + layerIndex = i; + break; case "start": startTimeIndex = i; break; @@ -79,7 +85,7 @@ public static SsaDialogueFormat fromFormatLine(String formatLine) { return (startTimeIndex != C.INDEX_UNSET && endTimeIndex != C.INDEX_UNSET && textIndex != C.INDEX_UNSET) - ? new SsaDialogueFormat(startTimeIndex, endTimeIndex, styleIndex, textIndex, keys.length) + ? new SsaDialogueFormat(layerIndex, startTimeIndex, endTimeIndex, styleIndex, textIndex, keys.length) : null; } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java index ded9350678b..299d2159de2 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java @@ -328,6 +328,14 @@ private void parseDialogueLine( return; } + int layer = 0; + if (format.layerIndex != C.INDEX_UNSET) { + layer = parseInt(lineValues[format.layerIndex]); + if (layer == C.LENGTH_UNSET) { + layer = 0; + } + } + long startTimeUs = parseTimecodeUs(lineValues[format.startTimeIndex]); if (startTimeUs == C.TIME_UNSET) { Log.w(TAG, "Skipping invalid timing: " + dialogueLine); @@ -352,7 +360,7 @@ private void parseDialogueLine( .replace("\\N", "\n") .replace("\\n", "\n") .replace("\\h", "\u00A0"); - Cue cue = createCue(text, style, styleOverrides, screenWidth, screenHeight); + Cue cue = createCue(text, layer, style, styleOverrides, screenWidth, screenHeight); int startTimeIndex = addCuePlacerholderByTime(startTimeUs, cueTimesUs, cues); int endTimeIndex = addCuePlacerholderByTime(endTimeUs, cueTimesUs, cues); @@ -362,6 +370,19 @@ private void parseDialogueLine( } } + /** + * Parse int in SSA. + * @param intString The string to parse. + * @return The parsed int. + */ + private static int parseInt(String intString) { + try { + return Integer.parseInt(intString.trim()); + } catch (Exception exception) { + return C.LENGTH_UNSET; + } + } + /** * Parses an SSA timecode string. * @@ -383,12 +404,13 @@ private static long parseTimecodeUs(String timeString) { private static Cue createCue( String text, + int layer, @Nullable SsaStyle style, SsaStyle.Overrides styleOverrides, float screenWidth, float screenHeight) { SpannableString spannableText = new SpannableString(text); - Cue.Builder cue = new Cue.Builder().setText(spannableText); + Cue.Builder cue = new Cue.Builder().setText(spannableText).setLayer(layer); if (style != null) { if (style.primaryColor != null) { From 099a7c5e6adb0cca3c968d57fda0e4f1b4102db8 Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Wed, 26 Feb 2025 14:58:50 +0800 Subject: [PATCH 03/14] Move sort by layer to CueGroup. --- .../java/androidx/media3/common/text/CueGroup.java | 9 ++++++++- .../media3/exoplayer/text/MergingCuesResolver.java | 9 +-------- .../androidx/media3/extractor/text/CuesWithTiming.java | 10 +--------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java index 30ab4f31f3f..8a4df59e48c 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java @@ -23,12 +23,19 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Ordering; import java.util.ArrayList; import java.util.List; /** Class to represent the state of active {@link Cue Cues} at a particular time. */ public final class CueGroup { + /** + * An {@link Ordering} which sorts cues in ascending layer priority + */ + private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = + Ordering.natural().onResultOf(c -> c.layer); + /** An empty group with no {@link Cue Cues} and presentation time of zero. */ @UnstableApi public static final CueGroup EMPTY_TIME_ZERO = @@ -54,7 +61,7 @@ public final class CueGroup { /** Creates a CueGroup. */ @UnstableApi public CueGroup(List cues, long presentationTimeUs) { - this.cues = ImmutableList.copyOf(cues); + this.cues = ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, cues); this.presentationTimeUs = presentationTimeUs; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java index cb4b712441f..f015f059fc6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java @@ -52,12 +52,6 @@ .compound( Ordering.natural().reverse().onResultOf((CuesWithTiming c) -> c.durationUs)); - /** - * An {@link Ordering} which sorts cues in ascending layer priority - */ - private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = - Ordering.natural().onResultOf(c -> c.layer); - /** Sorted by {@link CuesWithTiming#startTimeUs} ascending. */ private final List cuesWithTimingList; @@ -103,8 +97,7 @@ public ImmutableList getCuesAtTimeUs(long timeUs) { for (int i = 0; i < sortedResult.size(); i++) { result.addAll(sortedResult.get(i).cues); } - // sort by layer - return ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, result.build()); + return result.build(); } @Override diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java index c8f250b700b..4dd2ffe071d 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java @@ -21,19 +21,11 @@ import androidx.media3.common.text.Cue; import androidx.media3.common.util.UnstableApi; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Ordering; import java.util.List; /** A list of {@link Cue} instances with a start time and duration. */ @UnstableApi public class CuesWithTiming { - - /** - * An {@link Ordering} which sorts cues in ascending layer priority - */ - private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = - Ordering.natural().onResultOf(c -> c.layer); - /** The cues to show on screen. */ public final ImmutableList cues; @@ -75,7 +67,7 @@ public class CuesWithTiming { /** Creates an instance. */ public CuesWithTiming(List cues, long startTimeUs, long durationUs) { - this.cues = ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, cues); + this.cues = ImmutableList.copyOf(cues); this.startTimeUs = startTimeUs; this.durationUs = durationUs; this.endTimeUs = From 55fe0481b9429d3a12f6b42ed1945cd12cc88c9c Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Wed, 26 Feb 2025 15:14:00 +0800 Subject: [PATCH 04/14] Rename layer in Cue to zIndex, and remove zIndex in SubtitlePainter. --- .../java/androidx/media3/common/text/Cue.java | 38 +++++++++---------- .../androidx/media3/common/text/CueGroup.java | 8 ++-- .../media3/extractor/text/ssa/SsaParser.java | 4 +- .../androidx/media3/ui/SubtitlePainter.java | 5 +-- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java index 1701f8da0d2..18fe966d666 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java @@ -310,9 +310,9 @@ public final class Cue { public final float shearDegrees; /** - * The layer for cue, the larger cue will render above the smaller cue. + * The z index for cue, the larger index will render above the smaller index. */ - public final int layer; + public final int zIndex; private Cue( @Nullable CharSequence text, @@ -332,7 +332,7 @@ private Cue( int windowColor, @VerticalType int verticalType, float shearDegrees, - int layer) { + int zIndex) { // Exactly one of text or bitmap should be set. if (text == null) { Assertions.checkNotNull(bitmap); @@ -362,7 +362,7 @@ private Cue( this.textSize = textSize; this.verticalType = verticalType; this.shearDegrees = shearDegrees; - this.layer = layer; + this.zIndex = zIndex; } /** Returns a new {@link Cue.Builder} initialized with the same values as this Cue. */ @@ -399,7 +399,7 @@ public boolean equals(@Nullable Object obj) { && textSize == that.textSize && verticalType == that.verticalType && shearDegrees == that.shearDegrees - && layer == that.layer; + && zIndex == that.zIndex; } @Override @@ -422,7 +422,7 @@ public int hashCode() { textSize, verticalType, shearDegrees, - layer); + zIndex); } /** A builder for {@link Cue} objects. */ @@ -445,7 +445,7 @@ public static final class Builder { @ColorInt private int windowColor; private @VerticalType int verticalType; private float shearDegrees; - private int layer; + private int zIndex; public Builder() { text = null; @@ -484,7 +484,7 @@ private Builder(Cue cue) { windowColor = cue.windowColor; verticalType = cue.verticalType; shearDegrees = cue.shearDegrees; - layer = cue.layer; + zIndex = cue.zIndex; } /** @@ -817,19 +817,19 @@ public Builder setShearDegrees(float shearDegrees) { return verticalType; } - /** Sets the layer for this Cue. */ + /** Sets the zIndex for this Cue. */ @CanIgnoreReturnValue - public Builder setLayer(int layer) { - this.layer = layer; + public Builder setZIndex(int zIndex) { + this.zIndex = zIndex; return this; } /** - * Gets the layer for this Cue. + * Gets the zIndex for this Cue. */ @Pure - public @VerticalType int getLayer() { - return layer; + public int getZIndex() { + return zIndex; } /** Build the cue. */ @@ -852,7 +852,7 @@ public Cue build() { windowColor, verticalType, shearDegrees, - layer); + zIndex); } } @@ -875,7 +875,7 @@ public Cue build() { private static final String FIELD_WINDOW_COLOR_SET = Util.intToStringMaxRadix(14); private static final String FIELD_VERTICAL_TYPE = Util.intToStringMaxRadix(15); private static final String FIELD_SHEAR_DEGREES = Util.intToStringMaxRadix(16); - private static final String FIELD_LAYER = Util.intToStringMaxRadix(19); + private static final String FIELD_Z_INDEX = Util.intToStringMaxRadix(19); /** * Returns a {@link Bundle} that can be serialized to bytes. @@ -951,7 +951,7 @@ private Bundle toBundleWithoutBitmap() { bundle.putInt(FIELD_WINDOW_COLOR, windowColor); bundle.putInt(FIELD_VERTICAL_TYPE, verticalType); bundle.putFloat(FIELD_SHEAR_DEGREES, shearDegrees); - bundle.putInt(FIELD_LAYER, layer); + bundle.putInt(FIELD_Z_INDEX, zIndex); return bundle; } @@ -1024,8 +1024,8 @@ public static Cue fromBundle(Bundle bundle) { if (bundle.containsKey(FIELD_SHEAR_DEGREES)) { builder.setShearDegrees(bundle.getFloat(FIELD_SHEAR_DEGREES)); } - if (bundle.containsKey(FIELD_LAYER)) { - builder.setLayer(bundle.getInt(FIELD_LAYER)); + if (bundle.containsKey(FIELD_Z_INDEX)) { + builder.setZIndex(bundle.getInt(FIELD_Z_INDEX)); } return builder.build(); } diff --git a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java index 8a4df59e48c..e38a42d3cdb 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java @@ -31,10 +31,10 @@ public final class CueGroup { /** - * An {@link Ordering} which sorts cues in ascending layer priority + * An {@link Ordering} which sorts cues in ascending zIndex priority */ - private static final Ordering CUES_LAYER_PRIORITY_COMPARATOR = - Ordering.natural().onResultOf(c -> c.layer); + private static final Ordering CUES_PRIORITY_COMPARATOR = + Ordering.natural().onResultOf(c -> c.zIndex); /** An empty group with no {@link Cue Cues} and presentation time of zero. */ @UnstableApi @@ -61,7 +61,7 @@ public final class CueGroup { /** Creates a CueGroup. */ @UnstableApi public CueGroup(List cues, long presentationTimeUs) { - this.cues = ImmutableList.sortedCopyOf(CUES_LAYER_PRIORITY_COMPARATOR, cues); + this.cues = ImmutableList.sortedCopyOf(CUES_PRIORITY_COMPARATOR, cues); this.presentationTimeUs = presentationTimeUs; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java index 299d2159de2..d5210fca9d5 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java @@ -410,7 +410,9 @@ private static Cue createCue( float screenWidth, float screenHeight) { SpannableString spannableText = new SpannableString(text); - Cue.Builder cue = new Cue.Builder().setText(spannableText).setLayer(layer); + Cue.Builder cue = new Cue.Builder() + .setText(spannableText) + .setZIndex(layer); if (style != null) { if (style.primaryColor != null) { diff --git a/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java b/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java index bf19070e763..4d298da946d 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java @@ -85,7 +85,6 @@ private int parentTop; private int parentRight; private int parentBottom; - private int cueLayer; // Derived drawing variables. private @MonotonicNonNull StaticLayout textLayout; @@ -185,8 +184,7 @@ public void draw( && this.parentLeft == cueBoxLeft && this.parentTop == cueBoxTop && this.parentRight == cueBoxRight - && this.parentBottom == cueBoxBottom - && this.cueLayer == cue.layer) { + && this.parentBottom == cueBoxBottom) { // We can use the cached layout. drawLayout(canvas, isTextCue); return; @@ -215,7 +213,6 @@ public void draw( this.parentTop = cueBoxTop; this.parentRight = cueBoxRight; this.parentBottom = cueBoxBottom; - this.cueLayer = cue.layer; if (isTextCue) { Assertions.checkNotNull(cueText); From 75c41f62d05c699dfcaa609bd2f7ce47ade425fe Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Thu, 8 May 2025 17:04:23 +0800 Subject: [PATCH 05/14] Inline layer parser. --- .../media3/extractor/text/ssa/SsaParser.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java index d5210fca9d5..3396718e9ec 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java @@ -330,9 +330,10 @@ private void parseDialogueLine( int layer = 0; if (format.layerIndex != C.INDEX_UNSET) { - layer = parseInt(lineValues[format.layerIndex]); - if (layer == C.LENGTH_UNSET) { - layer = 0; + try { + layer = Integer.parseInt(lineValues[format.layerIndex].trim()); + } catch (Exception exception) { + Log.w(TAG, "Fail to parse layer: " + lineValues[format.layerIndex]); } } @@ -370,19 +371,6 @@ private void parseDialogueLine( } } - /** - * Parse int in SSA. - * @param intString The string to parse. - * @return The parsed int. - */ - private static int parseInt(String intString) { - try { - return Integer.parseInt(intString.trim()); - } catch (Exception exception) { - return C.LENGTH_UNSET; - } - } - /** * Parses an SSA timecode string. * From 9774676972ef37bb5a9195077abde66836b122dd Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Thu, 8 May 2025 17:41:51 +0800 Subject: [PATCH 06/14] Add ssa layer parser test. --- .../extractor/text/ssa/SsaParserTest.java | 40 +++++++++++++++++++ .../src/test/assets/media/ssa/invalid_layer | 15 +++++++ .../test_data/src/test/assets/media/ssa/layer | 15 +++++++ 3 files changed, 70 insertions(+) create mode 100644 libraries/test_data/src/test/assets/media/ssa/invalid_layer create mode 100644 libraries/test_data/src/test/assets/media/ssa/layer diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java index c8beeaf72df..b825bd2e561 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java @@ -56,6 +56,8 @@ public final class SsaParserTest { private static final String INVALID_TIMECODES = "media/ssa/invalid_timecodes"; private static final String INVALID_POSITIONS = "media/ssa/invalid_positioning"; private static final String POSITIONS_WITHOUT_PLAYRES = "media/ssa/positioning_without_playres"; + private static final String LAYERS = "media/ssa/layer"; + private static final String INVALID_LAYERS = "media/ssa/invalid_layer"; private static final String STYLE_PRIMARY_COLOR = "media/ssa/style_primary_color"; private static final String STYLE_OUTLINE_COLOR = "media/ssa/style_outline_color"; private static final String STYLE_FONT_SIZE = "media/ssa/style_font_size"; @@ -411,6 +413,44 @@ public void parseInvalidPositions() throws IOException { assertThat(fourthCue.line).isEqualTo(0.5f); } + @Test + public void parseLayer() throws IOException { + SsaParser parser = new SsaParser(); + byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), LAYERS); + ImmutableList allCues = parseAllCues(parser, bytes); + + // Check default layer. + Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); + assertThat(firstCue.zIndex).isEqualTo(0); + + // Check positive layer. + Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); + assertThat(secondCue.zIndex).isEqualTo(1); + + // Check negative layer. + Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); + assertThat(thirdCue.zIndex).isEqualTo(-1); + } + + @Test + public void parseInvalidLayer() throws IOException { + SsaParser parser = new SsaParser(); + byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INVALID_LAYERS); + ImmutableList allCues = parseAllCues(parser, bytes); + + // Check default layer. + Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); + assertThat(firstCue.zIndex).isEqualTo(0); + + // Check empty layer. + Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); + assertThat(secondCue.zIndex).isEqualTo(0); + + // Check invalid layer. + Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); + assertThat(thirdCue.zIndex).isEqualTo(0); + } + @Test public void parsePositionsWithMissingPlayResY() throws IOException { SsaParser parser = new SsaParser(); diff --git a/libraries/test_data/src/test/assets/media/ssa/invalid_layer b/libraries/test_data/src/test/assets/media/ssa/invalid_layer new file mode 100644 index 00000000000..363090a62e7 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/ssa/invalid_layer @@ -0,0 +1,15 @@ +[Script Info] +Title: SomeTitle +PlayResX: 300 +PlayResY: 202 + +[V4+ Styles] +! Alignment is set to 4 - i.e. middle-left +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +Style: Default,Open Sans Semibold,36,&H00FFFFFF,&H000000FF,&H00020713,&H00000000,-1,0,0,0,100,100,0,0,1,1.7,0,4,0,0,28,1 + +[Events] +Format: Layer, Start, End, Style, Name, Text +Dialogue: 0,0:00:00.00,0:00:01.23,Default,Olly,{\pos(150,50.5)}Default layer. +Dialogue: ,0:00:02.34,0:00:03.45,Default,Olly,{\pos(150,50.5)}Layer positive. +Dialogue: a,0:00:13:56,0:00:15:90,Default,Olly,{\pos(150,50.5)}Layer negative. \ No newline at end of file diff --git a/libraries/test_data/src/test/assets/media/ssa/layer b/libraries/test_data/src/test/assets/media/ssa/layer new file mode 100644 index 00000000000..17d6d64df01 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/ssa/layer @@ -0,0 +1,15 @@ +[Script Info] +Title: SomeTitle +PlayResX: 300 +PlayResY: 202 + +[V4+ Styles] +! Alignment is set to 4 - i.e. middle-left +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +Style: Default,Open Sans Semibold,36,&H00FFFFFF,&H000000FF,&H00020713,&H00000000,-1,0,0,0,100,100,0,0,1,1.7,0,4,0,0,28,1 + +[Events] +Format: Layer, Start, End, Style, Name, Text +Dialogue: 0,0:00:00.00,0:00:01.23,Default,Olly,{\pos(150,50.5)}Default layer. +Dialogue: 1,0:00:02.34,0:00:03.45,Default,Olly,{\pos(150,50.5)}Layer positive. +Dialogue: -1,0:00:13:56,0:00:15:90,Default,Olly,{\pos(150,50.5)}Layer negative. \ No newline at end of file From 7027a08d2b21ae6ecf426e09c7589b907f30b4a5 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 14:35:23 +0100 Subject: [PATCH 07/14] Simplify test files --- .../extractor/text/ssa/SsaParserTest.java | 18 +++++++----------- .../src/test/assets/media/ssa/invalid_layer | 15 ++++----------- .../test_data/src/test/assets/media/ssa/layer | 12 ++---------- 3 files changed, 13 insertions(+), 32 deletions(-) diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java index b825bd2e561..887a03143a6 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java @@ -419,17 +419,13 @@ public void parseLayer() throws IOException { byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), LAYERS); ImmutableList allCues = parseAllCues(parser, bytes); - // Check default layer. - Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); - assertThat(firstCue.zIndex).isEqualTo(0); - // Check positive layer. - Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); - assertThat(secondCue.zIndex).isEqualTo(1); + Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); + assertThat(firstCue.zIndex).isEqualTo(1); // Check negative layer. - Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); - assertThat(thirdCue.zIndex).isEqualTo(-1); + Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); + assertThat(secondCue.zIndex).isEqualTo(-1); } @Test @@ -438,15 +434,15 @@ public void parseInvalidLayer() throws IOException { byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INVALID_LAYERS); ImmutableList allCues = parseAllCues(parser, bytes); - // Check default layer. + // Check empty layer. Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.zIndex).isEqualTo(0); - // Check empty layer. + // Check non-numeric layer. Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.zIndex).isEqualTo(0); - // Check invalid layer. + // Check non-integer layer. Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.zIndex).isEqualTo(0); } diff --git a/libraries/test_data/src/test/assets/media/ssa/invalid_layer b/libraries/test_data/src/test/assets/media/ssa/invalid_layer index 363090a62e7..ba5b4b744d0 100644 --- a/libraries/test_data/src/test/assets/media/ssa/invalid_layer +++ b/libraries/test_data/src/test/assets/media/ssa/invalid_layer @@ -1,15 +1,8 @@ [Script Info] Title: SomeTitle -PlayResX: 300 -PlayResY: 202 - -[V4+ Styles] -! Alignment is set to 4 - i.e. middle-left -Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding -Style: Default,Open Sans Semibold,36,&H00FFFFFF,&H000000FF,&H00020713,&H00000000,-1,0,0,0,100,100,0,0,1,1.7,0,4,0,0,28,1 [Events] -Format: Layer, Start, End, Style, Name, Text -Dialogue: 0,0:00:00.00,0:00:01.23,Default,Olly,{\pos(150,50.5)}Default layer. -Dialogue: ,0:00:02.34,0:00:03.45,Default,Olly,{\pos(150,50.5)}Layer positive. -Dialogue: a,0:00:13:56,0:00:15:90,Default,Olly,{\pos(150,50.5)}Layer negative. \ No newline at end of file +Format: Layer, Start, End, Name, Text +Dialogue: ,0:00:00.00,0:00:01.23,Olly,Blank layer. +Dialogue: a,0:00:02.34,0:00:03.45,Olly,Non-numeric layer. +Dialogue: 1.1,0:00:04.56,0:00:05.67,Olly,Non-integer layer. diff --git a/libraries/test_data/src/test/assets/media/ssa/layer b/libraries/test_data/src/test/assets/media/ssa/layer index 17d6d64df01..1a12ff1a3a3 100644 --- a/libraries/test_data/src/test/assets/media/ssa/layer +++ b/libraries/test_data/src/test/assets/media/ssa/layer @@ -1,15 +1,7 @@ [Script Info] Title: SomeTitle -PlayResX: 300 -PlayResY: 202 - -[V4+ Styles] -! Alignment is set to 4 - i.e. middle-left -Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding -Style: Default,Open Sans Semibold,36,&H00FFFFFF,&H000000FF,&H00020713,&H00000000,-1,0,0,0,100,100,0,0,1,1.7,0,4,0,0,28,1 [Events] Format: Layer, Start, End, Style, Name, Text -Dialogue: 0,0:00:00.00,0:00:01.23,Default,Olly,{\pos(150,50.5)}Default layer. -Dialogue: 1,0:00:02.34,0:00:03.45,Default,Olly,{\pos(150,50.5)}Layer positive. -Dialogue: -1,0:00:13:56,0:00:15:90,Default,Olly,{\pos(150,50.5)}Layer negative. \ No newline at end of file +Dialogue: 1,0:00:02.34,0:00:03.45,Default,Olly,Layer positive. +Dialogue: -1,0:00:13:56,0:00:15:90,Default,Olly,Layer negative. From a49404c6693189e89e7e3c38760a70a36c31ddd8 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 15:37:42 +0100 Subject: [PATCH 08/14] Add SSA playback test with overlapping cues with different layers --- .../exoplayer/e2etest/SsaPlaybackTest.java | 92 + .../ssa/overlapping_cues_different_layers | 7 + .../overlapping_cues_different_layers.dump | 3091 +++++++++++++++++ 3 files changed, 3190 insertions(+) create mode 100644 libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/SsaPlaybackTest.java create mode 100644 libraries/test_data/src/test/assets/media/ssa/overlapping_cues_different_layers create mode 100644 libraries/test_data/src/test/assets/playbackdumps/ssa/overlapping_cues_different_layers.dump diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/SsaPlaybackTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/SsaPlaybackTest.java new file mode 100644 index 00000000000..47fb38c0fed --- /dev/null +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/SsaPlaybackTest.java @@ -0,0 +1,92 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.media3.exoplayer.e2etest; + +import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.view.Surface; +import androidx.media3.common.C; +import androidx.media3.common.MediaItem; +import androidx.media3.common.MimeTypes; +import androidx.media3.common.Player; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.test.utils.CapturingRenderersFactory; +import androidx.media3.test.utils.DumpFileAsserts; +import androidx.media3.test.utils.FakeClock; +import androidx.media3.test.utils.robolectric.PlaybackOutput; +import androidx.media3.test.utils.robolectric.ShadowMediaCodecConfig; +import androidx.test.core.app.ApplicationProvider; +import com.google.common.collect.ImmutableList; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.ParameterizedRobolectricTestRunner; + +/** End-to-end tests using side-loaded SSA subtitles. */ +@RunWith(ParameterizedRobolectricTestRunner.class) +public class SsaPlaybackTest { + @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") + public static ImmutableList mediaSamples() { + return ImmutableList.of("overlapping_cues_different_layers"); + } + + @ParameterizedRobolectricTestRunner.Parameter public String inputFile; + + @Rule + public ShadowMediaCodecConfig mediaCodecConfig = + ShadowMediaCodecConfig.withAllDefaultSupportedCodecs(); + + @Test + public void test() throws Exception { + Context applicationContext = ApplicationProvider.getApplicationContext(); + CapturingRenderersFactory capturingRenderersFactory = + new CapturingRenderersFactory(applicationContext); + ExoPlayer player = + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) + .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .build(); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); + PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri("asset:///media/mp4/preroll-5s.mp4") + .setSubtitleConfigurations( + ImmutableList.of( + new MediaItem.SubtitleConfiguration.Builder( + Uri.parse("asset:///media/ssa/" + inputFile)) + .setMimeType(MimeTypes.TEXT_SSA) + .setLanguage("en") + .setSelectionFlags(C.SELECTION_FLAG_DEFAULT) + .build())) + .build(); + + player.setMediaItem(mediaItem); + player.prepare(); + advance(player).untilState(Player.STATE_READY); + advance(player).untilFullyBuffered(); + player.play(); + advance(player).untilState(Player.STATE_ENDED); + player.release(); + surface.release(); + + DumpFileAsserts.assertOutput( + applicationContext, playbackOutput, "playbackdumps/ssa/" + inputFile + ".dump"); + } +} diff --git a/libraries/test_data/src/test/assets/media/ssa/overlapping_cues_different_layers b/libraries/test_data/src/test/assets/media/ssa/overlapping_cues_different_layers new file mode 100644 index 00000000000..2d07c3114e5 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/ssa/overlapping_cues_different_layers @@ -0,0 +1,7 @@ +[Script Info] +Title: SomeTitle + +[Events] +Format: Layer, Start, End, Text +Dialogue: 2,0:00:01.00,0:00:04.23,First subtitle - end overlaps second +Dialogue: 1,0:00:02.00,0:00:05.23,Second subtitle - beginning overlaps first diff --git a/libraries/test_data/src/test/assets/playbackdumps/ssa/overlapping_cues_different_layers.dump b/libraries/test_data/src/test/assets/playbackdumps/ssa/overlapping_cues_different_layers.dump new file mode 100644 index 00000000000..c4157f9e788 --- /dev/null +++ b/libraries/test_data/src/test/assets/playbackdumps/ssa/overlapping_cues_different_layers.dump @@ -0,0 +1,3091 @@ +MediaCodecAdapter (media3.audio.aac): + inputBuffers: + count = 218 + input buffer #0: + timeUs = 1000000000000 + contents = length 21, hash D57A2CCC + input buffer #1: + timeUs = 1000000023219 + contents = length 4, hash EE9DF + input buffer #2: + timeUs = 1000000046439 + contents = length 4, hash EE9DF + input buffer #3: + timeUs = 1000000069659 + contents = length 4, hash EE9DF + input buffer #4: + timeUs = 1000000092879 + contents = length 4, hash EE9DF + input buffer #5: + timeUs = 1000000116099 + contents = length 4, hash EE9DF + input buffer #6: + timeUs = 1000000139319 + contents = length 4, hash EE9DF + input buffer #7: + timeUs = 1000000162539 + contents = length 4, hash EE9DF + input buffer #8: + timeUs = 1000000185759 + contents = length 4, hash EE9DF + input buffer #9: + timeUs = 1000000208979 + contents = length 4, hash EE9DF + input buffer #10: + timeUs = 1000000232199 + contents = length 4, hash EE9DF + input buffer #11: + timeUs = 1000000255419 + contents = length 4, hash EE9DF + input buffer #12: + timeUs = 1000000278639 + contents = length 4, hash EE9DF + input buffer #13: + timeUs = 1000000301859 + contents = length 4, hash EE9DF + input buffer #14: + timeUs = 1000000325079 + contents = length 4, hash EE9DF + input buffer #15: + timeUs = 1000000348299 + contents = length 4, hash EE9DF + input buffer #16: + timeUs = 1000000371519 + contents = length 4, hash EE9DF + input buffer #17: + timeUs = 1000000394739 + contents = length 4, hash EE9DF + input buffer #18: + timeUs = 1000000417959 + contents = length 4, hash EE9DF + input buffer #19: + timeUs = 1000000441179 + contents = length 4, hash EE9DF + input buffer #20: + timeUs = 1000000464399 + contents = length 4, hash EE9DF + input buffer #21: + timeUs = 1000000487619 + contents = length 4, hash EE9DF + input buffer #22: + timeUs = 1000000510839 + contents = length 4, hash EE9DF + input buffer #23: + timeUs = 1000000534058 + contents = length 4, hash EE9DF + input buffer #24: + timeUs = 1000000557278 + contents = length 4, hash EE9DF + input buffer #25: + timeUs = 1000000580498 + contents = length 4, hash EE9DF + input buffer #26: + timeUs = 1000000603718 + contents = length 4, hash EE9DF + input buffer #27: + timeUs = 1000000626938 + contents = length 4, hash EE9DF + input buffer #28: + timeUs = 1000000650158 + contents = length 4, hash EE9DF + input buffer #29: + timeUs = 1000000673378 + contents = length 4, hash EE9DF + input buffer #30: + timeUs = 1000000696598 + contents = length 4, hash EE9DF + input buffer #31: + timeUs = 1000000719818 + contents = length 4, hash EE9DF + input buffer #32: + timeUs = 1000000743038 + contents = length 4, hash EE9DF + input buffer #33: + timeUs = 1000000766258 + contents = length 4, hash EE9DF + input buffer #34: + timeUs = 1000000789478 + contents = length 4, hash EE9DF + input buffer #35: + timeUs = 1000000812698 + contents = length 4, hash EE9DF + input buffer #36: + timeUs = 1000000835918 + contents = length 4, hash EE9DF + input buffer #37: + timeUs = 1000000859138 + contents = length 4, hash EE9DF + input buffer #38: + timeUs = 1000000882358 + contents = length 4, hash EE9DF + input buffer #39: + timeUs = 1000000905578 + contents = length 4, hash EE9DF + input buffer #40: + timeUs = 1000000928798 + contents = length 4, hash EE9DF + input buffer #41: + timeUs = 1000000952018 + contents = length 4, hash EE9DF + input buffer #42: + timeUs = 1000000975238 + contents = length 4, hash EE9DF + input buffer #43: + timeUs = 1000000998458 + contents = length 4, hash EE9DF + input buffer #44: + timeUs = 1000001021678 + contents = length 4, hash EE9DF + input buffer #45: + timeUs = 1000001044897 + contents = length 4, hash EE9DF + input buffer #46: + timeUs = 1000001068117 + contents = length 4, hash EE9DF + input buffer #47: + timeUs = 1000001091337 + contents = length 4, hash EE9DF + input buffer #48: + timeUs = 1000001114557 + contents = length 4, hash EE9DF + input buffer #49: + timeUs = 1000001137777 + contents = length 4, hash EE9DF + input buffer #50: + timeUs = 1000001160997 + contents = length 4, hash EE9DF + input buffer #51: + timeUs = 1000001184217 + contents = length 4, hash EE9DF + input buffer #52: + timeUs = 1000001207437 + contents = length 4, hash EE9DF + input buffer #53: + timeUs = 1000001230657 + contents = length 4, hash EE9DF + input buffer #54: + timeUs = 1000001253877 + contents = length 4, hash EE9DF + input buffer #55: + timeUs = 1000001277097 + contents = length 4, hash EE9DF + input buffer #56: + timeUs = 1000001300317 + contents = length 4, hash EE9DF + input buffer #57: + timeUs = 1000001323537 + contents = length 4, hash EE9DF + input buffer #58: + timeUs = 1000001346757 + contents = length 4, hash EE9DF + input buffer #59: + timeUs = 1000001369977 + contents = length 4, hash EE9DF + input buffer #60: + timeUs = 1000001393197 + contents = length 4, hash EE9DF + input buffer #61: + timeUs = 1000001416417 + contents = length 4, hash EE9DF + input buffer #62: + timeUs = 1000001439637 + contents = length 4, hash EE9DF + input buffer #63: + timeUs = 1000001462857 + contents = length 4, hash EE9DF + input buffer #64: + timeUs = 1000001486077 + contents = length 4, hash EE9DF + input buffer #65: + timeUs = 1000001509297 + contents = length 4, hash EE9DF + input buffer #66: + timeUs = 1000001532517 + contents = length 4, hash EE9DF + input buffer #67: + timeUs = 1000001555736 + contents = length 4, hash EE9DF + input buffer #68: + timeUs = 1000001578956 + contents = length 4, hash EE9DF + input buffer #69: + timeUs = 1000001602176 + contents = length 4, hash EE9DF + input buffer #70: + timeUs = 1000001625396 + contents = length 4, hash EE9DF + input buffer #71: + timeUs = 1000001648616 + contents = length 4, hash EE9DF + input buffer #72: + timeUs = 1000001671836 + contents = length 4, hash EE9DF + input buffer #73: + timeUs = 1000001695056 + contents = length 4, hash EE9DF + input buffer #74: + timeUs = 1000001718276 + contents = length 4, hash EE9DF + input buffer #75: + timeUs = 1000001741496 + contents = length 4, hash EE9DF + input buffer #76: + timeUs = 1000001764716 + contents = length 4, hash EE9DF + input buffer #77: + timeUs = 1000001787936 + contents = length 4, hash EE9DF + input buffer #78: + timeUs = 1000001811156 + contents = length 4, hash EE9DF + input buffer #79: + timeUs = 1000001834376 + contents = length 4, hash EE9DF + input buffer #80: + timeUs = 1000001857596 + contents = length 4, hash EE9DF + input buffer #81: + timeUs = 1000001880816 + contents = length 4, hash EE9DF + input buffer #82: + timeUs = 1000001904036 + contents = length 4, hash EE9DF + input buffer #83: + timeUs = 1000001927256 + contents = length 4, hash EE9DF + input buffer #84: + timeUs = 1000001950476 + contents = length 4, hash EE9DF + input buffer #85: + timeUs = 1000001973696 + contents = length 4, hash EE9DF + input buffer #86: + timeUs = 1000001996916 + contents = length 4, hash EE9DF + input buffer #87: + timeUs = 1000002020136 + contents = length 4, hash EE9DF + input buffer #88: + timeUs = 1000002043356 + contents = length 4, hash EE9DF + input buffer #89: + timeUs = 1000002066575 + contents = length 4, hash EE9DF + input buffer #90: + timeUs = 1000002089795 + contents = length 4, hash EE9DF + input buffer #91: + timeUs = 1000002113015 + contents = length 4, hash EE9DF + input buffer #92: + timeUs = 1000002136235 + contents = length 4, hash EE9DF + input buffer #93: + timeUs = 1000002159455 + contents = length 4, hash EE9DF + input buffer #94: + timeUs = 1000002182675 + contents = length 4, hash EE9DF + input buffer #95: + timeUs = 1000002205895 + contents = length 4, hash EE9DF + input buffer #96: + timeUs = 1000002229115 + contents = length 4, hash EE9DF + input buffer #97: + timeUs = 1000002252335 + contents = length 4, hash EE9DF + input buffer #98: + timeUs = 1000002275555 + contents = length 4, hash EE9DF + input buffer #99: + timeUs = 1000002298775 + contents = length 4, hash EE9DF + input buffer #100: + timeUs = 1000002321995 + contents = length 4, hash EE9DF + input buffer #101: + timeUs = 1000002345215 + contents = length 4, hash EE9DF + input buffer #102: + timeUs = 1000002368435 + contents = length 4, hash EE9DF + input buffer #103: + timeUs = 1000002391655 + contents = length 4, hash EE9DF + input buffer #104: + timeUs = 1000002414875 + contents = length 4, hash EE9DF + input buffer #105: + timeUs = 1000002438095 + contents = length 4, hash EE9DF + input buffer #106: + timeUs = 1000002461315 + contents = length 4, hash EE9DF + input buffer #107: + timeUs = 1000002484535 + contents = length 4, hash EE9DF + input buffer #108: + timeUs = 1000002507755 + contents = length 4, hash EE9DF + input buffer #109: + timeUs = 1000002530975 + contents = length 4, hash EE9DF + input buffer #110: + timeUs = 1000002554195 + contents = length 4, hash EE9DF + input buffer #111: + timeUs = 1000002577414 + contents = length 4, hash EE9DF + input buffer #112: + timeUs = 1000002600634 + contents = length 4, hash EE9DF + input buffer #113: + timeUs = 1000002623854 + contents = length 4, hash EE9DF + input buffer #114: + timeUs = 1000002647074 + contents = length 4, hash EE9DF + input buffer #115: + timeUs = 1000002670294 + contents = length 4, hash EE9DF + input buffer #116: + timeUs = 1000002693514 + contents = length 4, hash EE9DF + input buffer #117: + timeUs = 1000002716734 + contents = length 4, hash EE9DF + input buffer #118: + timeUs = 1000002739954 + contents = length 4, hash EE9DF + input buffer #119: + timeUs = 1000002763174 + contents = length 4, hash EE9DF + input buffer #120: + timeUs = 1000002786394 + contents = length 4, hash EE9DF + input buffer #121: + timeUs = 1000002809614 + contents = length 4, hash EE9DF + input buffer #122: + timeUs = 1000002832834 + contents = length 4, hash EE9DF + input buffer #123: + timeUs = 1000002856054 + contents = length 4, hash EE9DF + input buffer #124: + timeUs = 1000002879274 + contents = length 4, hash EE9DF + input buffer #125: + timeUs = 1000002902494 + contents = length 4, hash EE9DF + input buffer #126: + timeUs = 1000002925714 + contents = length 4, hash EE9DF + input buffer #127: + timeUs = 1000002948934 + contents = length 4, hash EE9DF + input buffer #128: + timeUs = 1000002972154 + contents = length 4, hash EE9DF + input buffer #129: + timeUs = 1000002995374 + contents = length 4, hash EE9DF + input buffer #130: + timeUs = 1000003018594 + contents = length 4, hash EE9DF + input buffer #131: + timeUs = 1000003041814 + contents = length 4, hash EE9DF + input buffer #132: + timeUs = 1000003065034 + contents = length 4, hash EE9DF + input buffer #133: + timeUs = 1000003088253 + contents = length 4, hash EE9DF + input buffer #134: + timeUs = 1000003111473 + contents = length 4, hash EE9DF + input buffer #135: + timeUs = 1000003134693 + contents = length 4, hash EE9DF + input buffer #136: + timeUs = 1000003157913 + contents = length 4, hash EE9DF + input buffer #137: + timeUs = 1000003181133 + contents = length 4, hash EE9DF + input buffer #138: + timeUs = 1000003204353 + contents = length 4, hash EE9DF + input buffer #139: + timeUs = 1000003227573 + contents = length 4, hash EE9DF + input buffer #140: + timeUs = 1000003250793 + contents = length 4, hash EE9DF + input buffer #141: + timeUs = 1000003274013 + contents = length 4, hash EE9DF + input buffer #142: + timeUs = 1000003297233 + contents = length 4, hash EE9DF + input buffer #143: + timeUs = 1000003320453 + contents = length 4, hash EE9DF + input buffer #144: + timeUs = 1000003343673 + contents = length 4, hash EE9DF + input buffer #145: + timeUs = 1000003366893 + contents = length 4, hash EE9DF + input buffer #146: + timeUs = 1000003390113 + contents = length 4, hash EE9DF + input buffer #147: + timeUs = 1000003413333 + contents = length 4, hash EE9DF + input buffer #148: + timeUs = 1000003436553 + contents = length 4, hash EE9DF + input buffer #149: + timeUs = 1000003459773 + contents = length 4, hash EE9DF + input buffer #150: + timeUs = 1000003482993 + contents = length 4, hash EE9DF + input buffer #151: + timeUs = 1000003506213 + contents = length 4, hash EE9DF + input buffer #152: + timeUs = 1000003529433 + contents = length 4, hash EE9DF + input buffer #153: + timeUs = 1000003552653 + contents = length 4, hash EE9DF + input buffer #154: + timeUs = 1000003575873 + contents = length 4, hash EE9DF + input buffer #155: + timeUs = 1000003599092 + contents = length 4, hash EE9DF + input buffer #156: + timeUs = 1000003622312 + contents = length 4, hash EE9DF + input buffer #157: + timeUs = 1000003645532 + contents = length 4, hash EE9DF + input buffer #158: + timeUs = 1000003668752 + contents = length 4, hash EE9DF + input buffer #159: + timeUs = 1000003691972 + contents = length 4, hash EE9DF + input buffer #160: + timeUs = 1000003715192 + contents = length 4, hash EE9DF + input buffer #161: + timeUs = 1000003738412 + contents = length 4, hash EE9DF + input buffer #162: + timeUs = 1000003761632 + contents = length 4, hash EE9DF + input buffer #163: + timeUs = 1000003784852 + contents = length 4, hash EE9DF + input buffer #164: + timeUs = 1000003808072 + contents = length 4, hash EE9DF + input buffer #165: + timeUs = 1000003831292 + contents = length 4, hash EE9DF + input buffer #166: + timeUs = 1000003854512 + contents = length 4, hash EE9DF + input buffer #167: + timeUs = 1000003877732 + contents = length 4, hash EE9DF + input buffer #168: + timeUs = 1000003900952 + contents = length 4, hash EE9DF + input buffer #169: + timeUs = 1000003924172 + contents = length 4, hash EE9DF + input buffer #170: + timeUs = 1000003947392 + contents = length 4, hash EE9DF + input buffer #171: + timeUs = 1000003970612 + contents = length 4, hash EE9DF + input buffer #172: + timeUs = 1000003993832 + contents = length 4, hash EE9DF + input buffer #173: + timeUs = 1000004017052 + contents = length 4, hash EE9DF + input buffer #174: + timeUs = 1000004040272 + contents = length 4, hash EE9DF + input buffer #175: + timeUs = 1000004063492 + contents = length 4, hash EE9DF + input buffer #176: + timeUs = 1000004086712 + contents = length 4, hash EE9DF + input buffer #177: + timeUs = 1000004109931 + contents = length 4, hash EE9DF + input buffer #178: + timeUs = 1000004133151 + contents = length 4, hash EE9DF + input buffer #179: + timeUs = 1000004156371 + contents = length 4, hash EE9DF + input buffer #180: + timeUs = 1000004179591 + contents = length 4, hash EE9DF + input buffer #181: + timeUs = 1000004202811 + contents = length 4, hash EE9DF + input buffer #182: + timeUs = 1000004226031 + contents = length 4, hash EE9DF + input buffer #183: + timeUs = 1000004249251 + contents = length 4, hash EE9DF + input buffer #184: + timeUs = 1000004272471 + contents = length 4, hash EE9DF + input buffer #185: + timeUs = 1000004295691 + contents = length 4, hash EE9DF + input buffer #186: + timeUs = 1000004318911 + contents = length 4, hash EE9DF + input buffer #187: + timeUs = 1000004342131 + contents = length 4, hash EE9DF + input buffer #188: + timeUs = 1000004365351 + contents = length 4, hash EE9DF + input buffer #189: + timeUs = 1000004388571 + contents = length 4, hash EE9DF + input buffer #190: + timeUs = 1000004411791 + contents = length 4, hash EE9DF + input buffer #191: + timeUs = 1000004435011 + contents = length 4, hash EE9DF + input buffer #192: + timeUs = 1000004458231 + contents = length 4, hash EE9DF + input buffer #193: + timeUs = 1000004481451 + contents = length 4, hash EE9DF + input buffer #194: + timeUs = 1000004504671 + contents = length 4, hash EE9DF + input buffer #195: + timeUs = 1000004527891 + contents = length 4, hash EE9DF + input buffer #196: + timeUs = 1000004551111 + contents = length 4, hash EE9DF + input buffer #197: + timeUs = 1000004574331 + contents = length 4, hash EE9DF + input buffer #198: + timeUs = 1000004597551 + contents = length 4, hash EE9DF + input buffer #199: + timeUs = 1000004620770 + contents = length 4, hash EE9DF + input buffer #200: + timeUs = 1000004643990 + contents = length 4, hash EE9DF + input buffer #201: + timeUs = 1000004667210 + contents = length 4, hash EE9DF + input buffer #202: + timeUs = 1000004690430 + contents = length 4, hash EE9DF + input buffer #203: + timeUs = 1000004713650 + contents = length 4, hash EE9DF + input buffer #204: + timeUs = 1000004736870 + contents = length 4, hash EE9DF + input buffer #205: + timeUs = 1000004760090 + contents = length 4, hash EE9DF + input buffer #206: + timeUs = 1000004783310 + contents = length 4, hash EE9DF + input buffer #207: + timeUs = 1000004806530 + contents = length 4, hash EE9DF + input buffer #208: + timeUs = 1000004829750 + contents = length 4, hash EE9DF + input buffer #209: + timeUs = 1000004852970 + contents = length 4, hash EE9DF + input buffer #210: + timeUs = 1000004876190 + contents = length 4, hash EE9DF + input buffer #211: + timeUs = 1000004899410 + contents = length 4, hash EE9DF + input buffer #212: + timeUs = 1000004922630 + contents = length 4, hash EE9DF + input buffer #213: + timeUs = 1000004945850 + contents = length 4, hash EE9DF + input buffer #214: + timeUs = 1000004969070 + contents = length 4, hash EE9DF + input buffer #215: + timeUs = 1000004992290 + contents = length 4, hash EE9DF + input buffer #216: + timeUs = 1000005015510 + contents = length 4, hash EE9DF + input buffer #217: + timeUs = 0 + flags = 4 + contents = length 0, hash 1 + outputBuffers: + count = 217 + output buffer #0: + timeUs = 1000000000000 + size = 0 + rendered = false + output buffer #1: + timeUs = 1000000023219 + size = 0 + rendered = false + output buffer #2: + timeUs = 1000000046439 + size = 0 + rendered = false + output buffer #3: + timeUs = 1000000069659 + size = 0 + rendered = false + output buffer #4: + timeUs = 1000000092879 + size = 0 + rendered = false + output buffer #5: + timeUs = 1000000116099 + size = 0 + rendered = false + output buffer #6: + timeUs = 1000000139319 + size = 0 + rendered = false + output buffer #7: + timeUs = 1000000162539 + size = 0 + rendered = false + output buffer #8: + timeUs = 1000000185759 + size = 0 + rendered = false + output buffer #9: + timeUs = 1000000208979 + size = 0 + rendered = false + output buffer #10: + timeUs = 1000000232199 + size = 0 + rendered = false + output buffer #11: + timeUs = 1000000255419 + size = 0 + rendered = false + output buffer #12: + timeUs = 1000000278639 + size = 0 + rendered = false + output buffer #13: + timeUs = 1000000301859 + size = 0 + rendered = false + output buffer #14: + timeUs = 1000000325079 + size = 0 + rendered = false + output buffer #15: + timeUs = 1000000348299 + size = 0 + rendered = false + output buffer #16: + timeUs = 1000000371519 + size = 0 + rendered = false + output buffer #17: + timeUs = 1000000394739 + size = 0 + rendered = false + output buffer #18: + timeUs = 1000000417959 + size = 0 + rendered = false + output buffer #19: + timeUs = 1000000441179 + size = 0 + rendered = false + output buffer #20: + timeUs = 1000000464399 + size = 0 + rendered = false + output buffer #21: + timeUs = 1000000487619 + size = 0 + rendered = false + output buffer #22: + timeUs = 1000000510839 + size = 0 + rendered = false + output buffer #23: + timeUs = 1000000534058 + size = 0 + rendered = false + output buffer #24: + timeUs = 1000000557278 + size = 0 + rendered = false + output buffer #25: + timeUs = 1000000580498 + size = 0 + rendered = false + output buffer #26: + timeUs = 1000000603718 + size = 0 + rendered = false + output buffer #27: + timeUs = 1000000626938 + size = 0 + rendered = false + output buffer #28: + timeUs = 1000000650158 + size = 0 + rendered = false + output buffer #29: + timeUs = 1000000673378 + size = 0 + rendered = false + output buffer #30: + timeUs = 1000000696598 + size = 0 + rendered = false + output buffer #31: + timeUs = 1000000719818 + size = 0 + rendered = false + output buffer #32: + timeUs = 1000000743038 + size = 0 + rendered = false + output buffer #33: + timeUs = 1000000766258 + size = 0 + rendered = false + output buffer #34: + timeUs = 1000000789478 + size = 0 + rendered = false + output buffer #35: + timeUs = 1000000812698 + size = 0 + rendered = false + output buffer #36: + timeUs = 1000000835918 + size = 0 + rendered = false + output buffer #37: + timeUs = 1000000859138 + size = 0 + rendered = false + output buffer #38: + timeUs = 1000000882358 + size = 0 + rendered = false + output buffer #39: + timeUs = 1000000905578 + size = 0 + rendered = false + output buffer #40: + timeUs = 1000000928798 + size = 0 + rendered = false + output buffer #41: + timeUs = 1000000952018 + size = 0 + rendered = false + output buffer #42: + timeUs = 1000000975238 + size = 0 + rendered = false + output buffer #43: + timeUs = 1000000998458 + size = 0 + rendered = false + output buffer #44: + timeUs = 1000001021678 + size = 0 + rendered = false + output buffer #45: + timeUs = 1000001044897 + size = 0 + rendered = false + output buffer #46: + timeUs = 1000001068117 + size = 0 + rendered = false + output buffer #47: + timeUs = 1000001091337 + size = 0 + rendered = false + output buffer #48: + timeUs = 1000001114557 + size = 0 + rendered = false + output buffer #49: + timeUs = 1000001137777 + size = 0 + rendered = false + output buffer #50: + timeUs = 1000001160997 + size = 0 + rendered = false + output buffer #51: + timeUs = 1000001184217 + size = 0 + rendered = false + output buffer #52: + timeUs = 1000001207437 + size = 0 + rendered = false + output buffer #53: + timeUs = 1000001230657 + size = 0 + rendered = false + output buffer #54: + timeUs = 1000001253877 + size = 0 + rendered = false + output buffer #55: + timeUs = 1000001277097 + size = 0 + rendered = false + output buffer #56: + timeUs = 1000001300317 + size = 0 + rendered = false + output buffer #57: + timeUs = 1000001323537 + size = 0 + rendered = false + output buffer #58: + timeUs = 1000001346757 + size = 0 + rendered = false + output buffer #59: + timeUs = 1000001369977 + size = 0 + rendered = false + output buffer #60: + timeUs = 1000001393197 + size = 0 + rendered = false + output buffer #61: + timeUs = 1000001416417 + size = 0 + rendered = false + output buffer #62: + timeUs = 1000001439637 + size = 0 + rendered = false + output buffer #63: + timeUs = 1000001462857 + size = 0 + rendered = false + output buffer #64: + timeUs = 1000001486077 + size = 0 + rendered = false + output buffer #65: + timeUs = 1000001509297 + size = 0 + rendered = false + output buffer #66: + timeUs = 1000001532517 + size = 0 + rendered = false + output buffer #67: + timeUs = 1000001555736 + size = 0 + rendered = false + output buffer #68: + timeUs = 1000001578956 + size = 0 + rendered = false + output buffer #69: + timeUs = 1000001602176 + size = 0 + rendered = false + output buffer #70: + timeUs = 1000001625396 + size = 0 + rendered = false + output buffer #71: + timeUs = 1000001648616 + size = 0 + rendered = false + output buffer #72: + timeUs = 1000001671836 + size = 0 + rendered = false + output buffer #73: + timeUs = 1000001695056 + size = 0 + rendered = false + output buffer #74: + timeUs = 1000001718276 + size = 0 + rendered = false + output buffer #75: + timeUs = 1000001741496 + size = 0 + rendered = false + output buffer #76: + timeUs = 1000001764716 + size = 0 + rendered = false + output buffer #77: + timeUs = 1000001787936 + size = 0 + rendered = false + output buffer #78: + timeUs = 1000001811156 + size = 0 + rendered = false + output buffer #79: + timeUs = 1000001834376 + size = 0 + rendered = false + output buffer #80: + timeUs = 1000001857596 + size = 0 + rendered = false + output buffer #81: + timeUs = 1000001880816 + size = 0 + rendered = false + output buffer #82: + timeUs = 1000001904036 + size = 0 + rendered = false + output buffer #83: + timeUs = 1000001927256 + size = 0 + rendered = false + output buffer #84: + timeUs = 1000001950476 + size = 0 + rendered = false + output buffer #85: + timeUs = 1000001973696 + size = 0 + rendered = false + output buffer #86: + timeUs = 1000001996916 + size = 0 + rendered = false + output buffer #87: + timeUs = 1000002020136 + size = 0 + rendered = false + output buffer #88: + timeUs = 1000002043356 + size = 0 + rendered = false + output buffer #89: + timeUs = 1000002066575 + size = 0 + rendered = false + output buffer #90: + timeUs = 1000002089795 + size = 0 + rendered = false + output buffer #91: + timeUs = 1000002113015 + size = 0 + rendered = false + output buffer #92: + timeUs = 1000002136235 + size = 0 + rendered = false + output buffer #93: + timeUs = 1000002159455 + size = 0 + rendered = false + output buffer #94: + timeUs = 1000002182675 + size = 0 + rendered = false + output buffer #95: + timeUs = 1000002205895 + size = 0 + rendered = false + output buffer #96: + timeUs = 1000002229115 + size = 0 + rendered = false + output buffer #97: + timeUs = 1000002252335 + size = 0 + rendered = false + output buffer #98: + timeUs = 1000002275555 + size = 0 + rendered = false + output buffer #99: + timeUs = 1000002298775 + size = 0 + rendered = false + output buffer #100: + timeUs = 1000002321995 + size = 0 + rendered = false + output buffer #101: + timeUs = 1000002345215 + size = 0 + rendered = false + output buffer #102: + timeUs = 1000002368435 + size = 0 + rendered = false + output buffer #103: + timeUs = 1000002391655 + size = 0 + rendered = false + output buffer #104: + timeUs = 1000002414875 + size = 0 + rendered = false + output buffer #105: + timeUs = 1000002438095 + size = 0 + rendered = false + output buffer #106: + timeUs = 1000002461315 + size = 0 + rendered = false + output buffer #107: + timeUs = 1000002484535 + size = 0 + rendered = false + output buffer #108: + timeUs = 1000002507755 + size = 0 + rendered = false + output buffer #109: + timeUs = 1000002530975 + size = 0 + rendered = false + output buffer #110: + timeUs = 1000002554195 + size = 0 + rendered = false + output buffer #111: + timeUs = 1000002577414 + size = 0 + rendered = false + output buffer #112: + timeUs = 1000002600634 + size = 0 + rendered = false + output buffer #113: + timeUs = 1000002623854 + size = 0 + rendered = false + output buffer #114: + timeUs = 1000002647074 + size = 0 + rendered = false + output buffer #115: + timeUs = 1000002670294 + size = 0 + rendered = false + output buffer #116: + timeUs = 1000002693514 + size = 0 + rendered = false + output buffer #117: + timeUs = 1000002716734 + size = 0 + rendered = false + output buffer #118: + timeUs = 1000002739954 + size = 0 + rendered = false + output buffer #119: + timeUs = 1000002763174 + size = 0 + rendered = false + output buffer #120: + timeUs = 1000002786394 + size = 0 + rendered = false + output buffer #121: + timeUs = 1000002809614 + size = 0 + rendered = false + output buffer #122: + timeUs = 1000002832834 + size = 0 + rendered = false + output buffer #123: + timeUs = 1000002856054 + size = 0 + rendered = false + output buffer #124: + timeUs = 1000002879274 + size = 0 + rendered = false + output buffer #125: + timeUs = 1000002902494 + size = 0 + rendered = false + output buffer #126: + timeUs = 1000002925714 + size = 0 + rendered = false + output buffer #127: + timeUs = 1000002948934 + size = 0 + rendered = false + output buffer #128: + timeUs = 1000002972154 + size = 0 + rendered = false + output buffer #129: + timeUs = 1000002995374 + size = 0 + rendered = false + output buffer #130: + timeUs = 1000003018594 + size = 0 + rendered = false + output buffer #131: + timeUs = 1000003041814 + size = 0 + rendered = false + output buffer #132: + timeUs = 1000003065034 + size = 0 + rendered = false + output buffer #133: + timeUs = 1000003088253 + size = 0 + rendered = false + output buffer #134: + timeUs = 1000003111473 + size = 0 + rendered = false + output buffer #135: + timeUs = 1000003134693 + size = 0 + rendered = false + output buffer #136: + timeUs = 1000003157913 + size = 0 + rendered = false + output buffer #137: + timeUs = 1000003181133 + size = 0 + rendered = false + output buffer #138: + timeUs = 1000003204353 + size = 0 + rendered = false + output buffer #139: + timeUs = 1000003227573 + size = 0 + rendered = false + output buffer #140: + timeUs = 1000003250793 + size = 0 + rendered = false + output buffer #141: + timeUs = 1000003274013 + size = 0 + rendered = false + output buffer #142: + timeUs = 1000003297233 + size = 0 + rendered = false + output buffer #143: + timeUs = 1000003320453 + size = 0 + rendered = false + output buffer #144: + timeUs = 1000003343673 + size = 0 + rendered = false + output buffer #145: + timeUs = 1000003366893 + size = 0 + rendered = false + output buffer #146: + timeUs = 1000003390113 + size = 0 + rendered = false + output buffer #147: + timeUs = 1000003413333 + size = 0 + rendered = false + output buffer #148: + timeUs = 1000003436553 + size = 0 + rendered = false + output buffer #149: + timeUs = 1000003459773 + size = 0 + rendered = false + output buffer #150: + timeUs = 1000003482993 + size = 0 + rendered = false + output buffer #151: + timeUs = 1000003506213 + size = 0 + rendered = false + output buffer #152: + timeUs = 1000003529433 + size = 0 + rendered = false + output buffer #153: + timeUs = 1000003552653 + size = 0 + rendered = false + output buffer #154: + timeUs = 1000003575873 + size = 0 + rendered = false + output buffer #155: + timeUs = 1000003599092 + size = 0 + rendered = false + output buffer #156: + timeUs = 1000003622312 + size = 0 + rendered = false + output buffer #157: + timeUs = 1000003645532 + size = 0 + rendered = false + output buffer #158: + timeUs = 1000003668752 + size = 0 + rendered = false + output buffer #159: + timeUs = 1000003691972 + size = 0 + rendered = false + output buffer #160: + timeUs = 1000003715192 + size = 0 + rendered = false + output buffer #161: + timeUs = 1000003738412 + size = 0 + rendered = false + output buffer #162: + timeUs = 1000003761632 + size = 0 + rendered = false + output buffer #163: + timeUs = 1000003784852 + size = 0 + rendered = false + output buffer #164: + timeUs = 1000003808072 + size = 0 + rendered = false + output buffer #165: + timeUs = 1000003831292 + size = 0 + rendered = false + output buffer #166: + timeUs = 1000003854512 + size = 0 + rendered = false + output buffer #167: + timeUs = 1000003877732 + size = 0 + rendered = false + output buffer #168: + timeUs = 1000003900952 + size = 0 + rendered = false + output buffer #169: + timeUs = 1000003924172 + size = 0 + rendered = false + output buffer #170: + timeUs = 1000003947392 + size = 0 + rendered = false + output buffer #171: + timeUs = 1000003970612 + size = 0 + rendered = false + output buffer #172: + timeUs = 1000003993832 + size = 0 + rendered = false + output buffer #173: + timeUs = 1000004017052 + size = 0 + rendered = false + output buffer #174: + timeUs = 1000004040272 + size = 0 + rendered = false + output buffer #175: + timeUs = 1000004063492 + size = 0 + rendered = false + output buffer #176: + timeUs = 1000004086712 + size = 0 + rendered = false + output buffer #177: + timeUs = 1000004109931 + size = 0 + rendered = false + output buffer #178: + timeUs = 1000004133151 + size = 0 + rendered = false + output buffer #179: + timeUs = 1000004156371 + size = 0 + rendered = false + output buffer #180: + timeUs = 1000004179591 + size = 0 + rendered = false + output buffer #181: + timeUs = 1000004202811 + size = 0 + rendered = false + output buffer #182: + timeUs = 1000004226031 + size = 0 + rendered = false + output buffer #183: + timeUs = 1000004249251 + size = 0 + rendered = false + output buffer #184: + timeUs = 1000004272471 + size = 0 + rendered = false + output buffer #185: + timeUs = 1000004295691 + size = 0 + rendered = false + output buffer #186: + timeUs = 1000004318911 + size = 0 + rendered = false + output buffer #187: + timeUs = 1000004342131 + size = 0 + rendered = false + output buffer #188: + timeUs = 1000004365351 + size = 0 + rendered = false + output buffer #189: + timeUs = 1000004388571 + size = 0 + rendered = false + output buffer #190: + timeUs = 1000004411791 + size = 0 + rendered = false + output buffer #191: + timeUs = 1000004435011 + size = 0 + rendered = false + output buffer #192: + timeUs = 1000004458231 + size = 0 + rendered = false + output buffer #193: + timeUs = 1000004481451 + size = 0 + rendered = false + output buffer #194: + timeUs = 1000004504671 + size = 0 + rendered = false + output buffer #195: + timeUs = 1000004527891 + size = 0 + rendered = false + output buffer #196: + timeUs = 1000004551111 + size = 0 + rendered = false + output buffer #197: + timeUs = 1000004574331 + size = 0 + rendered = false + output buffer #198: + timeUs = 1000004597551 + size = 0 + rendered = false + output buffer #199: + timeUs = 1000004620770 + size = 0 + rendered = false + output buffer #200: + timeUs = 1000004643990 + size = 0 + rendered = false + output buffer #201: + timeUs = 1000004667210 + size = 0 + rendered = false + output buffer #202: + timeUs = 1000004690430 + size = 0 + rendered = false + output buffer #203: + timeUs = 1000004713650 + size = 0 + rendered = false + output buffer #204: + timeUs = 1000004736870 + size = 0 + rendered = false + output buffer #205: + timeUs = 1000004760090 + size = 0 + rendered = false + output buffer #206: + timeUs = 1000004783310 + size = 0 + rendered = false + output buffer #207: + timeUs = 1000004806530 + size = 0 + rendered = false + output buffer #208: + timeUs = 1000004829750 + size = 0 + rendered = false + output buffer #209: + timeUs = 1000004852970 + size = 0 + rendered = false + output buffer #210: + timeUs = 1000004876190 + size = 0 + rendered = false + output buffer #211: + timeUs = 1000004899410 + size = 0 + rendered = false + output buffer #212: + timeUs = 1000004922630 + size = 0 + rendered = false + output buffer #213: + timeUs = 1000004945850 + size = 0 + rendered = false + output buffer #214: + timeUs = 1000004969070 + size = 0 + rendered = false + output buffer #215: + timeUs = 1000004992290 + size = 0 + rendered = false + output buffer #216: + timeUs = 1000005015510 + size = 0 + rendered = false +MediaCodecAdapter (media3.video.avc): + inputBuffers: + count = 126 + input buffer #0: + timeUs = 1000000000000 + contents = length 5245, hash C090A41E + input buffer #1: + timeUs = 1000000160000 + contents = length 63, hash 5141C80D + input buffer #2: + timeUs = 1000000080000 + contents = length 22, hash A32E59A1 + input buffer #3: + timeUs = 1000000040000 + contents = length 20, hash A09DEAB8 + input buffer #4: + timeUs = 1000000120000 + contents = length 18, hash B64DA059 + input buffer #5: + timeUs = 1000000320000 + contents = length 28, hash FC8EF2BB + input buffer #6: + timeUs = 1000000240000 + contents = length 22, hash BF8A4A9F + input buffer #7: + timeUs = 1000000200000 + contents = length 18, hash D163DF61 + input buffer #8: + timeUs = 1000000280000 + contents = length 18, hash FD82E95 + input buffer #9: + timeUs = 1000000480000 + contents = length 28, hash 44A16E72 + input buffer #10: + timeUs = 1000000400000 + contents = length 22, hash 31C06057 + input buffer #11: + timeUs = 1000000360000 + contents = length 18, hash DC93CC9D + input buffer #12: + timeUs = 1000000440000 + contents = length 18, hash 1B081BD1 + input buffer #13: + timeUs = 1000000640000 + contents = length 28, hash 2700AF + input buffer #14: + timeUs = 1000000560000 + contents = length 22, hash 6D292D94 + input buffer #15: + timeUs = 1000000520000 + contents = length 18, hash D646C05A + input buffer #16: + timeUs = 1000000600000 + contents = length 18, hash 14BB0F8E + input buffer #17: + timeUs = 1000000800000 + contents = length 28, hash 5DE2C2B + input buffer #18: + timeUs = 1000000720000 + contents = length 22, hash 57E81CD0 + input buffer #19: + timeUs = 1000000680000 + contents = length 18, hash E176AD96 + input buffer #20: + timeUs = 1000000760000 + contents = length 18, hash 1FEAFCCA + input buffer #21: + timeUs = 1000000960000 + contents = length 28, hash C163BE68 + input buffer #22: + timeUs = 1000000880000 + contents = length 22, hash B0C92D0B + input buffer #23: + timeUs = 1000000840000 + contents = length 18, hash 3B013BD2 + input buffer #24: + timeUs = 1000000920000 + contents = length 18, hash 79758B06 + input buffer #25: + timeUs = 1000001120000 + contents = length 28, hash F72EB1A3 + input buffer #26: + timeUs = 1000001040000 + contents = length 22, hash 9B881C48 + input buffer #27: + timeUs = 1000001000000 + contents = length 18, hash 4631290E + input buffer #28: + timeUs = 1000001080000 + contents = length 18, hash 84A57842 + input buffer #29: + timeUs = 1000001280000 + contents = length 28, hash E1FCF000 + input buffer #30: + timeUs = 1000001200000 + contents = length 22, hash 359D2D82 + input buffer #31: + timeUs = 1000001160000 + contents = length 18, hash 62DE0FC9 + input buffer #32: + timeUs = 1000001240000 + contents = length 18, hash A1525EFD + input buffer #33: + timeUs = 1000001440000 + contents = length 28, hash 5350E8FA + input buffer #34: + timeUs = 1000001360000 + contents = length 22, hash EE2060DF + input buffer #35: + timeUs = 1000001320000 + contents = length 18, hash 77D95125 + input buffer #36: + timeUs = 1000001400000 + contents = length 18, hash B64DA059 + input buffer #37: + timeUs = 1000001600000 + contents = length 28, hash ED67B37 + input buffer #38: + timeUs = 1000001520000 + contents = length 22, hash 4701711B + input buffer #39: + timeUs = 1000001480000 + contents = length 18, hash D163DF61 + input buffer #40: + timeUs = 1000001560000 + contents = length 18, hash FD82E95 + input buffer #41: + timeUs = 1000001760000 + contents = length 28, hash 44A16E72 + input buffer #42: + timeUs = 1000001680000 + contents = length 22, hash 31C06057 + input buffer #43: + timeUs = 1000001640000 + contents = length 18, hash DC93CC9D + input buffer #44: + timeUs = 1000001720000 + contents = length 18, hash 1B081BD1 + input buffer #45: + timeUs = 1000001920000 + contents = length 28, hash 2700AF + input buffer #46: + timeUs = 1000001840000 + contents = length 22, hash 6D292D94 + input buffer #47: + timeUs = 1000001800000 + contents = length 18, hash D646C05A + input buffer #48: + timeUs = 1000001880000 + contents = length 18, hash 14BB0F8E + input buffer #49: + timeUs = 1000002080000 + contents = length 28, hash 5DE2C2B + input buffer #50: + timeUs = 1000002000000 + contents = length 22, hash 57E81CD0 + input buffer #51: + timeUs = 1000001960000 + contents = length 18, hash E176AD96 + input buffer #52: + timeUs = 1000002040000 + contents = length 18, hash 1FEAFCCA + input buffer #53: + timeUs = 1000002240000 + contents = length 28, hash C163BE68 + input buffer #54: + timeUs = 1000002160000 + contents = length 22, hash B0C92D0B + input buffer #55: + timeUs = 1000002120000 + contents = length 18, hash 3B013BD2 + input buffer #56: + timeUs = 1000002200000 + contents = length 18, hash 79758B06 + input buffer #57: + timeUs = 1000002400000 + contents = length 28, hash F72EB1A3 + input buffer #58: + timeUs = 1000002320000 + contents = length 22, hash 9B881C48 + input buffer #59: + timeUs = 1000002280000 + contents = length 18, hash 4631290E + input buffer #60: + timeUs = 1000002360000 + contents = length 18, hash 84A57842 + input buffer #61: + timeUs = 1000002560000 + contents = length 28, hash E1FCF000 + input buffer #62: + timeUs = 1000002480000 + contents = length 22, hash 359D2D82 + input buffer #63: + timeUs = 1000002440000 + contents = length 18, hash 62DE0FC9 + input buffer #64: + timeUs = 1000002520000 + contents = length 18, hash A1525EFD + input buffer #65: + timeUs = 1000002720000 + contents = length 28, hash 5350E8FA + input buffer #66: + timeUs = 1000002640000 + contents = length 22, hash EE2060DF + input buffer #67: + timeUs = 1000002600000 + contents = length 18, hash 77D95125 + input buffer #68: + timeUs = 1000002680000 + contents = length 18, hash B64DA059 + input buffer #69: + timeUs = 1000002880000 + contents = length 28, hash ED67B37 + input buffer #70: + timeUs = 1000002800000 + contents = length 22, hash 4701711B + input buffer #71: + timeUs = 1000002760000 + contents = length 18, hash D163DF61 + input buffer #72: + timeUs = 1000002840000 + contents = length 18, hash FD82E95 + input buffer #73: + timeUs = 1000003040000 + contents = length 28, hash 44A16E72 + input buffer #74: + timeUs = 1000002960000 + contents = length 22, hash 31C06057 + input buffer #75: + timeUs = 1000002920000 + contents = length 18, hash DC93CC9D + input buffer #76: + timeUs = 1000003000000 + contents = length 18, hash 1B081BD1 + input buffer #77: + timeUs = 1000003200000 + contents = length 28, hash 2700AF + input buffer #78: + timeUs = 1000003120000 + contents = length 22, hash 6D292D94 + input buffer #79: + timeUs = 1000003080000 + contents = length 18, hash D646C05A + input buffer #80: + timeUs = 1000003160000 + contents = length 18, hash 14BB0F8E + input buffer #81: + timeUs = 1000003360000 + contents = length 28, hash 5DE2C2B + input buffer #82: + timeUs = 1000003280000 + contents = length 22, hash 57E81CD0 + input buffer #83: + timeUs = 1000003240000 + contents = length 18, hash E176AD96 + input buffer #84: + timeUs = 1000003320000 + contents = length 18, hash 1FEAFCCA + input buffer #85: + timeUs = 1000003520000 + contents = length 28, hash C163BE68 + input buffer #86: + timeUs = 1000003440000 + contents = length 22, hash B0C92D0B + input buffer #87: + timeUs = 1000003400000 + contents = length 18, hash 3B013BD2 + input buffer #88: + timeUs = 1000003480000 + contents = length 18, hash 79758B06 + input buffer #89: + timeUs = 1000003680000 + contents = length 28, hash F72EB1A3 + input buffer #90: + timeUs = 1000003600000 + contents = length 22, hash 9B881C48 + input buffer #91: + timeUs = 1000003560000 + contents = length 18, hash 4631290E + input buffer #92: + timeUs = 1000003640000 + contents = length 18, hash 84A57842 + input buffer #93: + timeUs = 1000003840000 + contents = length 33, hash AF5CF49E + input buffer #94: + timeUs = 1000003760000 + contents = length 22, hash 359D2D82 + input buffer #95: + timeUs = 1000003720000 + contents = length 18, hash 62DE0FC9 + input buffer #96: + timeUs = 1000003800000 + contents = length 18, hash A1525EFD + input buffer #97: + timeUs = 1000004000000 + contents = length 33, hash F4C6DE46 + input buffer #98: + timeUs = 1000003920000 + contents = length 22, hash EE2060DF + input buffer #99: + timeUs = 1000003880000 + contents = length 18, hash 77D95125 + input buffer #100: + timeUs = 1000003960000 + contents = length 18, hash B64DA059 + input buffer #101: + timeUs = 1000004160000 + contents = length 28, hash ED67B37 + input buffer #102: + timeUs = 1000004080000 + contents = length 22, hash 4701711B + input buffer #103: + timeUs = 1000004040000 + contents = length 18, hash D163DF61 + input buffer #104: + timeUs = 1000004120000 + contents = length 18, hash FD82E95 + input buffer #105: + timeUs = 1000004320000 + contents = length 28, hash 44A16E72 + input buffer #106: + timeUs = 1000004240000 + contents = length 22, hash 31C06057 + input buffer #107: + timeUs = 1000004200000 + contents = length 18, hash DC93CC9D + input buffer #108: + timeUs = 1000004280000 + contents = length 18, hash 1B081BD1 + input buffer #109: + timeUs = 1000004480000 + contents = length 28, hash 2700AF + input buffer #110: + timeUs = 1000004400000 + contents = length 22, hash 6D292D94 + input buffer #111: + timeUs = 1000004360000 + contents = length 18, hash D646C05A + input buffer #112: + timeUs = 1000004440000 + contents = length 18, hash 14BB0F8E + input buffer #113: + timeUs = 1000004640000 + contents = length 27, hash 5292D9E + input buffer #114: + timeUs = 1000004560000 + contents = length 22, hash 57E81CD0 + input buffer #115: + timeUs = 1000004520000 + contents = length 18, hash E176AD96 + input buffer #116: + timeUs = 1000004600000 + contents = length 18, hash 1FEAFCCA + input buffer #117: + timeUs = 1000004800000 + contents = length 26, hash B0CAA4C9 + input buffer #118: + timeUs = 1000004720000 + contents = length 22, hash B0C92D0B + input buffer #119: + timeUs = 1000004680000 + contents = length 18, hash 3B013BD2 + input buffer #120: + timeUs = 1000004760000 + contents = length 18, hash 79758B06 + input buffer #121: + timeUs = 1000004960000 + contents = length 26, hash C63A1445 + input buffer #122: + timeUs = 1000004880000 + contents = length 22, hash 9B881C48 + input buffer #123: + timeUs = 1000004840000 + contents = length 18, hash 4631290E + input buffer #124: + timeUs = 1000004920000 + contents = length 18, hash 84A57842 + input buffer #125: + timeUs = 0 + flags = 4 + contents = length 0, hash 1 + outputBuffers: + count = 125 + output buffer #0: + timeUs = 1000000000000 + size = 5245 + rendered = true + output buffer #1: + timeUs = 1000000160000 + size = 63 + rendered = true + output buffer #2: + timeUs = 1000000080000 + size = 22 + rendered = true + output buffer #3: + timeUs = 1000000040000 + size = 20 + rendered = true + output buffer #4: + timeUs = 1000000120000 + size = 18 + rendered = true + output buffer #5: + timeUs = 1000000320000 + size = 28 + rendered = true + output buffer #6: + timeUs = 1000000240000 + size = 22 + rendered = true + output buffer #7: + timeUs = 1000000200000 + size = 18 + rendered = true + output buffer #8: + timeUs = 1000000280000 + size = 18 + rendered = true + output buffer #9: + timeUs = 1000000480000 + size = 28 + rendered = true + output buffer #10: + timeUs = 1000000400000 + size = 22 + rendered = true + output buffer #11: + timeUs = 1000000360000 + size = 18 + rendered = true + output buffer #12: + timeUs = 1000000440000 + size = 18 + rendered = true + output buffer #13: + timeUs = 1000000640000 + size = 28 + rendered = true + output buffer #14: + timeUs = 1000000560000 + size = 22 + rendered = true + output buffer #15: + timeUs = 1000000520000 + size = 18 + rendered = true + output buffer #16: + timeUs = 1000000600000 + size = 18 + rendered = true + output buffer #17: + timeUs = 1000000800000 + size = 28 + rendered = true + output buffer #18: + timeUs = 1000000720000 + size = 22 + rendered = true + output buffer #19: + timeUs = 1000000680000 + size = 18 + rendered = true + output buffer #20: + timeUs = 1000000760000 + size = 18 + rendered = true + output buffer #21: + timeUs = 1000000960000 + size = 28 + rendered = true + output buffer #22: + timeUs = 1000000880000 + size = 22 + rendered = true + output buffer #23: + timeUs = 1000000840000 + size = 18 + rendered = true + output buffer #24: + timeUs = 1000000920000 + size = 18 + rendered = true + output buffer #25: + timeUs = 1000001120000 + size = 28 + rendered = true + output buffer #26: + timeUs = 1000001040000 + size = 22 + rendered = true + output buffer #27: + timeUs = 1000001000000 + size = 18 + rendered = true + output buffer #28: + timeUs = 1000001080000 + size = 18 + rendered = true + output buffer #29: + timeUs = 1000001280000 + size = 28 + rendered = true + output buffer #30: + timeUs = 1000001200000 + size = 22 + rendered = true + output buffer #31: + timeUs = 1000001160000 + size = 18 + rendered = true + output buffer #32: + timeUs = 1000001240000 + size = 18 + rendered = true + output buffer #33: + timeUs = 1000001440000 + size = 28 + rendered = true + output buffer #34: + timeUs = 1000001360000 + size = 22 + rendered = true + output buffer #35: + timeUs = 1000001320000 + size = 18 + rendered = true + output buffer #36: + timeUs = 1000001400000 + size = 18 + rendered = true + output buffer #37: + timeUs = 1000001600000 + size = 28 + rendered = true + output buffer #38: + timeUs = 1000001520000 + size = 22 + rendered = true + output buffer #39: + timeUs = 1000001480000 + size = 18 + rendered = true + output buffer #40: + timeUs = 1000001560000 + size = 18 + rendered = true + output buffer #41: + timeUs = 1000001760000 + size = 28 + rendered = true + output buffer #42: + timeUs = 1000001680000 + size = 22 + rendered = true + output buffer #43: + timeUs = 1000001640000 + size = 18 + rendered = true + output buffer #44: + timeUs = 1000001720000 + size = 18 + rendered = true + output buffer #45: + timeUs = 1000001920000 + size = 28 + rendered = true + output buffer #46: + timeUs = 1000001840000 + size = 22 + rendered = true + output buffer #47: + timeUs = 1000001800000 + size = 18 + rendered = true + output buffer #48: + timeUs = 1000001880000 + size = 18 + rendered = true + output buffer #49: + timeUs = 1000002080000 + size = 28 + rendered = true + output buffer #50: + timeUs = 1000002000000 + size = 22 + rendered = true + output buffer #51: + timeUs = 1000001960000 + size = 18 + rendered = true + output buffer #52: + timeUs = 1000002040000 + size = 18 + rendered = true + output buffer #53: + timeUs = 1000002240000 + size = 28 + rendered = true + output buffer #54: + timeUs = 1000002160000 + size = 22 + rendered = true + output buffer #55: + timeUs = 1000002120000 + size = 18 + rendered = true + output buffer #56: + timeUs = 1000002200000 + size = 18 + rendered = true + output buffer #57: + timeUs = 1000002400000 + size = 28 + rendered = true + output buffer #58: + timeUs = 1000002320000 + size = 22 + rendered = true + output buffer #59: + timeUs = 1000002280000 + size = 18 + rendered = true + output buffer #60: + timeUs = 1000002360000 + size = 18 + rendered = true + output buffer #61: + timeUs = 1000002560000 + size = 28 + rendered = true + output buffer #62: + timeUs = 1000002480000 + size = 22 + rendered = true + output buffer #63: + timeUs = 1000002440000 + size = 18 + rendered = true + output buffer #64: + timeUs = 1000002520000 + size = 18 + rendered = true + output buffer #65: + timeUs = 1000002720000 + size = 28 + rendered = true + output buffer #66: + timeUs = 1000002640000 + size = 22 + rendered = true + output buffer #67: + timeUs = 1000002600000 + size = 18 + rendered = true + output buffer #68: + timeUs = 1000002680000 + size = 18 + rendered = true + output buffer #69: + timeUs = 1000002880000 + size = 28 + rendered = true + output buffer #70: + timeUs = 1000002800000 + size = 22 + rendered = true + output buffer #71: + timeUs = 1000002760000 + size = 18 + rendered = true + output buffer #72: + timeUs = 1000002840000 + size = 18 + rendered = true + output buffer #73: + timeUs = 1000003040000 + size = 28 + rendered = true + output buffer #74: + timeUs = 1000002960000 + size = 22 + rendered = true + output buffer #75: + timeUs = 1000002920000 + size = 18 + rendered = true + output buffer #76: + timeUs = 1000003000000 + size = 18 + rendered = true + output buffer #77: + timeUs = 1000003200000 + size = 28 + rendered = true + output buffer #78: + timeUs = 1000003120000 + size = 22 + rendered = true + output buffer #79: + timeUs = 1000003080000 + size = 18 + rendered = true + output buffer #80: + timeUs = 1000003160000 + size = 18 + rendered = true + output buffer #81: + timeUs = 1000003360000 + size = 28 + rendered = true + output buffer #82: + timeUs = 1000003280000 + size = 22 + rendered = true + output buffer #83: + timeUs = 1000003240000 + size = 18 + rendered = true + output buffer #84: + timeUs = 1000003320000 + size = 18 + rendered = true + output buffer #85: + timeUs = 1000003520000 + size = 28 + rendered = true + output buffer #86: + timeUs = 1000003440000 + size = 22 + rendered = true + output buffer #87: + timeUs = 1000003400000 + size = 18 + rendered = true + output buffer #88: + timeUs = 1000003480000 + size = 18 + rendered = true + output buffer #89: + timeUs = 1000003680000 + size = 28 + rendered = true + output buffer #90: + timeUs = 1000003600000 + size = 22 + rendered = true + output buffer #91: + timeUs = 1000003560000 + size = 18 + rendered = true + output buffer #92: + timeUs = 1000003640000 + size = 18 + rendered = true + output buffer #93: + timeUs = 1000003840000 + size = 33 + rendered = true + output buffer #94: + timeUs = 1000003760000 + size = 22 + rendered = true + output buffer #95: + timeUs = 1000003720000 + size = 18 + rendered = true + output buffer #96: + timeUs = 1000003800000 + size = 18 + rendered = true + output buffer #97: + timeUs = 1000004000000 + size = 33 + rendered = true + output buffer #98: + timeUs = 1000003920000 + size = 22 + rendered = true + output buffer #99: + timeUs = 1000003880000 + size = 18 + rendered = true + output buffer #100: + timeUs = 1000003960000 + size = 18 + rendered = true + output buffer #101: + timeUs = 1000004160000 + size = 28 + rendered = true + output buffer #102: + timeUs = 1000004080000 + size = 22 + rendered = true + output buffer #103: + timeUs = 1000004040000 + size = 18 + rendered = true + output buffer #104: + timeUs = 1000004120000 + size = 18 + rendered = true + output buffer #105: + timeUs = 1000004320000 + size = 28 + rendered = true + output buffer #106: + timeUs = 1000004240000 + size = 22 + rendered = true + output buffer #107: + timeUs = 1000004200000 + size = 18 + rendered = true + output buffer #108: + timeUs = 1000004280000 + size = 18 + rendered = true + output buffer #109: + timeUs = 1000004480000 + size = 28 + rendered = true + output buffer #110: + timeUs = 1000004400000 + size = 22 + rendered = true + output buffer #111: + timeUs = 1000004360000 + size = 18 + rendered = true + output buffer #112: + timeUs = 1000004440000 + size = 18 + rendered = true + output buffer #113: + timeUs = 1000004640000 + size = 27 + rendered = true + output buffer #114: + timeUs = 1000004560000 + size = 22 + rendered = true + output buffer #115: + timeUs = 1000004520000 + size = 18 + rendered = true + output buffer #116: + timeUs = 1000004600000 + size = 18 + rendered = true + output buffer #117: + timeUs = 1000004800000 + size = 26 + rendered = true + output buffer #118: + timeUs = 1000004720000 + size = 22 + rendered = true + output buffer #119: + timeUs = 1000004680000 + size = 18 + rendered = true + output buffer #120: + timeUs = 1000004760000 + size = 18 + rendered = true + output buffer #121: + timeUs = 1000004960000 + size = 26 + rendered = true + output buffer #122: + timeUs = 1000004880000 + size = 22 + rendered = true + output buffer #123: + timeUs = 1000004840000 + size = 18 + rendered = true + output buffer #124: + timeUs = 1000004920000 + size = 18 + rendered = true +AudioSink: + buffer count = 217 + config: + pcmEncoding = 2 + channelCount = 1 + sampleRate = 44100 + buffer #0: + time = 1000000000000 + data = empty + buffer #1: + time = 1000000023219 + data = empty + buffer #2: + time = 1000000046439 + data = empty + buffer #3: + time = 1000000069659 + data = empty + buffer #4: + time = 1000000092879 + data = empty + buffer #5: + time = 1000000116099 + data = empty + buffer #6: + time = 1000000139319 + data = empty + buffer #7: + time = 1000000162539 + data = empty + buffer #8: + time = 1000000185759 + data = empty + buffer #9: + time = 1000000208979 + data = empty + buffer #10: + time = 1000000232199 + data = empty + buffer #11: + time = 1000000255419 + data = empty + buffer #12: + time = 1000000278639 + data = empty + buffer #13: + time = 1000000301859 + data = empty + buffer #14: + time = 1000000325079 + data = empty + buffer #15: + time = 1000000348299 + data = empty + buffer #16: + time = 1000000371519 + data = empty + buffer #17: + time = 1000000394739 + data = empty + buffer #18: + time = 1000000417959 + data = empty + buffer #19: + time = 1000000441179 + data = empty + buffer #20: + time = 1000000464399 + data = empty + buffer #21: + time = 1000000487619 + data = empty + buffer #22: + time = 1000000510839 + data = empty + buffer #23: + time = 1000000534058 + data = empty + buffer #24: + time = 1000000557278 + data = empty + buffer #25: + time = 1000000580498 + data = empty + buffer #26: + time = 1000000603718 + data = empty + buffer #27: + time = 1000000626938 + data = empty + buffer #28: + time = 1000000650158 + data = empty + buffer #29: + time = 1000000673378 + data = empty + buffer #30: + time = 1000000696598 + data = empty + buffer #31: + time = 1000000719818 + data = empty + buffer #32: + time = 1000000743038 + data = empty + buffer #33: + time = 1000000766258 + data = empty + buffer #34: + time = 1000000789478 + data = empty + buffer #35: + time = 1000000812698 + data = empty + buffer #36: + time = 1000000835918 + data = empty + buffer #37: + time = 1000000859138 + data = empty + buffer #38: + time = 1000000882358 + data = empty + buffer #39: + time = 1000000905578 + data = empty + buffer #40: + time = 1000000928798 + data = empty + buffer #41: + time = 1000000952018 + data = empty + buffer #42: + time = 1000000975238 + data = empty + buffer #43: + time = 1000000998458 + data = empty + buffer #44: + time = 1000001021678 + data = empty + buffer #45: + time = 1000001044897 + data = empty + buffer #46: + time = 1000001068117 + data = empty + buffer #47: + time = 1000001091337 + data = empty + buffer #48: + time = 1000001114557 + data = empty + buffer #49: + time = 1000001137777 + data = empty + buffer #50: + time = 1000001160997 + data = empty + buffer #51: + time = 1000001184217 + data = empty + buffer #52: + time = 1000001207437 + data = empty + buffer #53: + time = 1000001230657 + data = empty + buffer #54: + time = 1000001253877 + data = empty + buffer #55: + time = 1000001277097 + data = empty + buffer #56: + time = 1000001300317 + data = empty + buffer #57: + time = 1000001323537 + data = empty + buffer #58: + time = 1000001346757 + data = empty + buffer #59: + time = 1000001369977 + data = empty + buffer #60: + time = 1000001393197 + data = empty + buffer #61: + time = 1000001416417 + data = empty + buffer #62: + time = 1000001439637 + data = empty + buffer #63: + time = 1000001462857 + data = empty + buffer #64: + time = 1000001486077 + data = empty + buffer #65: + time = 1000001509297 + data = empty + buffer #66: + time = 1000001532517 + data = empty + buffer #67: + time = 1000001555736 + data = empty + buffer #68: + time = 1000001578956 + data = empty + buffer #69: + time = 1000001602176 + data = empty + buffer #70: + time = 1000001625396 + data = empty + buffer #71: + time = 1000001648616 + data = empty + buffer #72: + time = 1000001671836 + data = empty + buffer #73: + time = 1000001695056 + data = empty + buffer #74: + time = 1000001718276 + data = empty + buffer #75: + time = 1000001741496 + data = empty + buffer #76: + time = 1000001764716 + data = empty + buffer #77: + time = 1000001787936 + data = empty + buffer #78: + time = 1000001811156 + data = empty + buffer #79: + time = 1000001834376 + data = empty + buffer #80: + time = 1000001857596 + data = empty + buffer #81: + time = 1000001880816 + data = empty + buffer #82: + time = 1000001904036 + data = empty + buffer #83: + time = 1000001927256 + data = empty + buffer #84: + time = 1000001950476 + data = empty + buffer #85: + time = 1000001973696 + data = empty + buffer #86: + time = 1000001996916 + data = empty + buffer #87: + time = 1000002020136 + data = empty + buffer #88: + time = 1000002043356 + data = empty + buffer #89: + time = 1000002066575 + data = empty + buffer #90: + time = 1000002089795 + data = empty + buffer #91: + time = 1000002113015 + data = empty + buffer #92: + time = 1000002136235 + data = empty + buffer #93: + time = 1000002159455 + data = empty + buffer #94: + time = 1000002182675 + data = empty + buffer #95: + time = 1000002205895 + data = empty + buffer #96: + time = 1000002229115 + data = empty + buffer #97: + time = 1000002252335 + data = empty + buffer #98: + time = 1000002275555 + data = empty + buffer #99: + time = 1000002298775 + data = empty + buffer #100: + time = 1000002321995 + data = empty + buffer #101: + time = 1000002345215 + data = empty + buffer #102: + time = 1000002368435 + data = empty + buffer #103: + time = 1000002391655 + data = empty + buffer #104: + time = 1000002414875 + data = empty + buffer #105: + time = 1000002438095 + data = empty + buffer #106: + time = 1000002461315 + data = empty + buffer #107: + time = 1000002484535 + data = empty + buffer #108: + time = 1000002507755 + data = empty + buffer #109: + time = 1000002530975 + data = empty + buffer #110: + time = 1000002554195 + data = empty + buffer #111: + time = 1000002577414 + data = empty + buffer #112: + time = 1000002600634 + data = empty + buffer #113: + time = 1000002623854 + data = empty + buffer #114: + time = 1000002647074 + data = empty + buffer #115: + time = 1000002670294 + data = empty + buffer #116: + time = 1000002693514 + data = empty + buffer #117: + time = 1000002716734 + data = empty + buffer #118: + time = 1000002739954 + data = empty + buffer #119: + time = 1000002763174 + data = empty + buffer #120: + time = 1000002786394 + data = empty + buffer #121: + time = 1000002809614 + data = empty + buffer #122: + time = 1000002832834 + data = empty + buffer #123: + time = 1000002856054 + data = empty + buffer #124: + time = 1000002879274 + data = empty + buffer #125: + time = 1000002902494 + data = empty + buffer #126: + time = 1000002925714 + data = empty + buffer #127: + time = 1000002948934 + data = empty + buffer #128: + time = 1000002972154 + data = empty + buffer #129: + time = 1000002995374 + data = empty + buffer #130: + time = 1000003018594 + data = empty + buffer #131: + time = 1000003041814 + data = empty + buffer #132: + time = 1000003065034 + data = empty + buffer #133: + time = 1000003088253 + data = empty + buffer #134: + time = 1000003111473 + data = empty + buffer #135: + time = 1000003134693 + data = empty + buffer #136: + time = 1000003157913 + data = empty + buffer #137: + time = 1000003181133 + data = empty + buffer #138: + time = 1000003204353 + data = empty + buffer #139: + time = 1000003227573 + data = empty + buffer #140: + time = 1000003250793 + data = empty + buffer #141: + time = 1000003274013 + data = empty + buffer #142: + time = 1000003297233 + data = empty + buffer #143: + time = 1000003320453 + data = empty + buffer #144: + time = 1000003343673 + data = empty + buffer #145: + time = 1000003366893 + data = empty + buffer #146: + time = 1000003390113 + data = empty + buffer #147: + time = 1000003413333 + data = empty + buffer #148: + time = 1000003436553 + data = empty + buffer #149: + time = 1000003459773 + data = empty + buffer #150: + time = 1000003482993 + data = empty + buffer #151: + time = 1000003506213 + data = empty + buffer #152: + time = 1000003529433 + data = empty + buffer #153: + time = 1000003552653 + data = empty + buffer #154: + time = 1000003575873 + data = empty + buffer #155: + time = 1000003599092 + data = empty + buffer #156: + time = 1000003622312 + data = empty + buffer #157: + time = 1000003645532 + data = empty + buffer #158: + time = 1000003668752 + data = empty + buffer #159: + time = 1000003691972 + data = empty + buffer #160: + time = 1000003715192 + data = empty + buffer #161: + time = 1000003738412 + data = empty + buffer #162: + time = 1000003761632 + data = empty + buffer #163: + time = 1000003784852 + data = empty + buffer #164: + time = 1000003808072 + data = empty + buffer #165: + time = 1000003831292 + data = empty + buffer #166: + time = 1000003854512 + data = empty + buffer #167: + time = 1000003877732 + data = empty + buffer #168: + time = 1000003900952 + data = empty + buffer #169: + time = 1000003924172 + data = empty + buffer #170: + time = 1000003947392 + data = empty + buffer #171: + time = 1000003970612 + data = empty + buffer #172: + time = 1000003993832 + data = empty + buffer #173: + time = 1000004017052 + data = empty + buffer #174: + time = 1000004040272 + data = empty + buffer #175: + time = 1000004063492 + data = empty + buffer #176: + time = 1000004086712 + data = empty + buffer #177: + time = 1000004109931 + data = empty + buffer #178: + time = 1000004133151 + data = empty + buffer #179: + time = 1000004156371 + data = empty + buffer #180: + time = 1000004179591 + data = empty + buffer #181: + time = 1000004202811 + data = empty + buffer #182: + time = 1000004226031 + data = empty + buffer #183: + time = 1000004249251 + data = empty + buffer #184: + time = 1000004272471 + data = empty + buffer #185: + time = 1000004295691 + data = empty + buffer #186: + time = 1000004318911 + data = empty + buffer #187: + time = 1000004342131 + data = empty + buffer #188: + time = 1000004365351 + data = empty + buffer #189: + time = 1000004388571 + data = empty + buffer #190: + time = 1000004411791 + data = empty + buffer #191: + time = 1000004435011 + data = empty + buffer #192: + time = 1000004458231 + data = empty + buffer #193: + time = 1000004481451 + data = empty + buffer #194: + time = 1000004504671 + data = empty + buffer #195: + time = 1000004527891 + data = empty + buffer #196: + time = 1000004551111 + data = empty + buffer #197: + time = 1000004574331 + data = empty + buffer #198: + time = 1000004597551 + data = empty + buffer #199: + time = 1000004620770 + data = empty + buffer #200: + time = 1000004643990 + data = empty + buffer #201: + time = 1000004667210 + data = empty + buffer #202: + time = 1000004690430 + data = empty + buffer #203: + time = 1000004713650 + data = empty + buffer #204: + time = 1000004736870 + data = empty + buffer #205: + time = 1000004760090 + data = empty + buffer #206: + time = 1000004783310 + data = empty + buffer #207: + time = 1000004806530 + data = empty + buffer #208: + time = 1000004829750 + data = empty + buffer #209: + time = 1000004852970 + data = empty + buffer #210: + time = 1000004876190 + data = empty + buffer #211: + time = 1000004899410 + data = empty + buffer #212: + time = 1000004922630 + data = empty + buffer #213: + time = 1000004945850 + data = empty + buffer #214: + time = 1000004969070 + data = empty + buffer #215: + time = 1000004992290 + data = empty + buffer #216: + time = 1000005015510 + data = empty +TextOutput: + Subtitle[0]: + presentationTimeUs = 0 + Cues = [] + Subtitle[1]: + presentationTimeUs = 1000000 + Cue[0]: + text = First subtitle - end overlaps second + lineType = 0 + Subtitle[2]: + presentationTimeUs = 2000000 + Cue[0]: + text = Second subtitle - beginning overlaps first + lineType = 0 + Cue[1]: + text = First subtitle - end overlaps second + lineType = 0 + Subtitle[3]: + presentationTimeUs = 4230000 + Cue[0]: + text = Second subtitle - beginning overlaps first + lineType = 0 From d440dbc197b6597f1f55dd9ee4a65c40d2f18128 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 15:40:27 +0100 Subject: [PATCH 09/14] Reformat with google-java-format --- .../src/main/java/androidx/media3/common/text/Cue.java | 8 ++------ .../java/androidx/media3/common/text/CueGroup.java | 4 +--- .../androidx/media3/extractor/text/CuesWithTiming.java | 1 + .../media3/extractor/text/ssa/SsaDialogueFormat.java | 10 ++++++++-- .../androidx/media3/extractor/text/ssa/SsaParser.java | 4 +--- .../media3/extractor/text/ssa/SsaParserTest.java | 3 ++- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java index 18fe966d666..c5aa7aaa2d5 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java @@ -309,9 +309,7 @@ public final class Cue { */ public final float shearDegrees; - /** - * The z index for cue, the larger index will render above the smaller index. - */ + /** The z index for cue, the larger index will render above the smaller index. */ public final int zIndex; private Cue( @@ -824,9 +822,7 @@ public Builder setZIndex(int zIndex) { return this; } - /** - * Gets the zIndex for this Cue. - */ + /** Gets the zIndex for this Cue. */ @Pure public int getZIndex() { return zIndex; diff --git a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java index e38a42d3cdb..51e183c60c5 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java @@ -30,9 +30,7 @@ /** Class to represent the state of active {@link Cue Cues} at a particular time. */ public final class CueGroup { - /** - * An {@link Ordering} which sorts cues in ascending zIndex priority - */ + /** An {@link Ordering} which sorts cues in ascending zIndex priority */ private static final Ordering CUES_PRIORITY_COMPARATOR = Ordering.natural().onResultOf(c -> c.zIndex); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java index 4dd2ffe071d..cb8a6ea8f00 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java @@ -26,6 +26,7 @@ /** A list of {@link Cue} instances with a start time and duration. */ @UnstableApi public class CuesWithTiming { + /** The cues to show on screen. */ public final ImmutableList cues; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java index f9b1128b440..c6b0a3d76fd 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java @@ -40,7 +40,12 @@ public final int length; private SsaDialogueFormat( - int layerIndex, int startTimeIndex, int endTimeIndex, int styleIndex, int textIndex, int length) { + int layerIndex, + int startTimeIndex, + int endTimeIndex, + int styleIndex, + int textIndex, + int length) { this.layerIndex = layerIndex; this.startTimeIndex = startTimeIndex; this.endTimeIndex = endTimeIndex; @@ -85,7 +90,8 @@ public static SsaDialogueFormat fromFormatLine(String formatLine) { return (startTimeIndex != C.INDEX_UNSET && endTimeIndex != C.INDEX_UNSET && textIndex != C.INDEX_UNSET) - ? new SsaDialogueFormat(layerIndex, startTimeIndex, endTimeIndex, styleIndex, textIndex, keys.length) + ? new SsaDialogueFormat( + layerIndex, startTimeIndex, endTimeIndex, styleIndex, textIndex, keys.length) : null; } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java index 3396718e9ec..bb782b5660d 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java @@ -398,9 +398,7 @@ private static Cue createCue( float screenWidth, float screenHeight) { SpannableString spannableText = new SpannableString(text); - Cue.Builder cue = new Cue.Builder() - .setText(spannableText) - .setZIndex(layer); + Cue.Builder cue = new Cue.Builder().setText(spannableText).setZIndex(layer); if (style != null) { if (style.primaryColor != null) { diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java index 887a03143a6..673cc92f503 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java @@ -431,7 +431,8 @@ public void parseLayer() throws IOException { @Test public void parseInvalidLayer() throws IOException { SsaParser parser = new SsaParser(); - byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INVALID_LAYERS); + byte[] bytes = + TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INVALID_LAYERS); ImmutableList allCues = parseAllCues(parser, bytes); // Check empty layer. From eeee0d56070d1b327a8b29f516fbc1add96b1ca6 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 15:42:40 +0100 Subject: [PATCH 10/14] Add release note for SSA layer support --- RELEASENOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e834a7305eb..59733642ae6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -69,6 +69,10 @@ SubStation Alpha subtitles (but ExoPlayer's parsing logic is the same for both variants) ([#2384](https://github.com/androidx/media/issues/2384)). + * Add support for the `layer` property in SubStation Alpha (SSA) subtitle + files which is used to define the z-order of cues when more than one is + shown on screen at the same time + ([#2124](https://github.com/androidx/media/issues/2124)). * Metadata: * Image: * DataSource: From be8585fa74a903d2f7553cd099bfa80ea0702f62 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 15:49:14 +0100 Subject: [PATCH 11/14] Remove edit to media.exolist.json --- demos/main/src/main/assets/media.exolist.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index cff5682fcb4..fd9ea623245 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -705,13 +705,6 @@ "subtitle_mime_type": "text/x-ssa", "subtitle_language": "en" }, - { - "name": "SubStation Layer Render", - "uri": "https://storage.googleapis.com/exoplayer-test-media-1/gen-3/screens/dash-vod-single-segment/video-avc-baseline-480.mp4", - "subtitle_uri": "https://storage.googleapis.com/exoplayer-test-media-1/ssa/test-subs-layer.ass", - "subtitle_mime_type": "text/x-ssa", - "subtitle_language": "en" - }, { "name": "MPEG-4 Timed Text", "uri": "https://storage.googleapis.com/exoplayer-test-media-1/mp4/dizzy-with-tx3g.mp4" From 3a34daa3541bb13d404e942a80a75e528aec8552 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 15:51:23 +0100 Subject: [PATCH 12/14] Fix pre-review lint comments --- .../main/java/androidx/media3/extractor/text/ssa/SsaParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java index bb782b5660d..88b50a113bd 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java @@ -332,7 +332,7 @@ private void parseDialogueLine( if (format.layerIndex != C.INDEX_UNSET) { try { layer = Integer.parseInt(lineValues[format.layerIndex].trim()); - } catch (Exception exception) { + } catch (RuntimeException exception) { Log.w(TAG, "Fail to parse layer: " + lineValues[format.layerIndex]); } } From e681baf47f1e6b449e669d6f3348336200f4b223 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 8 May 2025 17:05:31 +0100 Subject: [PATCH 13/14] Update extractor dump files, and mark Cue.zIndex with @UnstableApi --- .../src/main/java/androidx/media3/common/text/Cue.java | 1 + .../mkv_subtitle_transcoding/full_blocks.mkv.0.dump | 8 ++++---- .../mkv_subtitle_transcoding/full_blocks.mkv.1.dump | 8 ++++---- .../mkv_subtitle_transcoding/full_blocks.mkv.2.dump | 8 ++++---- .../mkv_subtitle_transcoding/full_blocks.mkv.3.dump | 8 ++++---- .../full_blocks.mkv.unknown_length.dump | 8 ++++---- .../sample_with_null_terminated_srt.mkv.0.dump | 4 ++-- .../sample_with_null_terminated_srt.mkv.1.dump | 4 ++-- .../sample_with_null_terminated_srt.mkv.2.dump | 4 ++-- .../sample_with_null_terminated_srt.mkv.3.dump | 4 ++-- ...ample_with_null_terminated_srt.mkv.unknown_length.dump | 4 ++-- .../sample_with_null_terminated_ssa_subtitles.mkv.0.dump | 4 ++-- .../sample_with_null_terminated_ssa_subtitles.mkv.1.dump | 4 ++-- .../sample_with_null_terminated_ssa_subtitles.mkv.2.dump | 4 ++-- .../sample_with_null_terminated_ssa_subtitles.mkv.3.dump | 4 ++-- ..._null_terminated_ssa_subtitles.mkv.unknown_length.dump | 4 ++-- .../sample_with_null_terminated_vtt_subtitles.mkv.0.dump | 4 ++-- .../sample_with_null_terminated_vtt_subtitles.mkv.1.dump | 4 ++-- .../sample_with_null_terminated_vtt_subtitles.mkv.2.dump | 4 ++-- .../sample_with_null_terminated_vtt_subtitles.mkv.3.dump | 4 ++-- ..._null_terminated_vtt_subtitles.mkv.unknown_length.dump | 4 ++-- .../sample_with_overlapping_srt.mkv.0.dump | 8 ++++---- .../sample_with_overlapping_srt.mkv.1.dump | 8 ++++---- .../sample_with_overlapping_srt.mkv.2.dump | 8 ++++---- .../sample_with_overlapping_srt.mkv.3.dump | 8 ++++---- .../sample_with_overlapping_srt.mkv.unknown_length.dump | 8 ++++---- .../sample_with_overlapping_ssa_subtitles.mkv.0.dump | 8 ++++---- .../sample_with_overlapping_ssa_subtitles.mkv.1.dump | 8 ++++---- .../sample_with_overlapping_ssa_subtitles.mkv.2.dump | 8 ++++---- .../sample_with_overlapping_ssa_subtitles.mkv.3.dump | 8 ++++---- ...with_overlapping_ssa_subtitles.mkv.unknown_length.dump | 8 ++++---- .../mkv_subtitle_transcoding/sample_with_srt.mkv.0.dump | 4 ++-- .../mkv_subtitle_transcoding/sample_with_srt.mkv.1.dump | 4 ++-- .../mkv_subtitle_transcoding/sample_with_srt.mkv.2.dump | 4 ++-- .../mkv_subtitle_transcoding/sample_with_srt.mkv.3.dump | 4 ++-- .../sample_with_srt.mkv.unknown_length.dump | 4 ++-- .../sample_with_ssa_subtitles.mkv.0.dump | 4 ++-- .../sample_with_ssa_subtitles.mkv.1.dump | 4 ++-- .../sample_with_ssa_subtitles.mkv.2.dump | 4 ++-- .../sample_with_ssa_subtitles.mkv.3.dump | 4 ++-- .../sample_with_ssa_subtitles.mkv.unknown_length.dump | 4 ++-- .../sample_with_vtt_subtitles.mkv.0.dump | 4 ++-- .../sample_with_vtt_subtitles.mkv.1.dump | 4 ++-- .../sample_with_vtt_subtitles.mkv.2.dump | 4 ++-- .../sample_with_vtt_subtitles.mkv.3.dump | 4 ++-- .../sample_with_vtt_subtitles.mkv.unknown_length.dump | 4 ++-- ...h_x-timestamp-map_header_parsed_during_extraction.dump | 6 +++--- 47 files changed, 124 insertions(+), 123 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java index c5aa7aaa2d5..dee2681e9ae 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java @@ -310,6 +310,7 @@ public final class Cue { public final float shearDegrees; /** The z index for cue, the larger index will render above the smaller index. */ + @UnstableApi public final int zIndex; private Cue( diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.0.dump index 778664f7154..3d70e602dd0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.0.dump @@ -7,7 +7,7 @@ seekMap: getPosition(8901000) = [[timeUs=4567000, position=5401]] numberOfTracks = 1 track 1: - total output bytes = 2951 + total output bytes = 3047 sample count = 3 format 0: id = 1 @@ -19,13 +19,13 @@ track 1: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C sample 1: time = 2345000 flags = 1 - data = length 1007, hash 87030429 + data = length 1039, hash 8605A0D6 sample 2: time = 4567000 flags = 1 - data = length 972, hash C2C47517 + data = length 1004, hash FC3F6208 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.1.dump index 778664f7154..3d70e602dd0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.1.dump @@ -7,7 +7,7 @@ seekMap: getPosition(8901000) = [[timeUs=4567000, position=5401]] numberOfTracks = 1 track 1: - total output bytes = 2951 + total output bytes = 3047 sample count = 3 format 0: id = 1 @@ -19,13 +19,13 @@ track 1: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C sample 1: time = 2345000 flags = 1 - data = length 1007, hash 87030429 + data = length 1039, hash 8605A0D6 sample 2: time = 4567000 flags = 1 - data = length 972, hash C2C47517 + data = length 1004, hash FC3F6208 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.2.dump index 778664f7154..3d70e602dd0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.2.dump @@ -7,7 +7,7 @@ seekMap: getPosition(8901000) = [[timeUs=4567000, position=5401]] numberOfTracks = 1 track 1: - total output bytes = 2951 + total output bytes = 3047 sample count = 3 format 0: id = 1 @@ -19,13 +19,13 @@ track 1: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C sample 1: time = 2345000 flags = 1 - data = length 1007, hash 87030429 + data = length 1039, hash 8605A0D6 sample 2: time = 4567000 flags = 1 - data = length 972, hash C2C47517 + data = length 1004, hash FC3F6208 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.3.dump index 778664f7154..3d70e602dd0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.3.dump @@ -7,7 +7,7 @@ seekMap: getPosition(8901000) = [[timeUs=4567000, position=5401]] numberOfTracks = 1 track 1: - total output bytes = 2951 + total output bytes = 3047 sample count = 3 format 0: id = 1 @@ -19,13 +19,13 @@ track 1: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C sample 1: time = 2345000 flags = 1 - data = length 1007, hash 87030429 + data = length 1039, hash 8605A0D6 sample 2: time = 4567000 flags = 1 - data = length 972, hash C2C47517 + data = length 1004, hash FC3F6208 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.unknown_length.dump index 778664f7154..3d70e602dd0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/full_blocks.mkv.unknown_length.dump @@ -7,7 +7,7 @@ seekMap: getPosition(8901000) = [[timeUs=4567000, position=5401]] numberOfTracks = 1 track 1: - total output bytes = 2951 + total output bytes = 3047 sample count = 3 format 0: id = 1 @@ -19,13 +19,13 @@ track 1: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C sample 1: time = 2345000 flags = 1 - data = length 1007, hash 87030429 + data = length 1039, hash 8605A0D6 sample 2: time = 4567000 flags = 1 - data = length 972, hash C2C47517 + data = length 1004, hash FC3F6208 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.0.dump index 98317515dd1..fd338f9bfbb 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 962 + total output bytes = 994 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 962, hash 6D7C55B3 + data = length 994, hash 6AA26024 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.1.dump index 98317515dd1..fd338f9bfbb 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 962 + total output bytes = 994 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 962, hash 6D7C55B3 + data = length 994, hash 6AA26024 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.2.dump index 98317515dd1..fd338f9bfbb 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 962 + total output bytes = 994 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 962, hash 6D7C55B3 + data = length 994, hash 6AA26024 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.3.dump index 98317515dd1..fd338f9bfbb 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 962 + total output bytes = 994 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 962, hash 6D7C55B3 + data = length 994, hash 6AA26024 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.unknown_length.dump index 98317515dd1..fd338f9bfbb 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_srt.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 962 + total output bytes = 994 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 962, hash 6D7C55B3 + data = length 994, hash 6AA26024 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.0.dump index 3b27b356e89..f434779d59d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1249 + total output bytes = 1276 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1249, hash 6B21A04D + data = length 1276, hash 1D6A43C2 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.1.dump index 3b27b356e89..f434779d59d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1249 + total output bytes = 1276 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1249, hash 6B21A04D + data = length 1276, hash 1D6A43C2 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.2.dump index 3b27b356e89..f434779d59d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1249 + total output bytes = 1276 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1249, hash 6B21A04D + data = length 1276, hash 1D6A43C2 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.3.dump index 3b27b356e89..f434779d59d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1249 + total output bytes = 1276 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1249, hash 6B21A04D + data = length 1276, hash 1D6A43C2 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump index 3b27b356e89..f434779d59d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1249 + total output bytes = 1276 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1249, hash 6B21A04D + data = length 1276, hash 1D6A43C2 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.0.dump index ad47bd4c762..6074bb1fc48 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1129 + total output bytes = 1161 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1129, hash 7CA6A835 + data = length 1161, hash 1A73F62 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.1.dump index ad47bd4c762..6074bb1fc48 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1129 + total output bytes = 1161 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1129, hash 7CA6A835 + data = length 1161, hash 1A73F62 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.2.dump index ad47bd4c762..6074bb1fc48 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1129 + total output bytes = 1161 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1129, hash 7CA6A835 + data = length 1161, hash 1A73F62 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.3.dump index ad47bd4c762..6074bb1fc48 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1129 + total output bytes = 1161 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1129, hash 7CA6A835 + data = length 1161, hash 1A73F62 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.unknown_length.dump index ad47bd4c762..6074bb1fc48 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_null_terminated_vtt_subtitles.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1129 + total output bytes = 1161 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1129, hash 7CA6A835 + data = length 1161, hash 1A73F62 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.0.dump index 9ca64fbb1e8..af7959dfc2a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2954 + total output bytes = 3050 sample count = 3 format 0: id = 3 @@ -281,13 +281,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 981, hash 3A70FBFA + data = length 1013, hash 1CEAF627 sample 1: time = 150000 flags = 1 - data = length 986, hash 8CA3E471 + data = length 1018, hash 976E88E2 sample 2: time = 200000 flags = 1 - data = length 987, hash 156157B4 + data = length 1019, hash CA148B61 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.1.dump index 9ca64fbb1e8..af7959dfc2a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2954 + total output bytes = 3050 sample count = 3 format 0: id = 3 @@ -281,13 +281,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 981, hash 3A70FBFA + data = length 1013, hash 1CEAF627 sample 1: time = 150000 flags = 1 - data = length 986, hash 8CA3E471 + data = length 1018, hash 976E88E2 sample 2: time = 200000 flags = 1 - data = length 987, hash 156157B4 + data = length 1019, hash CA148B61 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.2.dump index 9ca64fbb1e8..af7959dfc2a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2954 + total output bytes = 3050 sample count = 3 format 0: id = 3 @@ -281,13 +281,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 981, hash 3A70FBFA + data = length 1013, hash 1CEAF627 sample 1: time = 150000 flags = 1 - data = length 986, hash 8CA3E471 + data = length 1018, hash 976E88E2 sample 2: time = 200000 flags = 1 - data = length 987, hash 156157B4 + data = length 1019, hash CA148B61 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.3.dump index 9ca64fbb1e8..af7959dfc2a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2954 + total output bytes = 3050 sample count = 3 format 0: id = 3 @@ -281,13 +281,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 981, hash 3A70FBFA + data = length 1013, hash 1CEAF627 sample 1: time = 150000 flags = 1 - data = length 986, hash 8CA3E471 + data = length 1018, hash 976E88E2 sample 2: time = 200000 flags = 1 - data = length 987, hash 156157B4 + data = length 1019, hash CA148B61 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.unknown_length.dump index 9ca64fbb1e8..af7959dfc2a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_srt.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2954 + total output bytes = 3050 sample count = 3 format 0: id = 3 @@ -281,13 +281,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 981, hash 3A70FBFA + data = length 1013, hash 1CEAF627 sample 1: time = 150000 flags = 1 - data = length 986, hash 8CA3E471 + data = length 1018, hash 976E88E2 sample 2: time = 200000 flags = 1 - data = length 987, hash 156157B4 + data = length 1019, hash CA148B61 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.0.dump index 59248ccdb27..0f7c55dc66d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2939 + total output bytes = 3035 sample count = 3 format 0: id = 3 @@ -284,13 +284,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 976, hash 91D1729 + data = length 1008, hash 3D438A1A sample 1: time = 150000 flags = 1 - data = length 981, hash 1B9102A8 + data = length 1013, hash 8FEE70D5 sample 2: time = 200000 flags = 1 - data = length 982, hash 263F7393 + data = length 1014, hash BCAEBD04 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.1.dump index 59248ccdb27..0f7c55dc66d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2939 + total output bytes = 3035 sample count = 3 format 0: id = 3 @@ -284,13 +284,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 976, hash 91D1729 + data = length 1008, hash 3D438A1A sample 1: time = 150000 flags = 1 - data = length 981, hash 1B9102A8 + data = length 1013, hash 8FEE70D5 sample 2: time = 200000 flags = 1 - data = length 982, hash 263F7393 + data = length 1014, hash BCAEBD04 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.2.dump index 59248ccdb27..0f7c55dc66d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2939 + total output bytes = 3035 sample count = 3 format 0: id = 3 @@ -284,13 +284,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 976, hash 91D1729 + data = length 1008, hash 3D438A1A sample 1: time = 150000 flags = 1 - data = length 981, hash 1B9102A8 + data = length 1013, hash 8FEE70D5 sample 2: time = 200000 flags = 1 - data = length 982, hash 263F7393 + data = length 1014, hash BCAEBD04 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.3.dump index 59248ccdb27..0f7c55dc66d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2939 + total output bytes = 3035 sample count = 3 format 0: id = 3 @@ -284,13 +284,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 976, hash 91D1729 + data = length 1008, hash 3D438A1A sample 1: time = 150000 flags = 1 - data = length 981, hash 1B9102A8 + data = length 1013, hash 8FEE70D5 sample 2: time = 200000 flags = 1 - data = length 982, hash 263F7393 + data = length 1014, hash BCAEBD04 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.unknown_length.dump index 59248ccdb27..0f7c55dc66d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_overlapping_ssa_subtitles.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 2939 + total output bytes = 3035 sample count = 3 format 0: id = 3 @@ -284,13 +284,13 @@ track 3: sample 0: time = 100000 flags = 1 - data = length 976, hash 91D1729 + data = length 1008, hash 3D438A1A sample 1: time = 150000 flags = 1 - data = length 981, hash 1B9102A8 + data = length 1013, hash 8FEE70D5 sample 2: time = 200000 flags = 1 - data = length 982, hash 263F7393 + data = length 1014, hash BCAEBD04 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.0.dump index bce0b6632a3..be237b95894 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 972 + total output bytes = 1004 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.1.dump index bce0b6632a3..be237b95894 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 972 + total output bytes = 1004 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.2.dump index bce0b6632a3..be237b95894 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 972 + total output bytes = 1004 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.3.dump index bce0b6632a3..be237b95894 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 972 + total output bytes = 1004 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.unknown_length.dump index bce0b6632a3..be237b95894 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_srt.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 972 + total output bytes = 1004 sample count = 1 format 0: id = 3 @@ -285,5 +285,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 972, hash 8E8A2E4B + data = length 1004, hash EF0EFF3C tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.0.dump index a9b8653d9fa..d4256a51630 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1259 + total output bytes = 1291 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1259, hash C880769E + data = length 1291, hash 7F76D24B tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.1.dump index a9b8653d9fa..d4256a51630 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1259 + total output bytes = 1291 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1259, hash C880769E + data = length 1291, hash 7F76D24B tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.2.dump index a9b8653d9fa..d4256a51630 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1259 + total output bytes = 1291 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1259, hash C880769E + data = length 1291, hash 7F76D24B tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.3.dump index a9b8653d9fa..d4256a51630 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1259 + total output bytes = 1291 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1259, hash C880769E + data = length 1291, hash 7F76D24B tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.unknown_length.dump index a9b8653d9fa..d4256a51630 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_ssa_subtitles.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1259 + total output bytes = 1291 sample count = 1 format 0: id = 3 @@ -284,5 +284,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1259, hash C880769E + data = length 1291, hash 7F76D24B tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.0.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.0.dump index 28510720c31..85d096e063f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.0.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1139 + total output bytes = 1171 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1139, hash 156F6F9D + data = length 1171, hash 50DBF14A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.1.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.1.dump index 28510720c31..85d096e063f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.1.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1139 + total output bytes = 1171 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1139, hash 156F6F9D + data = length 1171, hash 50DBF14A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.2.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.2.dump index 28510720c31..85d096e063f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.2.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1139 + total output bytes = 1171 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1139, hash 156F6F9D + data = length 1171, hash 50DBF14A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.3.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.3.dump index 28510720c31..85d096e063f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.3.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1139 + total output bytes = 1171 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1139, hash 156F6F9D + data = length 1171, hash 50DBF14A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.unknown_length.dump index 28510720c31..85d096e063f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mkv_subtitle_transcoding/sample_with_vtt_subtitles.mkv.unknown_length.dump @@ -269,7 +269,7 @@ track 2: flags = 1 data = length 418, hash 56AB8D37 track 3: - total output bytes = 1139 + total output bytes = 1171 sample count = 1 format 0: id = 3 @@ -281,5 +281,5 @@ track 3: sample 0: time = 0 flags = 1 - data = length 1139, hash 156F6F9D + data = length 1171, hash 50DBF14A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/webvtt/with_x-timestamp-map_header_parsed_during_extraction.dump b/libraries/test_data/src/test/assets/extractordumps/webvtt/with_x-timestamp-map_header_parsed_during_extraction.dump index 27e71970a36..284fffdbc32 100644 --- a/libraries/test_data/src/test/assets/extractordumps/webvtt/with_x-timestamp-map_header_parsed_during_extraction.dump +++ b/libraries/test_data/src/test/assets/extractordumps/webvtt/with_x-timestamp-map_header_parsed_during_extraction.dump @@ -4,7 +4,7 @@ seekMap: getPosition(0) = [[timeUs=0, position=0]] numberOfTracks = 1 track 0: - total output bytes = 2248 + total output bytes = 2312 sample count = 2 format 0: sampleMimeType = application/x-media3-cues @@ -12,9 +12,9 @@ track 0: sample 0: time = 5000155 flags = 1 - data = length 1124, hash E87709B3 + data = length 1156, hash 9CF92E65 sample 1: time = 6754155 flags = 1 - data = length 1124, hash 5C8A8288 + data = length 1156, hash 71938F3A tracksEnded = true From e58977add2e801cd535128c94a5e6d87c28382fe Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Fri, 9 May 2025 14:54:25 +0100 Subject: [PATCH 14/14] Clarify in docs that Cue.zIndex can be negative --- .../common/src/main/java/androidx/media3/common/text/Cue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java index dee2681e9ae..ef46e94faf3 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/Cue.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/Cue.java @@ -309,7 +309,7 @@ public final class Cue { */ public final float shearDegrees; - /** The z index for cue, the larger index will render above the smaller index. */ + /** The Z index for cue, the larger index will render above the smaller index. May be negative. */ @UnstableApi public final int zIndex;