diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5894e991d0..6afe9bda35 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,7 @@ ### dev-v2 (not yet released) ### +* Increase `minSdkVersion` to 16 (Jellybean). * Support for playing spherical videos on Daydream. * Improve decoder re-use between playbacks. TODO: Write and link a blog post here ([#2826](https://github.com/google/ExoPlayer/issues/2826)). diff --git a/constants.gradle b/constants.gradle index 716ddbadba..062438fa30 100644 --- a/constants.gradle +++ b/constants.gradle @@ -15,11 +15,7 @@ project.ext { // ExoPlayer version and version code. releaseVersion = '2.9.4' releaseVersionCode = 2009004 - // 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 - // by the library requires API level 16 or greater. - minSdkVersion = 14 + minSdkVersion = 16 targetSdkVersion = 28 compileSdkVersion = 28 buildToolsVersion = '28.0.2' diff --git a/demos/cast/build.gradle b/demos/cast/build.gradle index 8af52a787e..e056530d45 100644 --- a/demos/cast/build.gradle +++ b/demos/cast/build.gradle @@ -26,7 +26,7 @@ android { defaultConfig { versionName project.ext.releaseVersion versionCode project.ext.releaseVersionCode - minSdkVersion 16 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } diff --git a/demos/ima/build.gradle b/demos/ima/build.gradle index 33cca6ef46..0530c42eb7 100644 --- a/demos/ima/build.gradle +++ b/demos/ima/build.gradle @@ -26,7 +26,7 @@ android { defaultConfig { versionName project.ext.releaseVersion versionCode project.ext.releaseVersionCode - minSdkVersion 16 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } diff --git a/demos/main/build.gradle b/demos/main/build.gradle index c516ba297f..e3e382f6d0 100644 --- a/demos/main/build.gradle +++ b/demos/main/build.gradle @@ -26,7 +26,7 @@ android { defaultConfig { versionName project.ext.releaseVersion versionCode project.ext.releaseVersionCode - minSdkVersion 16 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } diff --git a/extensions/cast/build.gradle b/extensions/cast/build.gradle index 0baa074d4a..fea8363960 100644 --- a/extensions/cast/build.gradle +++ b/extensions/cast/build.gradle @@ -24,7 +24,7 @@ android { } defaultConfig { - minSdkVersion 14 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion consumerProguardFiles 'proguard-rules.txt' } diff --git a/extensions/cronet/build.gradle b/extensions/cronet/build.gradle index 7d8c217b58..f77e84c816 100644 --- a/extensions/cronet/build.gradle +++ b/extensions/cronet/build.gradle @@ -19,7 +19,7 @@ android { buildToolsVersion project.ext.buildToolsVersion defaultConfig { - minSdkVersion 16 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } diff --git a/extensions/rtmp/build.gradle b/extensions/rtmp/build.gradle index af02ee2eaa..4869df7a1a 100644 --- a/extensions/rtmp/build.gradle +++ b/extensions/rtmp/build.gradle @@ -24,7 +24,7 @@ android { } defaultConfig { - minSdkVersion 15 + minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index e498038fde..35924a01fb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -63,7 +63,6 @@ import java.util.concurrent.CopyOnWriteArraySet; * An {@link ExoPlayer} implementation that uses default {@link Renderer} components. Instances can * be obtained from {@link ExoPlayerFactory}. */ -@TargetApi(16) public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, Player.AudioComponent, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index 7fc6c16db8..04c6b2ec9c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.audio; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.media.MediaCodec; import android.media.MediaCrypto; @@ -66,7 +65,6 @@ import java.util.List; * underlying audio track. * */ -@TargetApi(16) public class MediaCodecAudioRenderer extends MediaCodecRenderer implements MediaClock { /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java b/library/core/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java index ec17de8d74..379ca971b5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java @@ -62,7 +62,7 @@ public final class CryptoInfo { private final PatternHolderV24 patternHolder; public CryptoInfo() { - frameworkCryptoInfo = Util.SDK_INT >= 16 ? newFrameworkCryptoInfoV16() : null; + frameworkCryptoInfo = new android.media.MediaCodec.CryptoInfo(); patternHolder = Util.SDK_INT >= 24 ? new PatternHolderV24(frameworkCryptoInfo) : null; } @@ -79,34 +79,8 @@ public final class CryptoInfo { this.mode = mode; this.encryptedBlocks = encryptedBlocks; this.clearBlocks = clearBlocks; - if (Util.SDK_INT >= 16) { - updateFrameworkCryptoInfoV16(); - } - } - - /** - * Returns an equivalent {@link android.media.MediaCodec.CryptoInfo} instance. - *
- * Successive calls to this method on a single {@link CryptoInfo} will return the same instance. - * Changes to the {@link CryptoInfo} will be reflected in the returned object. The return object - * should not be modified directly. - * - * @return The equivalent {@link android.media.MediaCodec.CryptoInfo} instance. - */ - @TargetApi(16) - public android.media.MediaCodec.CryptoInfo getFrameworkCryptoInfoV16() { - return frameworkCryptoInfo; - } - - @TargetApi(16) - private android.media.MediaCodec.CryptoInfo newFrameworkCryptoInfoV16() { - return new android.media.MediaCodec.CryptoInfo(); - } - - @TargetApi(16) - private void updateFrameworkCryptoInfoV16() { - // Update fields directly because the framework's CryptoInfo.set performs an unnecessary object - // allocation on Android N. + // Update frameworkCryptoInfo fields directly because CryptoInfo.set performs an unnecessary + // object allocation on Android N. frameworkCryptoInfo.numSubSamples = numSubSamples; frameworkCryptoInfo.numBytesOfClearData = numBytesOfClearData; frameworkCryptoInfo.numBytesOfEncryptedData = numBytesOfEncryptedData; @@ -118,6 +92,25 @@ public final class CryptoInfo { } } + /** + * Returns an equivalent {@link android.media.MediaCodec.CryptoInfo} instance. + * + *
Successive calls to this method on a single {@link CryptoInfo} will return the same
+ * instance. Changes to the {@link CryptoInfo} will be reflected in the returned object. The
+ * return object should not be modified directly.
+ *
+ * @return The equivalent {@link android.media.MediaCodec.CryptoInfo} instance.
+ */
+ public android.media.MediaCodec.CryptoInfo getFrameworkCryptoInfo() {
+ return frameworkCryptoInfo;
+ }
+
+ /** @deprecated Use {@link #getFrameworkCryptoInfo()}. */
+ @Deprecated
+ public android.media.MediaCodec.CryptoInfo getFrameworkCryptoInfoV16() {
+ return getFrameworkCryptoInfo();
+ }
+
@TargetApi(24)
private static final class PatternHolderV24 {
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java
index a68415287e..a23f26f067 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java
@@ -15,7 +15,6 @@
*/
package com.google.android.exoplayer2.drm;
-import android.annotation.TargetApi;
import android.media.MediaDrm;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
@@ -27,7 +26,6 @@ import java.util.Map;
/**
* A DRM session.
*/
-@TargetApi(16)
public interface DrmSession A CanvasRenderer can be created on any thread, but {@link #init()} needs to be called on the
* GL thread before it can be rendered.
*/
-@TargetApi(15)
public final class CanvasRenderer {
private static final float WIDTH_UNIT = 0.8f;
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/ProjectionRenderer.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/ProjectionRenderer.java
index 5e8a6d71d2..f24bcce3ce 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/ProjectionRenderer.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/ProjectionRenderer.java
@@ -17,7 +17,6 @@ package com.google.android.exoplayer2.ui.spherical;
import static com.google.android.exoplayer2.util.GlUtil.checkGlError;
-import android.annotation.TargetApi;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import com.google.android.exoplayer2.C;
@@ -30,7 +29,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* Utility class to render spherical meshes for video or images. Call {@link #init()} on the GL
* thread when ready.
*/
-@TargetApi(15)
/* package */ final class ProjectionRenderer {
/**
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/SphericalSurfaceView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/SphericalSurfaceView.java
index 36589c5e34..adbeb7773d 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/SphericalSurfaceView.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/spherical/SphericalSurfaceView.java
@@ -15,7 +15,6 @@
*/
package com.google.android.exoplayer2.ui.spherical;
-import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.SurfaceTexture;
@@ -52,7 +51,6 @@ import javax.microedition.khronos.opengles.GL10;
* apply the touch and sensor rotations in the correct order or the user's touch manipulations won't
* match what they expect.
*/
-@TargetApi(15)
public final class SphericalSurfaceView extends GLSurfaceView {
/**
diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java
index 0dd05e7fd3..7d000de4b0 100644
--- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java
+++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java
@@ -89,10 +89,6 @@ public final class DashDownloadTest {
@Test
public void testDownload() throws Exception {
- if (Util.SDK_INT < 16) {
- return; // Pass.
- }
-
DashDownloader dashDownloader = downloadContent();
dashDownloader.download();
diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java
index 9a54ffd07c..56806183cc 100644
--- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java
+++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java
@@ -103,10 +103,6 @@ public final class DashStreamingTest {
@Test
public void testH264Fixed() {
- if (Util.SDK_INT < 16) {
- // Pass.
- return;
- }
testRunner
.setStreamName("test_h264_fixed")
.setManifestUrl(DashTestData.H264_MANIFEST)
@@ -118,7 +114,7 @@ public final class DashStreamingTest {
@Test
public void testH264Adaptive() throws DecoderQueryException {
- if (Util.SDK_INT < 16 || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
+ if (shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
// Pass.
return;
}
@@ -134,7 +130,7 @@ public final class DashStreamingTest {
@Test
public void testH264AdaptiveWithSeeking() throws DecoderQueryException {
- if (Util.SDK_INT < 16 || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
+ if (shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
// Pass.
return;
}
@@ -152,7 +148,7 @@ public final class DashStreamingTest {
@Test
public void testH264AdaptiveWithRendererDisabling() throws DecoderQueryException {
- if (Util.SDK_INT < 16 || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
+ if (shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)) {
// Pass.
return;
}
@@ -633,10 +629,6 @@ public final class DashStreamingTest {
@Test
public void testDecoderInfoH264() throws DecoderQueryException {
- if (Util.SDK_INT < 16) {
- // Pass.
- return;
- }
MediaCodecInfo decoderInfo = MediaCodecUtil.getDecoderInfo(MimeTypes.VIDEO_H264, false);
assertThat(decoderInfo).isNotNull();
assertThat(Util.SDK_INT < 21 || decoderInfo.adaptive).isTrue();
diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java
index eb69cc88da..2446094136 100644
--- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java
+++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java
@@ -205,7 +205,6 @@ public final class DashTestRunner {
/**
* A {@link HostedTest} for DASH playback tests.
*/
- @TargetApi(16)
private static final class DashHostedTest extends ExoHostedTest {
private final String streamName;
diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java
index 39194d48fe..d480d50b98 100644
--- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java
+++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java
@@ -39,7 +39,6 @@ import java.util.ArrayList;
* A debug extension of {@link DefaultRenderersFactory}. Provides a video renderer that performs
* video buffer timestamp assertions.
*/
-@TargetApi(16)
public class DebugRenderersFactory extends DefaultRenderersFactory {
public DebugRenderersFactory(Context context) {