diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index 398d6c05d4..b5d242f52e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; @@ -29,6 +30,7 @@ import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.FakeClock; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.common.collect.ImmutableList; import org.junit.Rule; import org.junit.Test; @@ -65,6 +67,19 @@ public final class MkvPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); + // TODO(internal b/174661563): Remove the for-loop below to enable the text renderer when + // subtitle output is not flaky. + for (int textRendererIndex = 0; + textRendererIndex < player.getRendererCount(); + textRendererIndex++) { + if (player.getRendererType(textRendererIndex) == C.TRACK_TYPE_TEXT) { + player.setTrackSelectionParameters( + new DefaultTrackSelector.ParametersBuilder(applicationContext) + .setRendererDisabled(textRendererIndex, /* disabled= */ true) + .build()); + break; + } + } player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java new file mode 100644 index 0000000000..49b29f3c5c --- /dev/null +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2021 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 com.google.android.exoplayer2.e2etest; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.view.Surface; +import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.robolectric.PlaybackOutput; +import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; +import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; +import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; +import com.google.android.exoplayer2.source.MediaSourceFactory; +import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; +import com.google.android.exoplayer2.testutil.DumpFileAsserts; +import com.google.android.exoplayer2.testutil.FakeClock; +import com.google.android.exoplayer2.util.MimeTypes; +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 WebVTT subtitles. */ +@RunWith(ParameterizedRobolectricTestRunner.class) +public class WebvttPlaybackTest { + @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") + public static ImmutableList mediaSamples() { + return ImmutableList.of("typical"); + } + + @ParameterizedRobolectricTestRunner.Parameter public String inputFile; + + @Rule + public ShadowMediaCodecConfig mediaCodecConfig = + ShadowMediaCodecConfig.forAllSupportedMimeTypes(); + + @Test + public void test() throws Exception { + Context applicationContext = ApplicationProvider.getApplicationContext(); + CapturingRenderersFactory capturingRenderersFactory = + new CapturingRenderersFactory(applicationContext); + MediaSourceFactory mediaSourceFactory = + new DefaultMediaSourceFactory(applicationContext) + .experimentalUseProgressiveMediaSourceForSubtitles(true); + ExoPlayer player = + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) + .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .setMediaSourceFactory(mediaSourceFactory) + .build(); + player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + 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/webvtt/" + inputFile)) + .setMimeType(MimeTypes.TEXT_VTT) + .setLanguage("en") + .setSelectionFlags(C.SELECTION_FLAG_DEFAULT) + .build())) + .build(); + + player.setMediaItem(mediaItem); + player.prepare(); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + + DumpFileAsserts.assertOutput( + applicationContext, playbackOutput, "playbackdumps/webvtt/" + inputFile + ".dump"); + } +} diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index 053fd707e4..a6f7cf5aec 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -33,6 +33,7 @@ import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,6 +48,8 @@ public final class DashPlaybackTest { // https://github.com/google/ExoPlayer/issues/7985 @Test + @Ignore( + "Disabled until subtitles are reliably asserted in robolectric tests [internal b/174661563].") public void webvttInMp4() throws Exception { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java index 3f9718fc98..000f9e627e 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java @@ -17,8 +17,8 @@ package com.google.android.exoplayer2.robolectric; import android.graphics.Bitmap; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable; import com.google.android.exoplayer2.metadata.emsg.EventMessage; @@ -55,8 +55,7 @@ public final class PlaybackOutput implements Dumper.Dumpable { private final List metadatas; private final List> subtitles; - private PlaybackOutput( - SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { + private PlaybackOutput(ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { this.capturingRenderersFactory = capturingRenderersFactory; metadatas = Collections.synchronizedList(new ArrayList<>()); @@ -73,7 +72,7 @@ public final class PlaybackOutput implements Dumper.Dumpable { @Override public void onCues(List cues) { - // TODO(internal b/174661563): Output subtitle data when it's not flaky. + subtitles.add(cues); } }); } @@ -85,13 +84,13 @@ public final class PlaybackOutput implements Dumper.Dumpable { *

