Skip to content

Commit

Permalink
Add test for muxer watchdog timer
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 484298261
  • Loading branch information
kim-vde authored and microkatz committed Oct 31, 2022
1 parent 136addf commit 42057cc
Showing 1 changed file with 100 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import android.content.Context;
import android.media.MediaCrypto;
import android.media.MediaFormat;
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
Expand All @@ -42,6 +43,14 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.extractor.PositionHolder;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.testutil.DumpFileAsserts;
import com.google.android.exoplayer2.testutil.FakeClock;
import com.google.android.exoplayer2.util.MimeTypes;
Expand All @@ -54,7 +63,9 @@
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -477,6 +488,26 @@ public void startTransformation_withAudioMuxerFormatFallback_completesSuccessful
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
}

@Test
public void startTransformation_withSlowOutputSampleRate_completesWithError() throws Exception {
MediaSource.Factory mediaSourceFactory =
new DefaultMediaSourceFactory(
context, new SlowExtractorsFactory(/* delayBetweenReadsMs= */ 10));
Muxer.Factory muxerFactory = new TestMuxerFactory(/* maxDelayBetweenSamplesMs= */ 1);
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false)
.setMediaSourceFactory(mediaSourceFactory)
.setMuxerFactory(muxerFactory)
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);

transformer.startTransformation(mediaItem, outputPath);
TransformationException exception = TransformerTestRunner.runUntilError(transformer);

assertThat(exception).hasCauseThat().isInstanceOf(IllegalStateException.class);
assertThat(exception.errorCode).isEqualTo(TransformationException.ERROR_CODE_MUXING_FAILED);
}

@Test
public void startTransformation_withUnsetMaxDelayBetweenSamples_completesSuccessfully()
throws Exception {
Expand Down Expand Up @@ -897,4 +928,73 @@ public ImmutableList<String> getSupportedSampleMimeTypes(@C.TrackType int trackT
return defaultMuxerFactory.getSupportedSampleMimeTypes(trackType);
}
}

private static final class SlowExtractorsFactory implements ExtractorsFactory {

private final long delayBetweenReadsMs;
private final ExtractorsFactory defaultExtractorsFactory;

public SlowExtractorsFactory(long delayBetweenReadsMs) {
this.delayBetweenReadsMs = delayBetweenReadsMs;
this.defaultExtractorsFactory = new DefaultExtractorsFactory();
}

@Override
public Extractor[] createExtractors() {
return slowDownExtractors(defaultExtractorsFactory.createExtractors());
}

@Override
public Extractor[] createExtractors(Uri uri, Map<String, List<String>> responseHeaders) {
return slowDownExtractors(defaultExtractorsFactory.createExtractors(uri, responseHeaders));
}

private Extractor[] slowDownExtractors(Extractor[] extractors) {
Extractor[] slowExtractors = new Extractor[extractors.length];
Arrays.setAll(slowExtractors, i -> new SlowExtractor(extractors[i], delayBetweenReadsMs));
return slowExtractors;
}

private static final class SlowExtractor implements Extractor {

private final Extractor extractor;
private final long delayBetweenReadsMs;

public SlowExtractor(Extractor extractor, long delayBetweenReadsMs) {
this.extractor = extractor;
this.delayBetweenReadsMs = delayBetweenReadsMs;
}

@Override
public boolean sniff(ExtractorInput input) throws IOException {
return extractor.sniff(input);
}

@Override
public void init(ExtractorOutput output) {
extractor.init(output);
}

@Override
public @ReadResult int read(ExtractorInput input, PositionHolder seekPosition)
throws IOException {
try {
Thread.sleep(delayBetweenReadsMs);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return extractor.read(input, seekPosition);
}

@Override
public void seek(long position, long timeUs) {
extractor.seek(position, timeUs);
}

@Override
public void release() {
extractor.release();
}
}
}
}

0 comments on commit 42057cc

Please sign in to comment.