Commit 2fe478ad by eguven Committed by Oliver Woodman

Invert DashHostedTest and inner class Builder to make the design more natural

Builder class was renamed to DashTestRunner and DashHostedTest moved
into it as an inner class.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=150307988
parent 9b0d24c9
......@@ -40,40 +40,54 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.build();
private static final ActionSchedule RENDERER_DISABLING_SCHEDULE = new ActionSchedule.Builder(TAG)
// Wait 10 seconds, disable the video renderer, wait another 10 seconds and enable it again.
.delay(10000).disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.delay(10000).enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.delay(10000).disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.delay(10000).enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
// Ditto for the audio renderer.
.delay(10000).disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.delay(10000).enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.delay(10000).disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.delay(10000).enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
// Wait 10 seconds, then disable and enable the video renderer 5 times in quick succession.
.delay(10000).disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.VIDEO_RENDERER_INDEX)
.delay(10000).disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.VIDEO_RENDERER_INDEX)
// Ditto for the audio renderer.
.delay(10000).disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.disableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.enableRenderer(DashHostedTest.AUDIO_RENDERER_INDEX)
.delay(10000).disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.disableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.enableRenderer(DashTestRunner.AUDIO_RENDERER_INDEX)
.delay(10000).seek(120000)
.build();
private DashTestRunner testRunner;
public DashTest() {
super(HostActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
testRunner = new DashTestRunner(TAG, getActivity(), getInstrumentation());
}
@Override
protected void tearDown() throws Exception {
testRunner = null;
super.tearDown();
}
// H264 CDD.
public void testH264Fixed() {
......@@ -81,13 +95,13 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h264_fixed")
.setManifestUrl(DashTestData.H264_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID, DashTestData.H264_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH264Adaptive() throws DecoderQueryException {
......@@ -95,14 +109,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h264_adaptive")
.setManifestUrl(DashTestData.H264_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH264AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -111,7 +125,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
return;
}
final String streamName = "test_h264_adaptive_with_seeking";
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName(streamName)
.setManifestUrl(DashTestData.H264_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -119,7 +133,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH264AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -128,7 +142,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
return;
}
final String streamName = "test_h264_adaptive_with_renderer_disabling";
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName(streamName)
.setManifestUrl(DashTestData.H264_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -136,7 +150,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// H265 CDD.
......@@ -146,13 +160,13 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h265_fixed")
.setManifestUrl(DashTestData.H265_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID, DashTestData.H265_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH265Adaptive() throws DecoderQueryException {
......@@ -160,14 +174,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h265_adaptive")
.setManifestUrl(DashTestData.H265_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH265AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -175,7 +189,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h265_adaptive_with_seeking")
.setManifestUrl(DashTestData.H265_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -183,7 +197,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testH265AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -191,7 +205,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_h265_adaptive_with_renderer_disabling")
.setManifestUrl(DashTestData.H265_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -199,7 +213,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// VP9 (CDD).
......@@ -209,14 +223,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_vp9_fixed_360p")
.setManifestUrl(DashTestData.VP9_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.VP9_VORBIS_AUDIO_REPRESENTATION_ID,
DashTestData.VP9_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testVp9Adaptive() throws DecoderQueryException {
......@@ -224,14 +238,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_vp9_adaptive")
.setManifestUrl(DashTestData.VP9_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.VP9_VORBIS_AUDIO_REPRESENTATION_ID,
DashTestData.VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testVp9AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -239,7 +253,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_vp9_adaptive_with_seeking")
.setManifestUrl(DashTestData.VP9_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -247,7 +261,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.VP9_VORBIS_AUDIO_REPRESENTATION_ID,
DashTestData.VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testVp9AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -255,7 +269,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_vp9_adaptive_with_renderer_disabling")
.setManifestUrl(DashTestData.VP9_MANIFEST)
.setFullPlaybackNoSeeking(false)
......@@ -263,7 +277,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.VP9_VORBIS_AUDIO_REPRESENTATION_ID,
DashTestData.VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// H264: Other frame-rates for output buffer count assertions.
......@@ -274,14 +288,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_23fps_h264_fixed")
.setManifestUrl(DashTestData.H264_23_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_BASELINE_480P_23FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// 24 fps.
......@@ -290,14 +304,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_24fps_h264_fixed")
.setManifestUrl(DashTestData.H264_24_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_BASELINE_480P_24FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// 29.97 fps.
......@@ -306,14 +320,14 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_29fps_h264_fixed")
.setManifestUrl(DashTestData.H264_29_MANIFEST)
.setFullPlaybackNoSeeking(true)
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.AAC_AUDIO_REPRESENTATION_ID,
DashTestData.H264_BASELINE_480P_29FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// Widevine encrypted media tests.
......@@ -324,7 +338,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h264_fixed")
.setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -332,7 +346,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH264Adaptive() throws DecoderQueryException {
......@@ -340,7 +354,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h264_adaptive")
.setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -348,7 +362,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH264AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -356,7 +370,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h264_adaptive_with_seeking")
.setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -365,7 +379,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH264AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -373,7 +387,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h264_adaptive_with_renderer_disabling")
.setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -382,7 +396,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// H265 CDD.
......@@ -392,7 +406,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h265_fixed")
.setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H265)
......@@ -400,7 +414,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H265_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH265Adaptive() throws DecoderQueryException {
......@@ -408,7 +422,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h265_adaptive")
.setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H265)
......@@ -416,7 +430,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH265AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -424,7 +438,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h265_adaptive_with_seeking")
.setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H265)
......@@ -433,7 +447,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineH265AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -441,7 +455,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_h265_adaptive_with_renderer_disabling")
.setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H265)
......@@ -450,7 +464,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H265_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// VP9 (CDD).
......@@ -460,7 +474,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_vp9_fixed_360p")
.setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_VP9)
......@@ -468,7 +482,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_VP9_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_VP9_CDD_FIXED)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineVp9Adaptive() throws DecoderQueryException {
......@@ -476,7 +490,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_vp9_adaptive")
.setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_VP9)
......@@ -484,7 +498,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(true)
.setAudioVideoFormats(DashTestData.WIDEVINE_VP9_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineVp9AdaptiveWithSeeking() throws DecoderQueryException {
......@@ -492,7 +506,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_vp9_adaptive_with_seeking")
.setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_VP9)
......@@ -501,7 +515,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(SEEKING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_VP9_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
public void testWidevineVp9AdaptiveWithRendererDisabling() throws DecoderQueryException {
......@@ -509,7 +523,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_vp9_adaptive_with_renderer_disabling")
.setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_VP9)
......@@ -518,7 +532,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setActionSchedule(RENDERER_DISABLING_SCHEDULE)
.setAudioVideoFormats(DashTestData.WIDEVINE_VP9_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_VP9_CDD_ADAPTIVE)
.runTest(getActivity(), getInstrumentation());
.run();
}
// H264: Other frame-rates for output buffer count assertions.
......@@ -529,7 +543,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_23fps_h264_fixed")
.setManifestUrl(DashTestData.WIDEVINE_H264_23_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -537,7 +551,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_BASELINE_480P_23FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// 24 fps.
......@@ -546,7 +560,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_24fps_h264_fixed")
.setManifestUrl(DashTestData.WIDEVINE_H264_24_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -554,7 +568,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_BASELINE_480P_24FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// 29.97 fps.
......@@ -563,7 +577,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
// Pass.
return;
}
new DashHostedTest.Builder(TAG)
testRunner
.setStreamName("test_widevine_29fps_h264_fixed")
.setManifestUrl(DashTestData.WIDEVINE_H264_29_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -571,7 +585,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
.setCanIncludeAdditionalVideoFormats(false)
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_BASELINE_480P_29FPS_VIDEO_REPRESENTATION_ID)
.runTest(getActivity(), getInstrumentation());
.run();
}
// Internal.
......
......@@ -137,6 +137,16 @@ public final class DashTestData {
WIDEVINE_VP9_180P_VIDEO_REPRESENTATION_ID,
WIDEVINE_VP9_360P_VIDEO_REPRESENTATION_ID};
private static final String WIDEVINE_LICENSE_URL =
"https://proxy.uat.widevine.com/proxy?provider=widevine_test&video_id=";
private static final String WIDEVINE_SW_CRYPTO_CONTENT_ID = "exoplayer_test_1";
private static final String WIDEVINE_HW_SECURE_DECODE_CONTENT_ID = "exoplayer_test_2";
public static String getWidevineLicenseUrl(boolean useL1Widevine) {
return WIDEVINE_LICENSE_URL
+ (useL1Widevine ? WIDEVINE_HW_SECURE_DECODE_CONTENT_ID : WIDEVINE_SW_CRYPTO_CONTENT_ID);
}
private DashTestData() {
}
......
......@@ -66,140 +66,47 @@ import java.util.Arrays;
import java.util.List;
import junit.framework.AssertionFailedError;
/**
* A {@link HostedTest} for DASH playback tests.
*/
@TargetApi(16)
public final class DashHostedTest extends ExoHostedTest {
/** {@link DashHostedTest} builder. */
public static final class Builder {
private static final long TEST_TIMEOUT_MS = 5 * 60 * 1000;
private static final String REPORT_NAME = "GtsExoPlayerTestCases";
private static final String REPORT_OBJECT_NAME = "playbacktest";
// Whether adaptive tests should enable video formats beyond those mandated by the Android CDD
// if the device advertises support for them.
private static final boolean ALLOW_ADDITIONAL_VIDEO_FORMATS = Util.SDK_INT >= 24;
private final String tag;
private String streamName;
private boolean fullPlaybackNoSeeking;
private String audioFormat;
private boolean canIncludeAdditionalVideoFormats;
private ActionSchedule actionSchedule;
private byte[] offlineLicenseKeySetId;
private String[] videoFormats;
private String manifestUrl;
private boolean useL1Widevine;
private String widevineLicenseUrl;
public Builder(String tag) {
this.tag = tag;
}
public Builder setStreamName(String streamName) {
this.streamName = streamName;
return this;
}
public Builder setFullPlaybackNoSeeking(boolean fullPlaybackNoSeeking) {
this.fullPlaybackNoSeeking = fullPlaybackNoSeeking;
return this;
}
public Builder setCanIncludeAdditionalVideoFormats(
boolean canIncludeAdditionalVideoFormats) {
this.canIncludeAdditionalVideoFormats = canIncludeAdditionalVideoFormats
&& ALLOW_ADDITIONAL_VIDEO_FORMATS;
return this;
}
public Builder setActionSchedule(ActionSchedule actionSchedule) {
this.actionSchedule = actionSchedule;
return this;
}
public Builder setOfflineLicenseKeySetId(byte[] offlineLicenseKeySetId) {
this.offlineLicenseKeySetId = offlineLicenseKeySetId;
return this;
}
/** {@link DashHostedTest} builder. */
public final class DashTestRunner {
public Builder setAudioVideoFormats(String audioFormat, String... videoFormats) {
this.audioFormat = audioFormat;
this.videoFormats = videoFormats;
return this;
}
public Builder setManifestUrl(String manifestUrl) {
this.manifestUrl = manifestUrl;
return this;
}
public Builder setWidevineMimeType(String mimeType) {
this.useL1Widevine = isL1WidevineAvailable(mimeType);
this.widevineLicenseUrl = getWidevineLicenseUrl(useL1Widevine);
return this;
}
static final int VIDEO_RENDERER_INDEX = 0;
static final int AUDIO_RENDERER_INDEX = 1;
private DashHostedTest createDashHostedTest(boolean canIncludeAdditionalVideoFormats,
boolean isCddLimitedRetry, Instrumentation instrumentation) {
MetricsLogger metricsLogger = MetricsLogger.Factory.createDefault(instrumentation, tag,
REPORT_NAME, REPORT_OBJECT_NAME);
return new DashHostedTest(tag, streamName, manifestUrl, metricsLogger, fullPlaybackNoSeeking,
audioFormat, canIncludeAdditionalVideoFormats, isCddLimitedRetry, actionSchedule,
offlineLicenseKeySetId, widevineLicenseUrl, useL1Widevine, videoFormats);
}
private static final long TEST_TIMEOUT_MS = 5 * 60 * 1000;
public void runTest(HostActivity activity, Instrumentation instrumentation) {
DashHostedTest test = createDashHostedTest(canIncludeAdditionalVideoFormats, false,
instrumentation);
activity.runTest(test, TEST_TIMEOUT_MS);
// Retry test exactly once if adaptive test fails due to excessive dropped buffers when
// playing non-CDD required formats (b/28220076).
if (test.needsCddLimitedRetry) {
activity.runTest(createDashHostedTest(false, true, instrumentation), TEST_TIMEOUT_MS);
}
}
private static final String REPORT_NAME = "GtsExoPlayerTestCases";
private static final String REPORT_OBJECT_NAME = "playbacktest";
}
// Whether adaptive tests should enable video formats beyond those mandated by the Android CDD
// if the device advertises support for them.
private static final boolean ALLOW_ADDITIONAL_VIDEO_FORMATS = Util.SDK_INT >= 24;
private static final String AUDIO_TAG_SUFFIX = ":Audio";
private static final String VIDEO_TAG_SUFFIX = ":Video";
static final int VIDEO_RENDERER_INDEX = 0;
static final int AUDIO_RENDERER_INDEX = 1;
private static final int MIN_LOADABLE_RETRY_COUNT = 10;
private static final int MAX_CONSECUTIVE_DROPPED_VIDEO_FRAMES = 10;
private static final float MAX_DROPPED_VIDEO_FRAME_FRACTION = 0.01f;
private static final String WIDEVINE_LICENSE_URL =
"https://proxy.uat.widevine.com/proxy?provider=widevine_test&video_id=";
private static final String WIDEVINE_SW_CRYPTO_CONTENT_ID = "exoplayer_test_1";
private static final String WIDEVINE_HW_SECURE_DECODE_CONTENT_ID = "exoplayer_test_2";
private static final String WIDEVINE_SECURITY_LEVEL_1 = "L1";
private static final String WIDEVINE_SECURITY_LEVEL_3 = "L3";
private static final String SECURITY_LEVEL_PROPERTY = "securityLevel";
private final String streamName;
private final String manifestUrl;
private final MetricsLogger metricsLogger;
private final boolean fullPlaybackNoSeeking;
private final boolean isCddLimitedRetry;
private final DashTestTrackSelector trackSelector;
private final byte[] offlineLicenseKeySetId;
private final String widevineLicenseUrl;
private final boolean useL1Widevine;
boolean needsCddLimitedRetry;
public static String getWidevineLicenseUrl(boolean useL1Widevine) {
return WIDEVINE_LICENSE_URL
+ (useL1Widevine ? WIDEVINE_HW_SECURE_DECODE_CONTENT_ID : WIDEVINE_SW_CRYPTO_CONTENT_ID);
}
private final String tag;
private final HostActivity activity;
private final Instrumentation instrumentation;
private String streamName;
private boolean fullPlaybackNoSeeking;
private String audioFormat;
private boolean canIncludeAdditionalVideoFormats;
private ActionSchedule actionSchedule;
private byte[] offlineLicenseKeySetId;
private String[] videoFormats;
private String manifestUrl;
private boolean useL1Widevine;
private String widevineLicenseUrl;
private DataSource.Factory dataSourceFactory;
@TargetApi(18)
@SuppressWarnings("ResourceType")
......@@ -218,146 +125,249 @@ public final class DashHostedTest extends ExoHostedTest {
}
}
/**
* @param tag A tag to use for logging.
* @param streamName The name of the test stream for metric logging.
* @param manifestUrl The manifest url.
* @param metricsLogger Logger to log metrics from the test.
* @param fullPlaybackNoSeeking Whether the test will play the entire source with no seeking.
* @param audioFormat The audio format.
* @param canIncludeAdditionalVideoFormats Whether to use video formats in addition to those
* listed in the videoFormats argument, if the device is capable of playing them.
* @param isCddLimitedRetry Whether this is a CDD limited retry following a previous failure.
* @param actionSchedule The action schedule for the test.
* @param offlineLicenseKeySetId The key set id of the license to be used.
* @param widevineLicenseUrl If the video is Widevine encrypted, this is the license url
* otherwise null.
* @param useL1Widevine Whether to use L1 Widevine.
* @param videoFormats The video formats.
*/
private DashHostedTest(String tag, String streamName, String manifestUrl,
MetricsLogger metricsLogger, boolean fullPlaybackNoSeeking, String audioFormat,
boolean canIncludeAdditionalVideoFormats, boolean isCddLimitedRetry,
ActionSchedule actionSchedule, byte[] offlineLicenseKeySetId, String widevineLicenseUrl,
boolean useL1Widevine, String... videoFormats) {
super(tag, fullPlaybackNoSeeking);
Assertions.checkArgument(!(isCddLimitedRetry && canIncludeAdditionalVideoFormats));
public DashTestRunner(String tag, HostActivity activity, Instrumentation instrumentation) {
this.tag = tag;
this.activity = activity;
this.instrumentation = instrumentation;
}
public DashTestRunner setStreamName(String streamName) {
this.streamName = streamName;
this.manifestUrl = manifestUrl;
this.metricsLogger = metricsLogger;
return this;
}
public DashTestRunner setFullPlaybackNoSeeking(boolean fullPlaybackNoSeeking) {
this.fullPlaybackNoSeeking = fullPlaybackNoSeeking;
this.isCddLimitedRetry = isCddLimitedRetry;
return this;
}
public DashTestRunner setCanIncludeAdditionalVideoFormats(
boolean canIncludeAdditionalVideoFormats) {
this.canIncludeAdditionalVideoFormats = canIncludeAdditionalVideoFormats
&& ALLOW_ADDITIONAL_VIDEO_FORMATS;
return this;
}
public DashTestRunner setActionSchedule(ActionSchedule actionSchedule) {
this.actionSchedule = actionSchedule;
return this;
}
public DashTestRunner setOfflineLicenseKeySetId(byte[] offlineLicenseKeySetId) {
this.offlineLicenseKeySetId = offlineLicenseKeySetId;
this.widevineLicenseUrl = widevineLicenseUrl;
this.useL1Widevine = useL1Widevine;
trackSelector = new DashTestTrackSelector(tag, audioFormat, videoFormats,
canIncludeAdditionalVideoFormats);
if (actionSchedule != null) {
setSchedule(actionSchedule);
}
return this;
}
@Override
protected MappingTrackSelector buildTrackSelector(HostActivity host,
BandwidthMeter bandwidthMeter) {
return trackSelector;
public DashTestRunner setAudioVideoFormats(String audioFormat, String... videoFormats) {
this.audioFormat = audioFormat;
this.videoFormats = videoFormats;
return this;
}
@Override
protected DefaultDrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(
final String userAgent) {
if (widevineLicenseUrl == null) {
return null;
}
try {
MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl,
new DefaultHttpDataSourceFactory(userAgent));
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager =
DefaultDrmSessionManager.newWidevineInstance(drmCallback, null, null, null);
if (!useL1Widevine) {
drmSessionManager.setPropertyString(
SECURITY_LEVEL_PROPERTY, WIDEVINE_SECURITY_LEVEL_3);
}
if (offlineLicenseKeySetId != null) {
drmSessionManager.setMode(DefaultDrmSessionManager.MODE_PLAYBACK,
offlineLicenseKeySetId);
}
return drmSessionManager;
} catch (UnsupportedDrmException e) {
throw new IllegalStateException(e);
}
public DashTestRunner setManifestUrl(String manifestUrl) {
this.manifestUrl = manifestUrl;
return this;
}
@Override
protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface,
MappingTrackSelector trackSelector,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
SimpleExoPlayer player = new DebugSimpleExoPlayer(host, trackSelector,
new DefaultLoadControl(), drmSessionManager);
player.setVideoSurface(surface);
return player;
public DashTestRunner setWidevineMimeType(String mimeType) {
this.useL1Widevine = isL1WidevineAvailable(mimeType);
this.widevineLicenseUrl = DashTestData.getWidevineLicenseUrl(useL1Widevine);
return this;
}
@Override
protected MediaSource buildSource(HostActivity host, String userAgent,
TransferListener<? super DataSource> mediaTransferListener) {
DataSource.Factory manifestDataSourceFactory = new DefaultDataSourceFactory(host, userAgent);
DataSource.Factory mediaDataSourceFactory = new DefaultDataSourceFactory(host, userAgent,
mediaTransferListener);
Uri manifestUri = Uri.parse(manifestUrl);
DefaultDashChunkSource.Factory chunkSourceFactory = new DefaultDashChunkSource.Factory(
mediaDataSourceFactory);
return new DashMediaSource(manifestUri, manifestDataSourceFactory, chunkSourceFactory,
MIN_LOADABLE_RETRY_COUNT, 0 /* livePresentationDelayMs */, null, null);
public DashTestRunner setDataSourceFactory(DataSource.Factory dataSourceFactory) {
this.dataSourceFactory = dataSourceFactory;
return this;
}
@Override
protected void logMetrics(DecoderCounters audioCounters, DecoderCounters videoCounters) {
metricsLogger.logMetric(MetricsLogger.KEY_TEST_NAME, streamName);
metricsLogger.logMetric(MetricsLogger.KEY_IS_CDD_LIMITED_RETRY, isCddLimitedRetry);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_DROPPED_COUNT,
videoCounters.droppedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_MAX_CONSECUTIVE_FRAMES_DROPPED_COUNT,
videoCounters.maxConsecutiveDroppedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_SKIPPED_COUNT,
videoCounters.skippedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_RENDERED_COUNT,
videoCounters.renderedOutputBufferCount);
metricsLogger.close();
public void run() {
DashHostedTest test = createDashHostedTest(canIncludeAdditionalVideoFormats, false,
instrumentation);
activity.runTest(test, TEST_TIMEOUT_MS);
// Retry test exactly once if adaptive test fails due to excessive dropped buffers when
// playing non-CDD required formats (b/28220076).
if (test.needsCddLimitedRetry) {
activity.runTest(createDashHostedTest(false, true, instrumentation), TEST_TIMEOUT_MS);
}
}
private DashHostedTest createDashHostedTest(boolean canIncludeAdditionalVideoFormats,
boolean isCddLimitedRetry, Instrumentation instrumentation) {
MetricsLogger metricsLogger = MetricsLogger.Factory.createDefault(instrumentation, tag,
REPORT_NAME, REPORT_OBJECT_NAME);
return new DashHostedTest(tag, streamName, manifestUrl, metricsLogger, fullPlaybackNoSeeking,
audioFormat, canIncludeAdditionalVideoFormats, isCddLimitedRetry, actionSchedule,
offlineLicenseKeySetId, widevineLicenseUrl, useL1Widevine, dataSourceFactory,
videoFormats);
}
@Override
protected void assertPassed(DecoderCounters audioCounters, DecoderCounters videoCounters) {
if (fullPlaybackNoSeeking) {
// We shouldn't have skipped any output buffers.
DecoderCountersUtil.assertSkippedOutputBufferCount(tag + AUDIO_TAG_SUFFIX, audioCounters, 0);
DecoderCountersUtil.assertSkippedOutputBufferCount(tag + VIDEO_TAG_SUFFIX, videoCounters, 0);
// We allow one fewer output buffer due to the way that MediaCodecRenderer and the
// underlying decoders handle the end of stream. This should be tightened up in the future.
DecoderCountersUtil.assertTotalOutputBufferCount(tag + AUDIO_TAG_SUFFIX, audioCounters,
audioCounters.inputBufferCount - 1, audioCounters.inputBufferCount);
DecoderCountersUtil.assertTotalOutputBufferCount(tag + VIDEO_TAG_SUFFIX, videoCounters,
videoCounters.inputBufferCount - 1, videoCounters.inputBufferCount);
/**
* A {@link HostedTest} for DASH playback tests.
*/
@TargetApi(16)
private static final class DashHostedTest extends ExoHostedTest {
private final String streamName;
private final String manifestUrl;
private final MetricsLogger metricsLogger;
private final boolean fullPlaybackNoSeeking;
private final boolean isCddLimitedRetry;
private final DashTestTrackSelector trackSelector;
private final byte[] offlineLicenseKeySetId;
private final String widevineLicenseUrl;
private final boolean useL1Widevine;
private final DataSource.Factory dataSourceFactory;
private boolean needsCddLimitedRetry;
/**
* @param tag A tag to use for logging.
* @param streamName The name of the test stream for metric logging.
* @param manifestUrl The manifest url.
* @param metricsLogger Logger to log metrics from the test.
* @param fullPlaybackNoSeeking Whether the test will play the entire source with no seeking.
* @param audioFormat The audio format.
* @param canIncludeAdditionalVideoFormats Whether to use video formats in addition to those
* listed in the videoFormats argument, if the device is capable of playing them.
* @param isCddLimitedRetry Whether this is a CDD limited retry following a previous failure.
* @param actionSchedule The action schedule for the test.
* @param offlineLicenseKeySetId The key set id of the license to be used.
* @param widevineLicenseUrl If the video is Widevine encrypted, this is the license url
* otherwise null.
* @param useL1Widevine Whether to use L1 Widevine.
* @param dataSourceFactory If not null, used to load manifest and media.
* @param videoFormats The video formats.
*/
private DashHostedTest(String tag, String streamName, String manifestUrl,
MetricsLogger metricsLogger, boolean fullPlaybackNoSeeking, String audioFormat,
boolean canIncludeAdditionalVideoFormats, boolean isCddLimitedRetry,
ActionSchedule actionSchedule, byte[] offlineLicenseKeySetId, String widevineLicenseUrl,
boolean useL1Widevine, DataSource.Factory dataSourceFactory, String... videoFormats) {
super(tag, fullPlaybackNoSeeking);
Assertions.checkArgument(!(isCddLimitedRetry && canIncludeAdditionalVideoFormats));
this.streamName = streamName;
this.manifestUrl = manifestUrl;
this.metricsLogger = metricsLogger;
this.fullPlaybackNoSeeking = fullPlaybackNoSeeking;
this.isCddLimitedRetry = isCddLimitedRetry;
this.offlineLicenseKeySetId = offlineLicenseKeySetId;
this.widevineLicenseUrl = widevineLicenseUrl;
this.useL1Widevine = useL1Widevine;
this.dataSourceFactory = dataSourceFactory;
trackSelector = new DashTestTrackSelector(tag, audioFormat, videoFormats,
canIncludeAdditionalVideoFormats);
if (actionSchedule != null) {
setSchedule(actionSchedule);
}
}
try {
int droppedFrameLimit = (int) Math.ceil(MAX_DROPPED_VIDEO_FRAME_FRACTION
* DecoderCountersUtil.getTotalOutputBuffers(videoCounters));
// Assert that performance is acceptable.
// Assert that total dropped frames were within limit.
DecoderCountersUtil.assertDroppedOutputBufferLimit(tag + VIDEO_TAG_SUFFIX, videoCounters,
droppedFrameLimit);
// Assert that consecutive dropped frames were within limit.
DecoderCountersUtil.assertConsecutiveDroppedOutputBufferLimit(tag + VIDEO_TAG_SUFFIX,
videoCounters, MAX_CONSECUTIVE_DROPPED_VIDEO_FRAMES);
} catch (AssertionFailedError e) {
if (trackSelector.includedAdditionalVideoFormats) {
// Retry limiting to CDD mandated formats (b/28220076).
Log.e(tag, "Too many dropped or consecutive dropped frames.", e);
needsCddLimitedRetry = true;
} else {
throw e;
@Override
protected MappingTrackSelector buildTrackSelector(HostActivity host,
BandwidthMeter bandwidthMeter) {
return trackSelector;
}
@Override
protected DefaultDrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(
final String userAgent) {
if (widevineLicenseUrl == null) {
return null;
}
try {
MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl,
new DefaultHttpDataSourceFactory(userAgent));
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager =
DefaultDrmSessionManager.newWidevineInstance(drmCallback, null, null, null);
if (!useL1Widevine) {
drmSessionManager.setPropertyString(
SECURITY_LEVEL_PROPERTY, WIDEVINE_SECURITY_LEVEL_3);
}
if (offlineLicenseKeySetId != null) {
drmSessionManager.setMode(DefaultDrmSessionManager.MODE_PLAYBACK,
offlineLicenseKeySetId);
}
return drmSessionManager;
} catch (UnsupportedDrmException e) {
throw new IllegalStateException(e);
}
}
@Override
protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface,
MappingTrackSelector trackSelector,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
SimpleExoPlayer player = new DebugSimpleExoPlayer(host, trackSelector,
new DefaultLoadControl(), drmSessionManager);
player.setVideoSurface(surface);
return player;
}
@Override
protected MediaSource buildSource(HostActivity host, String userAgent,
TransferListener<? super DataSource> mediaTransferListener) {
DataSource.Factory manifestDataSourceFactory = dataSourceFactory != null
? dataSourceFactory : new DefaultDataSourceFactory(host, userAgent);
DataSource.Factory mediaDataSourceFactory = dataSourceFactory != null
? dataSourceFactory
: new DefaultDataSourceFactory(host, userAgent, mediaTransferListener);
Uri manifestUri = Uri.parse(manifestUrl);
DefaultDashChunkSource.Factory chunkSourceFactory = new DefaultDashChunkSource.Factory(
mediaDataSourceFactory);
return new DashMediaSource(manifestUri, manifestDataSourceFactory, chunkSourceFactory,
MIN_LOADABLE_RETRY_COUNT, 0 /* livePresentationDelayMs */, null, null);
}
@Override
protected void logMetrics(DecoderCounters audioCounters, DecoderCounters videoCounters) {
metricsLogger.logMetric(MetricsLogger.KEY_TEST_NAME, streamName);
metricsLogger.logMetric(MetricsLogger.KEY_IS_CDD_LIMITED_RETRY, isCddLimitedRetry);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_DROPPED_COUNT,
videoCounters.droppedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_MAX_CONSECUTIVE_FRAMES_DROPPED_COUNT,
videoCounters.maxConsecutiveDroppedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_SKIPPED_COUNT,
videoCounters.skippedOutputBufferCount);
metricsLogger.logMetric(MetricsLogger.KEY_FRAMES_RENDERED_COUNT,
videoCounters.renderedOutputBufferCount);
metricsLogger.close();
}
@Override
protected void assertPassed(DecoderCounters audioCounters, DecoderCounters videoCounters) {
if (fullPlaybackNoSeeking) {
// We shouldn't have skipped any output buffers.
DecoderCountersUtil
.assertSkippedOutputBufferCount(tag + AUDIO_TAG_SUFFIX, audioCounters, 0);
DecoderCountersUtil
.assertSkippedOutputBufferCount(tag + VIDEO_TAG_SUFFIX, videoCounters, 0);
// We allow one fewer output buffer due to the way that MediaCodecRenderer and the
// underlying decoders handle the end of stream. This should be tightened up in the future.
DecoderCountersUtil.assertTotalOutputBufferCount(tag + AUDIO_TAG_SUFFIX, audioCounters,
audioCounters.inputBufferCount - 1, audioCounters.inputBufferCount);
DecoderCountersUtil.assertTotalOutputBufferCount(tag + VIDEO_TAG_SUFFIX, videoCounters,
videoCounters.inputBufferCount - 1, videoCounters.inputBufferCount);
}
try {
int droppedFrameLimit = (int) Math.ceil(MAX_DROPPED_VIDEO_FRAME_FRACTION
* DecoderCountersUtil.getTotalOutputBuffers(videoCounters));
// Assert that performance is acceptable.
// Assert that total dropped frames were within limit.
DecoderCountersUtil.assertDroppedOutputBufferLimit(tag + VIDEO_TAG_SUFFIX, videoCounters,
droppedFrameLimit);
// Assert that consecutive dropped frames were within limit.
DecoderCountersUtil.assertConsecutiveDroppedOutputBufferLimit(tag + VIDEO_TAG_SUFFIX,
videoCounters, MAX_CONSECUTIVE_DROPPED_VIDEO_FRAMES);
} catch (AssertionFailedError e) {
if (trackSelector.includedAdditionalVideoFormats) {
// Retry limiting to CDD mandated formats (b/28220076).
Log.e(tag, "Too many dropped or consecutive dropped frames.", e);
needsCddLimitedRetry = true;
} else {
throw e;
}
}
}
}
private static final class DashTestTrackSelector extends MappingTrackSelector {
......
......@@ -37,7 +37,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
private static final String TAG = "DashWidevineOfflineTest";
private static final String USER_AGENT = "ExoPlayerPlaybackTests";
private DashHostedTest.Builder builder;
private DashTestRunner testRunner;
private DefaultHttpDataSourceFactory httpDataSourceFactory;
private OfflineLicenseHelper<FrameworkMediaCrypto> offlineLicenseHelper;
private byte[] offlineLicenseKeySetId;
......@@ -49,7 +49,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
@Override
protected void setUp() throws Exception {
super.setUp();
builder = new DashHostedTest.Builder(TAG)
testRunner = new DashTestRunner(TAG, getActivity(), getInstrumentation())
.setStreamName("test_widevine_h264_fixed_offline")
.setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST)
.setWidevineMimeType(MimeTypes.VIDEO_H264)
......@@ -58,8 +58,8 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
.setAudioVideoFormats(DashTestData.WIDEVINE_AAC_AUDIO_REPRESENTATION_ID,
DashTestData.WIDEVINE_H264_CDD_FIXED);
boolean useL1Widevine = DashHostedTest.isL1WidevineAvailable(MimeTypes.VIDEO_H264);
String widevineLicenseUrl = DashHostedTest.getWidevineLicenseUrl(useL1Widevine);
boolean useL1Widevine = DashTestRunner.isL1WidevineAvailable(MimeTypes.VIDEO_H264);
String widevineLicenseUrl = DashTestData.getWidevineLicenseUrl(useL1Widevine);
httpDataSourceFactory = new DefaultHttpDataSourceFactory(USER_AGENT);
offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance(widevineLicenseUrl,
httpDataSourceFactory);
......@@ -67,12 +67,15 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
@Override
protected void tearDown() throws Exception {
testRunner = null;
if (offlineLicenseKeySetId != null) {
releaseLicense();
}
if (offlineLicenseHelper != null) {
offlineLicenseHelper.releaseResources();
}
offlineLicenseHelper = null;
httpDataSourceFactory = null;
super.tearDown();
}
......@@ -83,7 +86,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
return; // Pass.
}
downloadLicense();
builder.runTest(getActivity(), getInstrumentation());
testRunner.run();
// Renew license after playback should still work
offlineLicenseKeySetId = offlineLicenseHelper.renew(offlineLicenseKeySetId);
......@@ -98,7 +101,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
releaseLicense(); // keySetId no longer valid.
try {
builder.runTest(getActivity(), getInstrumentation());
testRunner.run();
fail("Playback should fail because the license has been released.");
} catch (Throwable e) {
// Get the root cause
......@@ -138,7 +141,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
}
// DefaultDrmSessionManager should renew the license and stream play fine
builder.runTest(getActivity(), getInstrumentation());
testRunner.run();
}
public void testWidevineOfflineLicenseExpiresOnPause() throws Exception {
......@@ -157,9 +160,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
.delay(3000).pause().delay(licenseDuration * 1000 + 2000).play().build();
// DefaultDrmSessionManager should renew the license and stream play fine
builder
.setActionSchedule(schedule)
.runTest(getActivity(), getInstrumentation());
testRunner.setActionSchedule(schedule).run();
}
private void downloadLicense() throws InterruptedException, DrmSessionException, IOException {
......@@ -167,7 +168,7 @@ public final class DashWidevineOfflineTest extends ActivityInstrumentationTestCa
httpDataSourceFactory.createDataSource(), DashTestData.WIDEVINE_H264_MANIFEST);
Assert.assertNotNull(offlineLicenseKeySetId);
Assert.assertTrue(offlineLicenseKeySetId.length > 0);
builder.setOfflineLicenseKeySetId(offlineLicenseKeySetId);
testRunner.setOfflineLicenseKeySetId(offlineLicenseKeySetId);
}
private void releaseLicense() throws DrmSessionException {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment