diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8ef1c7e5eb..ffdfc1c1e7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,25 +7,29 @@ * Data sources: * Add support for `android.resource` URI scheme in `RawResourceDataSource` ([#7866](https://github.com/google/ExoPlayer/issues/7866)). -* Core library: - * Suppress Guava-related ProGuard/R8 warnings - ([#7904](https://github.com/google/ExoPlayer/issues/7904)). +* Text: + * Add support for `\h` SSA/ASS style override code (non-breaking space). ### 2.12.0 (2020-09-11) ### +To learn more about what's new in 2.12, read the corresponding +[blog post](https://medium.com/google-exoplayer/exoplayer-2-12-whats-new-e43ef8ff72e7). + * Core library: * `Player`: * Add a top level playlist API based on a new `MediaItem` class - ([#6161](https://github.com/google/ExoPlayer/issues/6161)). The - new methods for playlist manipulation are `setMediaItem(s)`, + ([#6161](https://github.com/google/ExoPlayer/issues/6161)). The new + methods for playlist manipulation are `setMediaItem(s)`, `addMediaItem(s)`, `moveMediaItem(s)`, `removeMediaItem(s)` and `clearMediaItems`. The playlist can be queried using `getMediaItemCount` and `getMediaItemAt`. This API should be used - instead of `ConcatenatingMediaSource` in most cases. - * Add `getCurrentMediaItem` for getting the currently playing item - in the playlist. - * Add `EventListener.onMediaItemTransition` to report when - playback transitions from one item to another in the playlist. + instead of `ConcatenatingMediaSource` in most cases. Learn more by + reading + [this blog post](https://medium.com/google-exoplayer/a-top-level-playlist-api-for-exoplayer-abe0a24edb55). + * Add `getCurrentMediaItem` for getting the currently playing item in + the playlist. + * Add `EventListener.onMediaItemTransition` to report when playback + transitions from one item to another in the playlist. * Add `play` and `pause` convenience methods. They are equivalent to `setPlayWhenReady(true)` and `setPlayWhenReady(false)` respectively. * Add `getCurrentLiveOffset` for getting the offset of the current @@ -34,6 +38,11 @@ player. * Add `AudioComponent.setAudioSessionId` to set the audio session ID. This method is also available on `SimpleExoPlayer`. + * Remove `PlaybackParameters.skipSilence`, and replace it with + `AudioComponent.setSkipSilenceEnabled`. This method is also + available on `SimpleExoPlayer`. An + `AudioListener.onSkipSilenceEnabledChanged` callback is also + added. * Add `TextComponent.getCurrentCues` to get the current cues. This method is also available on `SimpleExoPlayer`. The current cues are no longer automatically forwarded to a `TextOutput` when it's added @@ -87,8 +96,8 @@ ([#7309](https://github.com/google/ExoPlayer/issues/7309)). `LoadErrorHandlingPolicy` implementations should migrate to implementing the non-deprecated methods of the interface. - * Add an option to `MergingMediaSource` to adjust the time offsets - between the merged sources + * Add an option to `MergingMediaSource` to adjust the time offsets between + the merged sources ([#6103](https://github.com/google/ExoPlayer/issues/6103)). * Move `MediaSourceEventListener.LoadEventInfo` and `MediaSourceEventListener.MediaLoadData` to be top-level classes in @@ -98,11 +107,10 @@ generalize them to work with `Decoder` rather than `SimpleDecoder`. * Deprecate `C.MSG_*` constants, replacing them with constants in `Renderer`. - * Split the `library-core` module into `library-core`, - `library-common` and `library-extractor`. The `library-core` module - has an API dependency on both of the new modules, so this change - should be transparent to developers including ExoPlayer using Gradle - dependencies. + * Split the `library-core` module into `library-core`, `library-common` + and `library-extractor`. The `library-core` module has an API dependency + on both of the new modules, so this change should be transparent to + developers including ExoPlayer using Gradle dependencies. * Add a dependency on Guava. * Video: * Pass frame rate hint to `Surface.setFrameRate` on Android 11. @@ -142,6 +150,10 @@ the `AudioCapabilities` ([#7404](https://github.com/google/ExoPlayer/issues/7404)). * Text: + * Many of the changes described below improve support for Japanese + subtitles. Read + [this blog post](https://medium.com/google-exoplayer/improved-japanese-subtitle-support-7598fee12cf4) + to learn more. * Add a WebView-based output option to `SubtitleView`. This can display some features not supported by the existing Canvas-based output such as vertical text and rubies. It can be enabled by calling @@ -304,8 +316,8 @@ * Analytics: * Extend `EventTime` with more details about the current player state ([#7332](https://github.com/google/ExoPlayer/issues/7332)). - * Add `AnalyticsListener.onVideoFrameProcessingOffset` to report how - early or late video frames are processed relative to them needing to be + * Add `AnalyticsListener.onVideoFrameProcessingOffset` to report how early + or late video frames are processed relative to them needing to be presented. Video frame processing offset fields are also added to `DecoderCounters`. * Fix incorrect `MediaPeriodId` for some renderer errors reported by @@ -315,7 +327,9 @@ * Test utils: Add `TestExoPlayer`, a utility class with APIs to create `SimpleExoPlayer` instances with fake components for testing. * Media2 extension: This is a new extension that makes it easy to use - ExoPlayer together with AndroidX Media2. + ExoPlayer together with AndroidX Media2. Read + [this blog post](https://medium.com/google-exoplayer/the-media2-extension-for-exoplayer-d6b7d89b9063) + to learn more. * Cast extension: Implement playlist API and deprecate the old queue manipulation API. * IMA extension: @@ -345,11 +359,11 @@ * Add `clip_start_position_ms` and `clip_end_position_ms` to allow clipped samples. * Use `StyledPlayerControlView` rather than `PlayerView`. - * Remove support for media tunneling, random ABR and playback of - spherical video. Developers wishing to experiment with these features - can enable them by modifying the demo app source code. - * Add support for downloading DRM-protected content using offline - Widevine licenses. + * Remove support for media tunneling, random ABR and playback of spherical + video. Developers wishing to experiment with these features can enable + them by modifying the demo app source code. + * Add support for downloading DRM-protected content using offline Widevine + licenses. ### 2.11.8 (2020-08-25) ### diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 1e04b1e8d7..41e76440c1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -28,6 +28,7 @@ import android.os.Handler; import android.os.SystemClock; import android.util.Pair; import androidx.annotation.IntDef; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -1694,6 +1695,16 @@ public final class DefaultAudioSink implements AudioSink { } } + @Override + public void onTearDown(@NonNull AudioTrack track) { + if (listener != null && playing) { + // A new Audio Track needs to be created and it's buffer filled, which will be done on the + // next handleBuffer call. + // Request this call explicitly in case ExoPlayer is sleeping waiting for a data request. + listener.onOffloadBufferEmptying(); + } + } + public void register(AudioTrack audioTrack) { audioTrack.registerStreamEventCallback(handler::post, this); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java index 3bb39aba9c..f44db4924f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java @@ -263,8 +263,9 @@ public final class SsaDecoder extends SimpleSubtitleDecoder { SsaStyle.Overrides styleOverrides = SsaStyle.Overrides.parseFromDialogue(rawText); String text = SsaStyle.Overrides.stripStyleOverrides(rawText) - .replaceAll("\\\\N", "\n") - .replaceAll("\\\\n", "\n"); + .replace("\\N", "\n") + .replace("\\n", "\n") + .replace("\\h", "\u00A0"); Cue cue = createCue(text, style, styleOverrides, screenWidth, screenHeight); int startTimeIndex = addCuePlacerholderByTime(startTimeUs, cueTimesUs, cues); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java index 09b546e89e..e666ec979d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java @@ -31,11 +31,9 @@ import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.ExecutionException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.LooperMode; /** Tests for {@link MetadataRetriever}. */ @RunWith(AndroidJUnit4.class) -@LooperMode(LooperMode.Mode.PAUSED) public class MetadataRetrieverTest { @Test @@ -100,7 +98,9 @@ public class MetadataRetrieverTest { ListenableFuture trackGroupsFuture) throws InterruptedException, ExecutionException { while (!trackGroupsFuture.isDone()) { - // Simulate advancing SystemClock so that delayed messages sent to handlers are received. + // TODO: update once [Internal: b/168084145] is implemented. + // Advance SystemClock so that messages that are sent with a delay to the MetadataRetriever + // looper are received. SystemClock.setCurrentTimeMillis(SystemClock.uptimeMillis() + 100); Thread.sleep(/* millis= */ 100); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DumpFileAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DumpFileAsserts.java index 42884ec6f4..1423a3a33b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DumpFileAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DumpFileAsserts.java @@ -98,7 +98,7 @@ public class DumpFileAsserts { } else { File file = DUMP_FILE_ACTION == WRITE_TO_LOCAL - ? new File(StandardSystemProperty.USER_DIR.value(), "../../testdata/src/test") + ? new File(StandardSystemProperty.USER_DIR.value(), "../../testdata/src/test/assets") : context.getExternalFilesDir(null); file = new File(file, dumpFile); Assertions.checkStateNotNull(file.getParentFile()).mkdirs();