Must be called before playback to ensure metadata and text output is captured * correctly. * - * @param player The {@link SimpleExoPlayer} to capture metadata and text output from. + * @param player The {@link ExoPlayer} to capture metadata and text output from. * @param capturingRenderersFactory The {@link CapturingRenderersFactory} to capture audio and * video output from. * @return A new instance that can be used to dump the playback output. */ public static PlaybackOutput register( - SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { + ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { return new PlaybackOutput(player, capturingRenderersFactory); } diff --git a/testdata/src/test/assets/playbackdumps/webvtt/typical.dump b/testdata/src/test/assets/playbackdumps/webvtt/typical.dump new file mode 100644 index 0000000000..db4b4047c5 --- /dev/null +++ b/testdata/src/test/assets/playbackdumps/webvtt/typical.dump @@ -0,0 +1,375 @@ +MediaCodecAdapter (exotest.audio.aac): + buffers.length = 218 + buffers[0] = length 21, hash D57A2CCC + buffers[1] = length 4, hash EE9DF + buffers[2] = length 4, hash EE9DF + buffers[3] = length 4, hash EE9DF + buffers[4] = length 4, hash EE9DF + buffers[5] = length 4, hash EE9DF + buffers[6] = length 4, hash EE9DF + buffers[7] = length 4, hash EE9DF + buffers[8] = length 4, hash EE9DF + buffers[9] = length 4, hash EE9DF + buffers[10] = length 4, hash EE9DF + buffers[11] = length 4, hash EE9DF + buffers[12] = length 4, hash EE9DF + buffers[13] = length 4, hash EE9DF + buffers[14] = length 4, hash EE9DF + buffers[15] = length 4, hash EE9DF + buffers[16] = length 4, hash EE9DF + buffers[17] = length 4, hash EE9DF + buffers[18] = length 4, hash EE9DF + buffers[19] = length 4, hash EE9DF + buffers[20] = length 4, hash EE9DF + buffers[21] = length 4, hash EE9DF + buffers[22] = length 4, hash EE9DF + buffers[23] = length 4, hash EE9DF + buffers[24] = length 4, hash EE9DF + buffers[25] = length 4, hash EE9DF + buffers[26] = length 4, hash EE9DF + buffers[27] = length 4, hash EE9DF + buffers[28] = length 4, hash EE9DF + buffers[29] = length 4, hash EE9DF + buffers[30] = length 4, hash EE9DF + buffers[31] = length 4, hash EE9DF + buffers[32] = length 4, hash EE9DF + buffers[33] = length 4, hash EE9DF + buffers[34] = length 4, hash EE9DF + buffers[35] = length 4, hash EE9DF + buffers[36] = length 4, hash EE9DF + buffers[37] = length 4, hash EE9DF + buffers[38] = length 4, hash EE9DF + buffers[39] = length 4, hash EE9DF + buffers[40] = length 4, hash EE9DF + buffers[41] = length 4, hash EE9DF + buffers[42] = length 4, hash EE9DF + buffers[43] = length 4, hash EE9DF + buffers[44] = length 4, hash EE9DF + buffers[45] = length 4, hash EE9DF + buffers[46] = length 4, hash EE9DF + buffers[47] = length 4, hash EE9DF + buffers[48] = length 4, hash EE9DF + buffers[49] = length 4, hash EE9DF + buffers[50] = length 4, hash EE9DF + buffers[51] = length 4, hash EE9DF + buffers[52] = length 4, hash EE9DF + buffers[53] = length 4, hash EE9DF + buffers[54] = length 4, hash EE9DF + buffers[55] = length 4, hash EE9DF + buffers[56] = length 4, hash EE9DF + buffers[57] = length 4, hash EE9DF + buffers[58] = length 4, hash EE9DF + buffers[59] = length 4, hash EE9DF + buffers[60] = length 4, hash EE9DF + buffers[61] = length 4, hash EE9DF + buffers[62] = length 4, hash EE9DF + buffers[63] = length 4, hash EE9DF + buffers[64] = length 4, hash EE9DF + buffers[65] = length 4, hash EE9DF + buffers[66] = length 4, hash EE9DF + buffers[67] = length 4, hash EE9DF + buffers[68] = length 4, hash EE9DF + buffers[69] = length 4, hash EE9DF + buffers[70] = length 4, hash EE9DF + buffers[71] = length 4, hash EE9DF + buffers[72] = length 4, hash EE9DF + buffers[73] = length 4, hash EE9DF + buffers[74] = length 4, hash EE9DF + buffers[75] = length 4, hash EE9DF + buffers[76] = length 4, hash EE9DF + buffers[77] = length 4, hash EE9DF + buffers[78] = length 4, hash EE9DF + buffers[79] = length 4, hash EE9DF + buffers[80] = length 4, hash EE9DF + buffers[81] = length 4, hash EE9DF + buffers[82] = length 4, hash EE9DF + buffers[83] = length 4, hash EE9DF + buffers[84] = length 4, hash EE9DF + buffers[85] = length 4, hash EE9DF + buffers[86] = length 4, hash EE9DF + buffers[87] = length 4, hash EE9DF + buffers[88] = length 4, hash EE9DF + buffers[89] = length 4, hash EE9DF + buffers[90] = length 4, hash EE9DF + buffers[91] = length 4, hash EE9DF + buffers[92] = length 4, hash EE9DF + buffers[93] = length 4, hash EE9DF + buffers[94] = length 4, hash EE9DF + buffers[95] = length 4, hash EE9DF + buffers[96] = length 4, hash EE9DF + buffers[97] = length 4, hash EE9DF + buffers[98] = length 4, hash EE9DF + buffers[99] = length 4, hash EE9DF + buffers[100] = length 4, hash EE9DF + buffers[101] = length 4, hash EE9DF + buffers[102] = length 4, hash EE9DF + buffers[103] = length 4, hash EE9DF + buffers[104] = length 4, hash EE9DF + buffers[105] = length 4, hash EE9DF + buffers[106] = length 4, hash EE9DF + buffers[107] = length 4, hash EE9DF + buffers[108] = length 4, hash EE9DF + buffers[109] = length 4, hash EE9DF + buffers[110] = length 4, hash EE9DF + buffers[111] = length 4, hash EE9DF + buffers[112] = length 4, hash EE9DF + buffers[113] = length 4, hash EE9DF + buffers[114] = length 4, hash EE9DF + buffers[115] = length 4, hash EE9DF + buffers[116] = length 4, hash EE9DF + buffers[117] = length 4, hash EE9DF + buffers[118] = length 4, hash EE9DF + buffers[119] = length 4, hash EE9DF + buffers[120] = length 4, hash EE9DF + buffers[121] = length 4, hash EE9DF + buffers[122] = length 4, hash EE9DF + buffers[123] = length 4, hash EE9DF + buffers[124] = length 4, hash EE9DF + buffers[125] = length 4, hash EE9DF + buffers[126] = length 4, hash EE9DF + buffers[127] = length 4, hash EE9DF + buffers[128] = length 4, hash EE9DF + buffers[129] = length 4, hash EE9DF + buffers[130] = length 4, hash EE9DF + buffers[131] = length 4, hash EE9DF + buffers[132] = length 4, hash EE9DF + buffers[133] = length 4, hash EE9DF + buffers[134] = length 4, hash EE9DF + buffers[135] = length 4, hash EE9DF + buffers[136] = length 4, hash EE9DF + buffers[137] = length 4, hash EE9DF + buffers[138] = length 4, hash EE9DF + buffers[139] = length 4, hash EE9DF + buffers[140] = length 4, hash EE9DF + buffers[141] = length 4, hash EE9DF + buffers[142] = length 4, hash EE9DF + buffers[143] = length 4, hash EE9DF + buffers[144] = length 4, hash EE9DF + buffers[145] = length 4, hash EE9DF + buffers[146] = length 4, hash EE9DF + buffers[147] = length 4, hash EE9DF + buffers[148] = length 4, hash EE9DF + buffers[149] = length 4, hash EE9DF + buffers[150] = length 4, hash EE9DF + buffers[151] = length 4, hash EE9DF + buffers[152] = length 4, hash EE9DF + buffers[153] = length 4, hash EE9DF + buffers[154] = length 4, hash EE9DF + buffers[155] = length 4, hash EE9DF + buffers[156] = length 4, hash EE9DF + buffers[157] = length 4, hash EE9DF + buffers[158] = length 4, hash EE9DF + buffers[159] = length 4, hash EE9DF + buffers[160] = length 4, hash EE9DF + buffers[161] = length 4, hash EE9DF + buffers[162] = length 4, hash EE9DF + buffers[163] = length 4, hash EE9DF + buffers[164] = length 4, hash EE9DF + buffers[165] = length 4, hash EE9DF + buffers[166] = length 4, hash EE9DF + buffers[167] = length 4, hash EE9DF + buffers[168] = length 4, hash EE9DF + buffers[169] = length 4, hash EE9DF + buffers[170] = length 4, hash EE9DF + buffers[171] = length 4, hash EE9DF + buffers[172] = length 4, hash EE9DF + buffers[173] = length 4, hash EE9DF + buffers[174] = length 4, hash EE9DF + buffers[175] = length 4, hash EE9DF + buffers[176] = length 4, hash EE9DF + buffers[177] = length 4, hash EE9DF + buffers[178] = length 4, hash EE9DF + buffers[179] = length 4, hash EE9DF + buffers[180] = length 4, hash EE9DF + buffers[181] = length 4, hash EE9DF + buffers[182] = length 4, hash EE9DF + buffers[183] = length 4, hash EE9DF + buffers[184] = length 4, hash EE9DF + buffers[185] = length 4, hash EE9DF + buffers[186] = length 4, hash EE9DF + buffers[187] = length 4, hash EE9DF + buffers[188] = length 4, hash EE9DF + buffers[189] = length 4, hash EE9DF + buffers[190] = length 4, hash EE9DF + buffers[191] = length 4, hash EE9DF + buffers[192] = length 4, hash EE9DF + buffers[193] = length 4, hash EE9DF + buffers[194] = length 4, hash EE9DF + buffers[195] = length 4, hash EE9DF + buffers[196] = length 4, hash EE9DF + buffers[197] = length 4, hash EE9DF + buffers[198] = length 4, hash EE9DF + buffers[199] = length 4, hash EE9DF + buffers[200] = length 4, hash EE9DF + buffers[201] = length 4, hash EE9DF + buffers[202] = length 4, hash EE9DF + buffers[203] = length 4, hash EE9DF + buffers[204] = length 4, hash EE9DF + buffers[205] = length 4, hash EE9DF + buffers[206] = length 4, hash EE9DF + buffers[207] = length 4, hash EE9DF + buffers[208] = length 4, hash EE9DF + buffers[209] = length 4, hash EE9DF + buffers[210] = length 4, hash EE9DF + buffers[211] = length 4, hash EE9DF + buffers[212] = length 4, hash EE9DF + buffers[213] = length 4, hash EE9DF + buffers[214] = length 4, hash EE9DF + buffers[215] = length 4, hash EE9DF + buffers[216] = length 4, hash EE9DF + buffers[217] = length 0, hash 1 +MediaCodecAdapter (exotest.video.avc): + buffers.length = 126 + buffers[0] = length 5245, hash C090A41E + buffers[1] = length 63, hash 5141C80D + buffers[2] = length 22, hash A32E59A1 + buffers[3] = length 20, hash A09DEAB8 + buffers[4] = length 18, hash B64DA059 + buffers[5] = length 28, hash FC8EF2BB + buffers[6] = length 22, hash BF8A4A9F + buffers[7] = length 18, hash D163DF61 + buffers[8] = length 18, hash FD82E95 + buffers[9] = length 28, hash 44A16E72 + buffers[10] = length 22, hash 31C06057 + buffers[11] = length 18, hash DC93CC9D + buffers[12] = length 18, hash 1B081BD1 + buffers[13] = length 28, hash 2700AF + buffers[14] = length 22, hash 6D292D94 + buffers[15] = length 18, hash D646C05A + buffers[16] = length 18, hash 14BB0F8E + buffers[17] = length 28, hash 5DE2C2B + buffers[18] = length 22, hash 57E81CD0 + buffers[19] = length 18, hash E176AD96 + buffers[20] = length 18, hash 1FEAFCCA + buffers[21] = length 28, hash C163BE68 + buffers[22] = length 22, hash B0C92D0B + buffers[23] = length 18, hash 3B013BD2 + buffers[24] = length 18, hash 79758B06 + buffers[25] = length 28, hash F72EB1A3 + buffers[26] = length 22, hash 9B881C48 + buffers[27] = length 18, hash 4631290E + buffers[28] = length 18, hash 84A57842 + buffers[29] = length 28, hash E1FCF000 + buffers[30] = length 22, hash 359D2D82 + buffers[31] = length 18, hash 62DE0FC9 + buffers[32] = length 18, hash A1525EFD + buffers[33] = length 28, hash 5350E8FA + buffers[34] = length 22, hash EE2060DF + buffers[35] = length 18, hash 77D95125 + buffers[36] = length 18, hash B64DA059 + buffers[37] = length 28, hash ED67B37 + buffers[38] = length 22, hash 4701711B + buffers[39] = length 18, hash D163DF61 + buffers[40] = length 18, hash FD82E95 + buffers[41] = length 28, hash 44A16E72 + buffers[42] = length 22, hash 31C06057 + buffers[43] = length 18, hash DC93CC9D + buffers[44] = length 18, hash 1B081BD1 + buffers[45] = length 28, hash 2700AF + buffers[46] = length 22, hash 6D292D94 + buffers[47] = length 18, hash D646C05A + buffers[48] = length 18, hash 14BB0F8E + buffers[49] = length 28, hash 5DE2C2B + buffers[50] = length 22, hash 57E81CD0 + buffers[51] = length 18, hash E176AD96 + buffers[52] = length 18, hash 1FEAFCCA + buffers[53] = length 28, hash C163BE68 + buffers[54] = length 22, hash B0C92D0B + buffers[55] = length 18, hash 3B013BD2 + buffers[56] = length 18, hash 79758B06 + buffers[57] = length 28, hash F72EB1A3 + buffers[58] = length 22, hash 9B881C48 + buffers[59] = length 18, hash 4631290E + buffers[60] = length 18, hash 84A57842 + buffers[61] = length 28, hash E1FCF000 + buffers[62] = length 22, hash 359D2D82 + buffers[63] = length 18, hash 62DE0FC9 + buffers[64] = length 18, hash A1525EFD + buffers[65] = length 28, hash 5350E8FA + buffers[66] = length 22, hash EE2060DF + buffers[67] = length 18, hash 77D95125 + buffers[68] = length 18, hash B64DA059 + buffers[69] = length 28, hash ED67B37 + buffers[70] = length 22, hash 4701711B + buffers[71] = length 18, hash D163DF61 + buffers[72] = length 18, hash FD82E95 + buffers[73] = length 28, hash 44A16E72 + buffers[74] = length 22, hash 31C06057 + buffers[75] = length 18, hash DC93CC9D + buffers[76] = length 18, hash 1B081BD1 + buffers[77] = length 28, hash 2700AF + buffers[78] = length 22, hash 6D292D94 + buffers[79] = length 18, hash D646C05A + buffers[80] = length 18, hash 14BB0F8E + buffers[81] = length 28, hash 5DE2C2B + buffers[82] = length 22, hash 57E81CD0 + buffers[83] = length 18, hash E176AD96 + buffers[84] = length 18, hash 1FEAFCCA + buffers[85] = length 28, hash C163BE68 + buffers[86] = length 22, hash B0C92D0B + buffers[87] = length 18, hash 3B013BD2 + buffers[88] = length 18, hash 79758B06 + buffers[89] = length 28, hash F72EB1A3 + buffers[90] = length 22, hash 9B881C48 + buffers[91] = length 18, hash 4631290E + buffers[92] = length 18, hash 84A57842 + buffers[93] = length 33, hash AF5CF49E + buffers[94] = length 22, hash 359D2D82 + buffers[95] = length 18, hash 62DE0FC9 + buffers[96] = length 18, hash A1525EFD + buffers[97] = length 33, hash F4C6DE46 + buffers[98] = length 22, hash EE2060DF + buffers[99] = length 18, hash 77D95125 + buffers[100] = length 18, hash B64DA059 + buffers[101] = length 28, hash ED67B37 + buffers[102] = length 22, hash 4701711B + buffers[103] = length 18, hash D163DF61 + buffers[104] = length 18, hash FD82E95 + buffers[105] = length 28, hash 44A16E72 + buffers[106] = length 22, hash 31C06057 + buffers[107] = length 18, hash DC93CC9D + buffers[108] = length 18, hash 1B081BD1 + buffers[109] = length 28, hash 2700AF + buffers[110] = length 22, hash 6D292D94 + buffers[111] = length 18, hash D646C05A + buffers[112] = length 18, hash 14BB0F8E + buffers[113] = length 27, hash 5292D9E + buffers[114] = length 22, hash 57E81CD0 + buffers[115] = length 18, hash E176AD96 + buffers[116] = length 18, hash 1FEAFCCA + buffers[117] = length 26, hash B0CAA4C9 + buffers[118] = length 22, hash B0C92D0B + buffers[119] = length 18, hash 3B013BD2 + buffers[120] = length 18, hash 79758B06 + buffers[121] = length 26, hash C63A1445 + buffers[122] = length 22, hash 9B881C48 + buffers[123] = length 18, hash 4631290E + buffers[124] = length 18, hash 84A57842 + buffers[125] = length 0, hash 1 +TextOutput: + Subtitle[0]: + Cues = [] + Subtitle[1]: + Cue[0]: + text = This is the first subtitle. + textAlignment = ALIGN_CENTER + line = -1.0 + lineType = 1 + lineAnchor = 0 + position = 0.5 + positionAnchor = 1 + size = 1.0 + Subtitle[2]: + Cues = [] + Subtitle[3]: + Cue[0]: + text = This is the second subtitle. + textAlignment = ALIGN_CENTER + line = -1.0 + lineType = 1 + lineAnchor = 0 + position = 0.5 + positionAnchor = 1 + size = 1.0 + Subtitle[4]: + Cues = []