From abfe7a23143ec4429083eefd40846f8a50646eb1 Mon Sep 17 00:00:00 2001 From: christosts Date: Mon, 3 Aug 2020 11:49:42 +0100 Subject: [PATCH] Support clip start/end points in demo app Demo app supports clip start/end points and demonstrates manual ad insertions. PiperOrigin-RevId: 324574358 --- RELEASENOTES.md | 2 + demos/main/src/main/assets/media.exolist.json | 17 +++++++ .../android/exoplayer2/demo/IntentUtil.java | 45 ++++++++++++++----- .../demo/SampleChooserActivity.java | 6 +++ 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 669bae2013..17a8fb55d5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -262,6 +262,8 @@ companion ad slots without accessing the `AdDisplayContainer`. * Add missing notification of `VideoAdPlayerCallback.onLoaded`. * Demo app: + * Support clip start/end points in `exolist.json` and demostrate manual ad + insertion. * Retain previous position in list of samples. * Replace the `extensions` variant with `decoderExtensions` and make the demo app use the Cronet and IMA extensions by default. diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index 940f762b5d..db47aa77dc 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -397,6 +397,23 @@ "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" } ] + }, + { + "name": "Manual ad insertion", + "playlist": [ + { + "uri": "https://html5demos.com/assets/dizzy.mp4", + "clip_end_position_ms": 10000 + }, + { + "uri": "https://storage.googleapis.com/exoplayer-test-media-1/mp4/frame-counter-one-hour.mp4", + "clip_end_position_ms": 5000 + }, + { + "uri": "https://html5demos.com/assets/dizzy.mp4", + "clip_start_position_ms": 10000 + } + ] } ] }, diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 4656ca79ac..312055e65a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -62,6 +62,8 @@ public class IntentUtil { public static final String URI_EXTRA = "uri"; public static final String IS_LIVE_EXTRA = "is_live"; public static final String MIME_TYPE_EXTRA = "mime_type"; + public static final String START_POSITION_MS_EXTRA = "start_position_ms"; + public static final String END_POSITION_MS_EXTRA = "end_position_ms"; // For backwards compatibility only. public static final String EXTENSION_EXTRA = "extension"; @@ -87,13 +89,11 @@ public class IntentUtil { if (ACTION_VIEW_LIST.equals(intent.getAction())) { int index = 0; while (intent.hasExtra(URI_EXTRA + "_" + index)) { - Uri uri = Uri.parse(intent.getStringExtra(URI_EXTRA + "_" + index)); + String extrasSuffix = "_" + index; + Uri uri = Uri.parse(intent.getStringExtra(URI_EXTRA + extrasSuffix)); mediaItems.add( createMediaItemFromIntent( - uri, - intent, - /* extrasKeySuffix= */ "_" + index, - downloadTracker.getDownloadRequest(uri))); + uri, intent, extrasSuffix, downloadTracker.getDownloadRequest(uri))); index++; } } else { @@ -109,17 +109,22 @@ public class IntentUtil { public static void addToIntent(List mediaItems, Intent intent) { Assertions.checkArgument(!mediaItems.isEmpty()); if (mediaItems.size() == 1) { - MediaItem.PlaybackProperties playbackProperties = - checkNotNull(mediaItems.get(0).playbackProperties); - intent.setAction(IntentUtil.ACTION_VIEW).setData(playbackProperties.uri); + MediaItem mediaItem = mediaItems.get(0); + MediaItem.PlaybackProperties playbackProperties = checkNotNull(mediaItem.playbackProperties); + intent.setAction(ACTION_VIEW).setData(mediaItem.playbackProperties.uri); addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ ""); + addClippingPropertiesToIntent( + mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ ""); } else { - intent.setAction(IntentUtil.ACTION_VIEW_LIST); + intent.setAction(ACTION_VIEW_LIST); for (int i = 0; i < mediaItems.size(); i++) { + MediaItem mediaItem = mediaItems.get(i); MediaItem.PlaybackProperties playbackProperties = - checkNotNull(mediaItems.get(i).playbackProperties); - intent.putExtra(IntentUtil.URI_EXTRA + ("_" + i), playbackProperties.uri.toString()); + checkNotNull(mediaItem.playbackProperties); + intent.putExtra(URI_EXTRA + ("_" + i), playbackProperties.uri.toString()); addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ "_" + i); + addClippingPropertiesToIntent( + mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ "_" + i); } } } @@ -156,7 +161,12 @@ public class IntentUtil { .setCustomCacheKey(downloadRequest != null ? downloadRequest.customCacheKey : null) .setMimeType(mimeType) .setAdTagUri(intent.getStringExtra(AD_TAG_URI_EXTRA + extrasKeySuffix)) - .setSubtitles(createSubtitlesFromIntent(intent, extrasKeySuffix)); + .setSubtitles(createSubtitlesFromIntent(intent, extrasKeySuffix)) + .setClipStartPositionMs( + intent.getLongExtra(START_POSITION_MS_EXTRA + extrasKeySuffix, 0)) + .setClipEndPositionMs( + intent.getLongExtra(END_POSITION_MS_EXTRA + extrasKeySuffix, C.TIME_END_OF_SOURCE)); + return populateDrmPropertiesFromIntent(builder, intent, extrasKeySuffix).build(); } @@ -279,4 +289,15 @@ public class IntentUtil { intent.putExtra( DRM_SESSION_FOR_CLEAR_TYPES_EXTRA + extrasKeySuffix, typeStrings.toArray(new String[0])); } + + private static void addClippingPropertiesToIntent( + MediaItem.ClippingProperties clippingProperties, Intent intent, String extrasKeySuffix) { + if (clippingProperties.startPositionMs != 0) { + intent.putExtra( + START_POSITION_MS_EXTRA + extrasKeySuffix, clippingProperties.startPositionMs); + } + if (clippingProperties.endPositionMs != C.TIME_END_OF_SOURCE) { + intent.putExtra(END_POSITION_MS_EXTRA + extrasKeySuffix, clippingProperties.endPositionMs); + } + } } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index b944471d58..a7b125ab6d 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -412,6 +412,12 @@ public class SampleChooserActivity extends AppCompatActivity } reader.endArray(); break; + case "clip_start_position_ms": + mediaItem.setClipStartPositionMs(reader.nextLong()); + break; + case "clip_end_position_ms": + mediaItem.setClipEndPositionMs(reader.nextLong()); + break; case "ad_tag_uri": mediaItem.setAdTagUri(reader.nextString()); break;