End to end test for WebVTT sideloaded subtitles

Enable subtitle output in the PlaybackOutput and disable the text
renderer in the MkvPlaybackTest. Add WebvttPlaybackTest to test the
output of side-loaded WebVTT subtitles.

PiperOrigin-RevId: 402526588
This commit is contained in:
christosts 2021-10-12 12:22:15 +01:00 committed by Oliver Woodman
parent a56af3d0e0
commit 4b3cbfd64f
5 changed files with 491 additions and 6 deletions

View File

@ -19,6 +19,7 @@ import android.content.Context;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.view.Surface; import android.view.Surface;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player; 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.CapturingRenderersFactory;
import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.DumpFileAsserts;
import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.testutil.FakeClock;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@ -65,6 +67,19 @@ public final class MkvPlaybackTest {
new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) new ExoPlayer.Builder(applicationContext, capturingRenderersFactory)
.setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setClock(new FakeClock(/* isAutoAdvancing= */ true))
.build(); .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))); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1)));
PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory);

View File

@ -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<String> 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");
}
}

View File

@ -33,6 +33,7 @@ import com.google.android.exoplayer2.testutil.CapturingRenderersFactory;
import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.DumpFileAsserts;
import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.testutil.FakeClock;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -47,6 +48,8 @@ public final class DashPlaybackTest {
// https://github.com/google/ExoPlayer/issues/7985 // https://github.com/google/ExoPlayer/issues/7985
@Test @Test
@Ignore(
"Disabled until subtitles are reliably asserted in robolectric tests [internal b/174661563].")
public void webvttInMp4() throws Exception { public void webvttInMp4() throws Exception {
Context applicationContext = ApplicationProvider.getApplicationContext(); Context applicationContext = ApplicationProvider.getApplicationContext();
CapturingRenderersFactory capturingRenderersFactory = CapturingRenderersFactory capturingRenderersFactory =

View File

@ -17,8 +17,8 @@ package com.google.android.exoplayer2.robolectric;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Player; 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.Metadata;
import com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable; import com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable;
import com.google.android.exoplayer2.metadata.emsg.EventMessage; import com.google.android.exoplayer2.metadata.emsg.EventMessage;
@ -55,8 +55,7 @@ public final class PlaybackOutput implements Dumper.Dumpable {
private final List<Metadata> metadatas; private final List<Metadata> metadatas;
private final List<List<Cue>> subtitles; private final List<List<Cue>> subtitles;
private PlaybackOutput( private PlaybackOutput(ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) {
SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) {
this.capturingRenderersFactory = capturingRenderersFactory; this.capturingRenderersFactory = capturingRenderersFactory;
metadatas = Collections.synchronizedList(new ArrayList<>()); metadatas = Collections.synchronizedList(new ArrayList<>());
@ -73,7 +72,7 @@ public final class PlaybackOutput implements Dumper.Dumpable {
@Override @Override
public void onCues(List<Cue> cues) { public void onCues(List<Cue> 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 {
* <p>Must be called <b>before</b> playback to ensure metadata and text output is captured * <p>Must be called <b>before</b> playback to ensure metadata and text output is captured
* correctly. * 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 * @param capturingRenderersFactory The {@link CapturingRenderersFactory} to capture audio and
* video output from. * video output from.
* @return A new instance that can be used to dump the playback output. * @return A new instance that can be used to dump the playback output.
*/ */
public static PlaybackOutput register( public static PlaybackOutput register(
SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) {
return new PlaybackOutput(player, capturingRenderersFactory); return new PlaybackOutput(player, capturingRenderersFactory);
} }

View File

@ -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 = []