diff --git a/RELEASENOTES.md b/RELEASENOTES.md index cb3d654e18..2c3e1c78b0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,5 +1,31 @@ # Release notes # +### 2.8.2 ### + +* IMA: Don't advertise support for video/mpeg ad media, as we don't have an + extractor for this ([#4297](https://github.com/google/ExoPlayer/issues/4297)). +* DASH: Fix playback getting stuck when playing representations that have both + sidx atoms and non-zero presentationTimeOffset values. +* HLS: + * Allow injection of custom playlist trackers. + * Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags. +* Mitigate memory leaks when `MediaSource` loads are slow to cancel + ([#4249](https://github.com/google/ExoPlayer/issues/4249)). +* Fix inconsistent `Player.EventListener` invocations for recursive player state + changes ([#4276](https://github.com/google/ExoPlayer/issues/4276)). +* Fix `MediaCodec.native_setSurface` crash on Moto C + ([#4315](https://github.com/google/ExoPlayer/issues/4315)). +* Fix missing whitespace in CEA-608 + ([#3906](https://github.com/google/ExoPlayer/issues/3906)). +* Fix crash downloading HLS media playlists + ([#4396](https://github.com/google/ExoPlayer/issues/4396)). +* Fix a bug where download cancellation was ignored + ([#4403](https://github.com/google/ExoPlayer/issues/4403)). +* Set `METADATA_KEY_TITLE` on media descriptions + ([#4292](https://github.com/google/ExoPlayer/issues/4292)). +* Allow apps to register custom MIME types + ([#4264](https://github.com/google/ExoPlayer/issues/4264)). + ### 2.8.1 ### * HLS: @@ -59,7 +85,7 @@ periods are created, released and being read from. * Support live stream clipping with `ClippingMediaSource`. * Allow setting tags for all media sources in their factories. The tag of the - current window can be retrieved with `ExoPlayer.getCurrentTag`. + current window can be retrieved with `Player.getCurrentTag`. * UI components: * Add support for displaying error messages and a buffering spinner in `PlayerView`. diff --git a/constants.gradle b/constants.gradle index 9068fb8b56..5544173a3c 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.8.1' - releaseVersionCode = 2801 + releaseVersion = '2.8.2' + releaseVersionCode = 2802 // Important: ExoPlayer specifies a minSdkVersion of 14 because various // components provided by the library may be of use on older devices. // However, please note that the core media playback functionality provided @@ -25,7 +25,7 @@ project.ext { buildToolsVersion = '27.0.3' testSupportLibraryVersion = '0.5' supportLibraryVersion = '27.0.0' - playServicesLibraryVersion = '12.0.0' + playServicesLibraryVersion = '15.0.1' dexmakerVersion = '1.2' mockitoVersion = '1.9.5' junitVersion = '4.12' diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 091e483155..565f7e300a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -136,6 +136,7 @@ public class PlayerActivity extends Activity private DataSource.Factory mediaDataSourceFactory; private SimpleExoPlayer player; + private FrameworkMediaDrm mediaDrm; private MediaSource mediaSource; private DefaultTrackSelector trackSelector; private DefaultTrackSelector.Parameters trackSelectorParameters; @@ -487,8 +488,9 @@ public class PlayerActivity extends Activity keyRequestPropertiesArray[i + 1]); } } - return new DefaultDrmSessionManager<>( - uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession); + releaseMediaDrm(); + mediaDrm = FrameworkMediaDrm.newInstance(uuid); + return new DefaultDrmSessionManager<>(uuid, mediaDrm, drmCallback, null, multiSession); } private void releasePlayer() { @@ -502,6 +504,23 @@ public class PlayerActivity extends Activity mediaSource = null; trackSelector = null; } + releaseMediaDrm(); + } + + private void releaseMediaDrm() { + if (mediaDrm != null) { + mediaDrm.release(); + mediaDrm = null; + } + } + + private void releaseAdsLoader() { + if (adsLoader != null) { + adsLoader.release(); + adsLoader = null; + loadedAdTagUri = null; + playerView.getOverlayFrameLayout().removeAllViews(); + } } private void updateTrackSelectorParameters() { @@ -576,15 +595,6 @@ public class PlayerActivity extends Activity } } - private void releaseAdsLoader() { - if (adsLoader != null) { - adsLoader.release(); - adsLoader = null; - loadedAdTagUri = null; - playerView.getOverlayFrameLayout().removeAllViews(); - } - } - // User controls private void updateButtonVisibilities() { 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 5524f98257..d87fca8e58 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 @@ -94,9 +94,15 @@ public class SampleChooserActivity extends Activity SampleListLoader loaderTask = new SampleListLoader(); loaderTask.execute(uris); - // Ping the download service in case it's not running (but should be). - startService( - new Intent(this, DemoDownloadService.class).setAction(DownloadService.ACTION_INIT)); + // Start the download service if it should be running but it's not currently. + // Starting the service in the foreground causes notification flicker if there is no scheduled + // action. Starting it in the background throws an exception if the app is in the background too + // (e.g. if device screen is locked). + try { + DownloadService.start(this, DemoDownloadService.class); + } catch (IllegalStateException e) { + DownloadService.startForeground(this, DemoDownloadService.class); + } } @Override diff --git a/extensions/cast/build.gradle b/extensions/cast/build.gradle index ded92000d3..fa348aaf17 100644 --- a/extensions/cast/build.gradle +++ b/extensions/cast/build.gradle @@ -26,16 +26,6 @@ android { } dependencies { - // These dependencies are necessary to force the supportLibraryVersion of - // com.android.support:support-v4, com.android.support:appcompat-v7 and - // com.android.support:mediarouter-v7 to be used. Else older versions are - // used, for example: - // com.google.android.gms:play-services-cast-framework:12.0.0 - // |-- com.google.android.gms:play-services-basement:12.0.0 - // |-- com.android.support:support-v4:26.1.0 - api 'com.android.support:support-v4:' + supportLibraryVersion - api 'com.android.support:appcompat-v7:' + supportLibraryVersion - api 'com.android.support:mediarouter-v7:' + supportLibraryVersion api 'com.google.android.gms:play-services-cast-framework:' + playServicesLibraryVersion implementation project(modulePrefix + 'library-core') implementation project(modulePrefix + 'library-ui') @@ -44,6 +34,15 @@ dependencies { testImplementation 'org.mockito:mockito-core:' + mockitoVersion testImplementation 'org.robolectric:robolectric:' + robolectricVersion testImplementation project(modulePrefix + 'testutils-robolectric') + // These dependencies are necessary to force the supportLibraryVersion of + // com.android.support:support-v4, com.android.support:appcompat-v7 and + // com.android.support:mediarouter-v7 to be used. Else older versions are + // used, for example via: + // com.google.android.gms:play-services-cast-framework:15.0.1 + // |-- com.android.support:mediarouter-v7:26.1.0 + api 'com.android.support:support-v4:' + supportLibraryVersion + api 'com.android.support:mediarouter-v7:' + supportLibraryVersion + api 'com.android.support:recyclerview-v7:' + supportLibraryVersion } ext { diff --git a/extensions/ima/build.gradle b/extensions/ima/build.gradle index 3529e05380..cec6b8a495 100644 --- a/extensions/ima/build.gradle +++ b/extensions/ima/build.gradle @@ -26,17 +26,16 @@ android { } dependencies { - // This dependency is necessary to force the supportLibraryVersion of - // com.android.support:support-v4 to be used. Else an older version (25.2.0) - // is included via: - // com.google.android.gms:play-services-ads:12.0.0 - // |-- com.google.android.gms:play-services-ads-lite:12.0.0 - // |-- com.google.android.gms:play-services-basement:12.0.0 - // |-- com.android.support:support-v4:26.1.0 - api 'com.android.support:support-v4:' + supportLibraryVersion - api 'com.google.ads.interactivemedia.v3:interactivemedia:3.8.5' + api 'com.google.ads.interactivemedia.v3:interactivemedia:3.8.7' implementation project(modulePrefix + 'library-core') implementation 'com.google.android.gms:play-services-ads:' + playServicesLibraryVersion + // These dependencies are necessary to force the supportLibraryVersion of + // com.android.support:support-v4 and com.android.support:customtabs to be + // used. Else older versions are used, for example via: + // com.google.android.gms:play-services-ads:15.0.1 + // |-- com.android.support:customtabs:26.1.0 + implementation 'com.android.support:support-v4:' + supportLibraryVersion + implementation 'com.android.support:customtabs:' + supportLibraryVersion } ext { diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 2d9ddfb288..3256da21dd 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -447,9 +447,13 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A } else if (contentType == C.TYPE_HLS) { supportedMimeTypes.add(MimeTypes.APPLICATION_M3U8); } else if (contentType == C.TYPE_OTHER) { - supportedMimeTypes.addAll(Arrays.asList( - MimeTypes.VIDEO_MP4, MimeTypes.VIDEO_WEBM, MimeTypes.VIDEO_H263, MimeTypes.VIDEO_MPEG, - MimeTypes.AUDIO_MP4, MimeTypes.AUDIO_MPEG)); + supportedMimeTypes.addAll( + Arrays.asList( + MimeTypes.VIDEO_MP4, + MimeTypes.VIDEO_WEBM, + MimeTypes.VIDEO_H263, + MimeTypes.AUDIO_MP4, + MimeTypes.AUDIO_MPEG)); } else if (contentType == C.TYPE_SS) { // IMA does not support Smooth Streaming ad media. } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 83fb16236d..4bafaa4326 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -600,8 +600,9 @@ public final class MediaSessionConnector { } } if (description.getTitle() != null) { - builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, - String.valueOf(description.getTitle())); + String title = String.valueOf(description.getTitle()); + builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title); + builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title); } if (description.getSubtitle() != null) { builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 39a6243933..b97790d5fb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -89,12 +89,12 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; * model"> * *