mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Fix stuck ad playbacks with DRM-protected content
When ClippingMediaPeriod first tried to read a buffer, if its end position was before the end of the stream and it was buffered to its end position, it would sometimes erroneously signal end-of-stream for protected content because the sample queue might be waiting for DRM keys at this point. Work around the issue temporarily by signaling this specific case back to ClippingMediaPeriod via the DecoderInputBuffer. There will likely be a cleaner fix as a result of adding support for dynamic clip end points in the future, at which point this can be reverted. issue:#7188 PiperOrigin-RevId: 305081757
This commit is contained in:
parent
1f544b0856
commit
dc813eca41
193
RELEASENOTES.md
193
RELEASENOTES.md
@ -112,44 +112,47 @@
|
||||
|
||||
### 2.11.4 (2020-04-08) ###
|
||||
|
||||
* Add `SimpleExoPlayer.setWakeMode` to allow automatic `WifiLock` and `WakeLock`
|
||||
handling ([#6914](https://github.com/google/ExoPlayer/issues/6914)). To use
|
||||
this feature, you must add the
|
||||
[WAKE_LOCK](https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK)
|
||||
permission to your application's manifest file.
|
||||
* Text:
|
||||
* Catch and log exceptions in `TextRenderer` rather than re-throwing. This
|
||||
allows playback to continue even if subtitle decoding fails
|
||||
([#6885](https://github.com/google/ExoPlayer/issues/6885)).
|
||||
* Allow missing hours and milliseconds in SubRip (.srt) timecodes
|
||||
([#7122](https://github.com/google/ExoPlayer/issues/7122)).
|
||||
* Audio:
|
||||
* Workaround issue that could cause slower than realtime playback of AAC on
|
||||
Android 10 ([#6671](https://github.com/google/ExoPlayer/issues/6671).
|
||||
* Enable playback speed adjustment and silence skipping for floating point PCM
|
||||
audio, via resampling to 16-bit integer PCM. To output the original floating
|
||||
point audio without adjustment, pass `enableFloatOutput=true` to the
|
||||
`DefaultAudioSink` constructor
|
||||
([#7134](https://github.com/google/ExoPlayer/issues/7134)).
|
||||
* Fix playback of WAV files with trailing non-media bytes
|
||||
([#7129](https://github.com/google/ExoPlayer/issues/7129)).
|
||||
* Fix playback of ADTS files with mid-stream ID3 metadata.
|
||||
* DRM:
|
||||
* Fix playback of Widevine protected content that only provides V1 PSSH atoms
|
||||
on API levels 21 and 22.
|
||||
* Fix playback of PlayReady content on Fire TV Stick (Gen 2).
|
||||
* DASH:
|
||||
* Update the manifest URI to avoid repeated HTTP redirects
|
||||
([#6907](https://github.com/google/ExoPlayer/issues/6907)).
|
||||
* Parse period `AssetIdentifier` elements.
|
||||
* UI: Add an option to set whether to use the orientation sensor for rotation
|
||||
in spherical playbacks
|
||||
([#6761](https://github.com/google/ExoPlayer/issues/6761)).
|
||||
* Analytics: Fix `PlaybackStatsListener` behavior when not keeping history
|
||||
([#7160](https://github.com/google/ExoPlayer/issues/7160)).
|
||||
* FFmpeg extension: Add support for `x86_64` architecture.
|
||||
* Opus extension: Fix parsing of negative gain values
|
||||
([#7046](https://github.com/google/ExoPlayer/issues/7046)).
|
||||
* Add `SimpleExoPlayer.setWakeMode` to allow automatic `WifiLock` and
|
||||
`WakeLock` handling
|
||||
([#6914](https://github.com/google/ExoPlayer/issues/6914)). To use this
|
||||
feature, you must add the
|
||||
[WAKE_LOCK](https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK)
|
||||
permission to your application's manifest file.
|
||||
* Text:
|
||||
* Catch and log exceptions in `TextRenderer` rather than re-throwing. This
|
||||
allows playback to continue even if subtitle decoding fails
|
||||
([#6885](https://github.com/google/ExoPlayer/issues/6885)).
|
||||
* Allow missing hours and milliseconds in SubRip (.srt) timecodes
|
||||
([#7122](https://github.com/google/ExoPlayer/issues/7122)).
|
||||
* Audio:
|
||||
* Workaround issue that could cause slower than realtime playback of AAC
|
||||
on Android 10 ([#6671](https://github.com/google/ExoPlayer/issues/6671).
|
||||
* Enable playback speed adjustment and silence skipping for floating point
|
||||
PCM audio, via resampling to 16-bit integer PCM. To output the original
|
||||
floating point audio without adjustment, pass `enableFloatOutput=true`
|
||||
to the `DefaultAudioSink` constructor
|
||||
([#7134](https://github.com/google/ExoPlayer/issues/7134)).
|
||||
* Fix playback of WAV files with trailing non-media bytes
|
||||
([#7129](https://github.com/google/ExoPlayer/issues/7129)).
|
||||
* Fix playback of ADTS files with mid-stream ID3 metadata.
|
||||
* DRM:
|
||||
* Fix playback of Widevine protected content that only provides V1 PSSH
|
||||
atoms on API levels 21 and 22.
|
||||
* Fix playback of PlayReady content on Fire TV Stick (Gen 2).
|
||||
* Fix stuck ad playbacks with DRM protected content
|
||||
([#7188](https://github.com/google/ExoPlayer/issues/7188)).
|
||||
* DASH:
|
||||
* Update the manifest URI to avoid repeated HTTP redirects
|
||||
([#6907](https://github.com/google/ExoPlayer/issues/6907)).
|
||||
* Parse period `AssetIdentifier` elements.
|
||||
* UI: Add an option to set whether to use the orientation sensor for rotation
|
||||
in spherical playbacks
|
||||
([#6761](https://github.com/google/ExoPlayer/issues/6761)).
|
||||
* Analytics: Fix `PlaybackStatsListener` behavior when not keeping history
|
||||
([#7160](https://github.com/google/ExoPlayer/issues/7160)).
|
||||
* FFmpeg extension: Add support for `x86_64` architecture.
|
||||
* Opus extension: Fix parsing of negative gain values
|
||||
([#7046](https://github.com/google/ExoPlayer/issues/7046)).
|
||||
|
||||
### 2.11.3 (2020-02-19) ###
|
||||
|
||||
@ -161,63 +164,63 @@
|
||||
|
||||
### 2.11.2 (2020-02-13) ###
|
||||
|
||||
* Add Java FLAC extractor
|
||||
([#6406](https://github.com/google/ExoPlayer/issues/6406)).
|
||||
* Startup latency optimization:
|
||||
* Reduce startup latency for DASH and SmoothStreaming playbacks by allowing
|
||||
codec initialization to occur before the network connection for the first
|
||||
media segment has been established.
|
||||
* Reduce startup latency for on-demand DASH playbacks by allowing codec
|
||||
initialization to occur before the sidx box has been loaded.
|
||||
* Downloads:
|
||||
* Fix download resumption when the requirements for them to continue are
|
||||
met ([#6733](https://github.com/google/ExoPlayer/issues/6733),
|
||||
[#6798](https://github.com/google/ExoPlayer/issues/6798)).
|
||||
* Fix `DownloadHelper.createMediaSource` to use `customCacheKey` when creating
|
||||
`ProgressiveMediaSource` instances.
|
||||
* DRM: Fix `NullPointerException` when playing DRM-protected content
|
||||
([#6951](https://github.com/google/ExoPlayer/issues/6951)).
|
||||
* Metadata:
|
||||
* Update `IcyDecoder` to try ISO-8859-1 decoding if UTF-8 decoding fails.
|
||||
Also change `IcyInfo.rawMetadata` from `String` to `byte[]` to allow
|
||||
developers to handle data that's neither UTF-8 nor ISO-8859-1
|
||||
([#6753](https://github.com/google/ExoPlayer/issues/6753)).
|
||||
* Select multiple metadata tracks if multiple metadata renderers are available
|
||||
([#6676](https://github.com/google/ExoPlayer/issues/6676)).
|
||||
* Add support for ID3 genres added in Wimamp 5.6 (2010).
|
||||
* UI:
|
||||
* Show ad group markers in `DefaultTimeBar` even if they are after the end
|
||||
of the current window
|
||||
([#6552](https://github.com/google/ExoPlayer/issues/6552)).
|
||||
* Don't use notification chronometer if playback speed is != 1.0
|
||||
([#6816](https://github.com/google/ExoPlayer/issues/6816)).
|
||||
* HLS: Fix playback of DRM protected content that uses key rotation
|
||||
([#6903](https://github.com/google/ExoPlayer/issues/6903)).
|
||||
* WAV:
|
||||
* Support IMA ADPCM encoded data.
|
||||
* Improve support for G.711 A-law and mu-law encoded data.
|
||||
* MP4: Support "twos" codec (big endian PCM)
|
||||
([#5789](https://github.com/google/ExoPlayer/issues/5789)).
|
||||
* FMP4: Add support for encrypted AC-4 tracks.
|
||||
* HLS: Fix slow seeking into long MP3 segments
|
||||
([#6155](https://github.com/google/ExoPlayer/issues/6155)).
|
||||
* Fix handling of E-AC-3 streams that contain AC-3 syncframes
|
||||
([#6602](https://github.com/google/ExoPlayer/issues/6602)).
|
||||
* Fix playback of TrueHD streams in Matroska
|
||||
([#6845](https://github.com/google/ExoPlayer/issues/6845)).
|
||||
* Fix MKV subtitles to disappear when intended instead of lasting until the
|
||||
next cue ([#6833](https://github.com/google/ExoPlayer/issues/6833)).
|
||||
* OkHttp extension: Upgrade OkHttp dependency to 3.12.8, which fixes a class of
|
||||
`SocketTimeoutException` issues when using HTTP/2
|
||||
([#4078](https://github.com/google/ExoPlayer/issues/4078)).
|
||||
* FLAC extension: Fix handling of bit depths other than 16 in `FLACDecoder`.
|
||||
This issue caused FLAC streams with other bit depths to sound like white noise
|
||||
on earlier releases, but only when embedded in a non-FLAC container such as
|
||||
Matroska or MP4.
|
||||
* Demo apps: Add
|
||||
[GL demo app](https://github.com/google/ExoPlayer/tree/dev-v2/demos/gl) to
|
||||
show how to render video to a `GLSurfaceView` while applying a GL shader.
|
||||
([#6920](https://github.com/google/ExoPlayer/issues/6920)).
|
||||
* Add Java FLAC extractor
|
||||
([#6406](https://github.com/google/ExoPlayer/issues/6406)).
|
||||
* Startup latency optimization:
|
||||
* Reduce startup latency for DASH and SmoothStreaming playbacks by
|
||||
allowing codec initialization to occur before the network connection for
|
||||
the first media segment has been established.
|
||||
* Reduce startup latency for on-demand DASH playbacks by allowing codec
|
||||
initialization to occur before the sidx box has been loaded.
|
||||
* Downloads:
|
||||
* Fix download resumption when the requirements for them to continue are
|
||||
met ([#6733](https://github.com/google/ExoPlayer/issues/6733),
|
||||
[#6798](https://github.com/google/ExoPlayer/issues/6798)).
|
||||
* Fix `DownloadHelper.createMediaSource` to use `customCacheKey` when
|
||||
creating `ProgressiveMediaSource` instances.
|
||||
* DRM: Fix `NullPointerException` when playing DRM protected content
|
||||
([#6951](https://github.com/google/ExoPlayer/issues/6951)).
|
||||
* Metadata:
|
||||
* Update `IcyDecoder` to try ISO-8859-1 decoding if UTF-8 decoding fails.
|
||||
Also change `IcyInfo.rawMetadata` from `String` to `byte[]` to allow
|
||||
developers to handle data that's neither UTF-8 nor ISO-8859-1
|
||||
([#6753](https://github.com/google/ExoPlayer/issues/6753)).
|
||||
* Select multiple metadata tracks if multiple metadata renderers are
|
||||
available ([#6676](https://github.com/google/ExoPlayer/issues/6676)).
|
||||
* Add support for ID3 genres added in Wimamp 5.6 (2010).
|
||||
* UI:
|
||||
* Show ad group markers in `DefaultTimeBar` even if they are after the end
|
||||
of the current window
|
||||
([#6552](https://github.com/google/ExoPlayer/issues/6552)).
|
||||
* Don't use notification chronometer if playback speed is != 1.0
|
||||
([#6816](https://github.com/google/ExoPlayer/issues/6816)).
|
||||
* HLS: Fix playback of DRM protected content that uses key rotation
|
||||
([#6903](https://github.com/google/ExoPlayer/issues/6903)).
|
||||
* WAV:
|
||||
* Support IMA ADPCM encoded data.
|
||||
* Improve support for G.711 A-law and mu-law encoded data.
|
||||
* MP4: Support "twos" codec (big endian PCM)
|
||||
([#5789](https://github.com/google/ExoPlayer/issues/5789)).
|
||||
* FMP4: Add support for encrypted AC-4 tracks.
|
||||
* HLS: Fix slow seeking into long MP3 segments
|
||||
([#6155](https://github.com/google/ExoPlayer/issues/6155)).
|
||||
* Fix handling of E-AC-3 streams that contain AC-3 syncframes
|
||||
([#6602](https://github.com/google/ExoPlayer/issues/6602)).
|
||||
* Fix playback of TrueHD streams in Matroska
|
||||
([#6845](https://github.com/google/ExoPlayer/issues/6845)).
|
||||
* Fix MKV subtitles to disappear when intended instead of lasting until the
|
||||
next cue ([#6833](https://github.com/google/ExoPlayer/issues/6833)).
|
||||
* OkHttp extension: Upgrade OkHttp dependency to 3.12.8, which fixes a class
|
||||
of `SocketTimeoutException` issues when using HTTP/2
|
||||
([#4078](https://github.com/google/ExoPlayer/issues/4078)).
|
||||
* FLAC extension: Fix handling of bit depths other than 16 in `FLACDecoder`.
|
||||
This issue caused FLAC streams with other bit depths to sound like white
|
||||
noise on earlier releases, but only when embedded in a non-FLAC container
|
||||
such as Matroska or MP4.
|
||||
* Demo apps: Add
|
||||
[GL demo app](https://github.com/google/ExoPlayer/tree/dev-v2/demos/gl) to
|
||||
show how to render video to a `GLSurfaceView` while applying a GL shader.
|
||||
([#6920](https://github.com/google/ExoPlayer/issues/6920)).
|
||||
|
||||
### 2.11.1 (2019-12-20) ###
|
||||
|
||||
|
@ -63,6 +63,14 @@ public class DecoderInputBuffer extends Buffer {
|
||||
/** The buffer's data, or {@code null} if no data has been set. */
|
||||
@Nullable public ByteBuffer data;
|
||||
|
||||
// TODO: Remove this temporary signaling once end-of-stream propagation for clips using content
|
||||
// protection is fixed. See [Internal: b/153326944] for details.
|
||||
/**
|
||||
* Whether the last attempt to read a sample into this buffer failed due to not yet having the DRM
|
||||
* keys associated with the next sample.
|
||||
*/
|
||||
public boolean waitingForKeys;
|
||||
|
||||
/**
|
||||
* The time at which the sample should be presented.
|
||||
*/
|
||||
@ -183,6 +191,7 @@ public class DecoderInputBuffer extends Buffer {
|
||||
if (supplementalData != null) {
|
||||
supplementalData.clear();
|
||||
}
|
||||
waitingForKeys = false;
|
||||
}
|
||||
|
||||
private ByteBuffer createReplacementByteBuffer(int requiredCapacity) {
|
||||
|
@ -329,7 +329,8 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
|
||||
if (endUs != C.TIME_END_OF_SOURCE
|
||||
&& ((result == C.RESULT_BUFFER_READ && buffer.timeUs >= endUs)
|
||||
|| (result == C.RESULT_NOTHING_READ
|
||||
&& getBufferedPositionUs() == C.TIME_END_OF_SOURCE))) {
|
||||
&& getBufferedPositionUs() == C.TIME_END_OF_SOURCE
|
||||
&& !buffer.waitingForKeys))) {
|
||||
buffer.clear();
|
||||
buffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM);
|
||||
sentEos = true;
|
||||
|
@ -554,7 +554,7 @@ public class SampleQueue implements TrackOutput {
|
||||
boolean loadingFinished,
|
||||
long decodeOnlyUntilUs,
|
||||
SampleExtrasHolder extrasHolder) {
|
||||
|
||||
buffer.waitingForKeys = false;
|
||||
// This is a temporary fix for https://github.com/google/ExoPlayer/issues/6155.
|
||||
// TODO: Remove it and replace it with a fix that discards samples when writing to the queue.
|
||||
boolean hasNextSample;
|
||||
@ -588,6 +588,7 @@ public class SampleQueue implements TrackOutput {
|
||||
}
|
||||
|
||||
if (!mayReadSample(relativeReadIndex)) {
|
||||
buffer.waitingForKeys = true;
|
||||
return C.RESULT_NOTHING_READ;
|
||||
}
|
||||
|
||||
|
@ -368,8 +368,10 @@ public final class SampleQueueTest {
|
||||
|
||||
assertReadFormat(/* formatRequired= */ false, FORMAT_ENCRYPTED);
|
||||
assertReadNothing(/* formatRequired= */ false);
|
||||
assertThat(inputBuffer.waitingForKeys).isTrue();
|
||||
when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS);
|
||||
assertReadEncryptedSample(/* sampleIndex= */ 0);
|
||||
assertThat(inputBuffer.waitingForKeys).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
Loading…
x
Reference in New Issue
Block a user