Skip to content

Commit 029a2b2

Browse files
authored
Merge pull request #9705 from google/dev-v2-r2.16.1
r2.16.1
2 parents 7fe9ecc + 2469c8a commit 029a2b2

127 files changed

Lines changed: 3306 additions & 1314 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

RELEASENOTES.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
# Release notes
22

3+
### 2.16.1 (2021-11-18)
4+
5+
* Core Library:
6+
* Fix track selection issue where overriding one track group did not
7+
disable other track groups of the same type
8+
([#9675](https://github.com/google/ExoPlayer/issues/9675)).
9+
* Fix track selection issue where a mixture of non-empty and empty track
10+
overrides is not applied correctly
11+
([#9649](https://github.com/google/ExoPlayer/issues/9649)).
12+
* Add protected method `DefaultRenderersFactory.getCodecAdapterFactory()`
13+
so that subclasses of `DefaultRenderersFactory` that override
14+
`buildVideoRenderers()` or `buildAudioRenderers()` can access the codec
15+
adapter factory and pass it to `MediaCodecRenderer` instances they
16+
create.
17+
* Propagate ICY header fields `name` and `genre` to
18+
`MediaMetadata.station` and `MediaMetadata.genre` respectively so that
19+
they reach the app via `Player.Listener.onMediaMetadataChanged()`
20+
([#9677](https://github.com/google/ExoPlayer/issues/9677)).
21+
* Remove null keys from `DefaultHttpDataSource#getResponseHeaders`.
22+
* Extractors:
23+
* WAV: Add support for RF64 streams
24+
([#9543](https://github.com/google/ExoPlayer/issues/9543)).
25+
* DASH:
26+
* Add parsed essential and supplemental properties to the `Representation`
27+
([#9579](https://github.com/google/ExoPlayer/issues/9579)).
28+
* HLS:
29+
* Correctly populate `Format.label` for audio only HLS streams
30+
([#9608](https://github.com/google/ExoPlayer/issues/9608)).
31+
332
### 2.16.0 (2021-11-04)
433

534
* Core Library:

SECURITY.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Security policy #
22

3-
To report a security issue, please email [email protected]
4-
with a description of the issue, the steps you took to create the issue,
5-
affected versions, and, if known, mitigations for the issue. Our vulnerability
6-
management team will respond within 3 working days of your email. If the issue
7-
is confirmed as a vulnerability, we will open a Security Advisory. This project
8-
follows a 90 day disclosure timeline.
3+
To report a security issue, please email
4+
[email protected] with a description of the issue, the
5+
steps you took to create the issue, affected versions, and, if known,
6+
mitigations for the issue. Our vulnerability management team will respond within
7+
3 working days of your email. If the issue is confirmed as a vulnerability, we
8+
will open a Security Advisory. This project follows a 90 day disclosure
9+
timeline.

constants.gradle

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
// limitations under the License.
1414
project.ext {
1515
// ExoPlayer version and version code.
16-
releaseVersion = '2.16.0'
17-
releaseVersionCode = 2016000
16+
releaseVersion = '2.16.1'
17+
releaseVersionCode = 2016001
1818
minSdkVersion = 16
1919
appTargetSdkVersion = 29
2020
// Upgrading this requires [Internal ref: b/193254928] to be fixed, or some
@@ -26,33 +26,32 @@ project.ext {
2626
// Use the same Guava version as the Android repo:
2727
// https://cs.android.com/android/platform/superproject/+/master:external/guava/METADATA
2828
guavaVersion = '27.1-android'
29-
mockitoVersion = '3.4.0'
30-
mockWebServerVersion = '3.12.0'
29+
mockitoVersion = '3.12.4'
3130
robolectricVersion = '4.6.1'
3231
// Keep this in sync with Google's internal Checker Framework version.
33-
checkerframeworkVersion = '3.5.0'
34-
checkerframeworkCompatVersion = '2.5.0'
35-
errorProneVersion = '2.9.0'
32+
checkerframeworkVersion = '3.13.0'
33+
checkerframeworkCompatVersion = '2.5.5'
34+
errorProneVersion = '2.10.0'
3635
jsr305Version = '3.0.2'
37-
kotlinAnnotationsVersion = '1.5.20'
38-
androidxAnnotationVersion = '1.2.0'
39-
androidxAppCompatVersion = '1.3.0'
36+
kotlinAnnotationsVersion = '1.5.31'
37+
androidxAnnotationVersion = '1.3.0'
38+
androidxAppCompatVersion = '1.3.1'
4039
androidxCollectionVersion = '1.1.0'
41-
androidxCoreVersion = '1.6.0'
40+
androidxCoreVersion = '1.7.0'
4241
androidxFuturesVersion = '1.1.0'
4342
androidxMediaVersion = '1.4.3'
44-
androidxMedia2Version = '1.1.3'
43+
androidxMedia2Version = '1.2.0'
4544
androidxMultidexVersion = '2.0.1'
4645
androidxRecyclerViewVersion = '1.2.1'
47-
androidxMaterialVersion = '1.3.0'
48-
androidxTestCoreVersion = '1.3.0'
49-
androidxTestJUnitVersion = '1.1.2'
50-
androidxTestRunnerVersion = '1.3.0'
51-
androidxTestRulesVersion = '1.3.0'
52-
androidxTestServicesStorageVersion = '1.3.0'
53-
androidxTestTruthVersion = '1.3.0'
46+
androidxMaterialVersion = '1.4.0'
47+
androidxTestCoreVersion = '1.4.0'
48+
androidxTestJUnitVersion = '1.1.3'
49+
androidxTestRunnerVersion = '1.4.0'
50+
androidxTestRulesVersion = '1.4.0'
51+
androidxTestServicesStorageVersion = '1.4.0'
52+
androidxTestTruthVersion = '1.4.0'
5453
truthVersion = '1.1.3'
55-
okhttpVersion = '4.9.1'
54+
okhttpVersion = '4.9.2'
5655
modulePrefix = ':'
5756
if (gradle.ext.has('exoplayerModulePrefix')) {
5857
modulePrefix += gradle.ext.exoplayerModulePrefix

demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@
3838
import com.google.android.exoplayer2.C;
3939
import com.google.android.exoplayer2.ExoPlayer;
4040
import com.google.android.exoplayer2.MediaItem;
41-
import com.google.android.exoplayer2.ui.PlayerControlView;
42-
import com.google.android.exoplayer2.ui.PlayerView;
41+
import com.google.android.exoplayer2.ui.StyledPlayerView;
4342
import com.google.android.exoplayer2.util.Assertions;
4443
import com.google.android.exoplayer2.util.Util;
4544
import com.google.android.gms.cast.framework.CastButtonFactory;
@@ -53,8 +52,7 @@
5352
public class MainActivity extends AppCompatActivity
5453
implements OnClickListener, PlayerManager.Listener {
5554

56-
private PlayerView localPlayerView;
57-
private PlayerControlView castControlView;
55+
private StyledPlayerView playerView;
5856
private PlayerManager playerManager;
5957
private RecyclerView mediaQueueList;
6058
private MediaQueueListAdapter mediaQueueListAdapter;
@@ -83,10 +81,8 @@ public void onCreate(Bundle savedInstanceState) {
8381

8482
setContentView(R.layout.main_activity);
8583

86-
localPlayerView = findViewById(R.id.local_player_view);
87-
localPlayerView.requestFocus();
88-
89-
castControlView = findViewById(R.id.cast_control_view);
84+
playerView = findViewById(R.id.player_view);
85+
playerView.requestFocus();
9086

9187
mediaQueueList = findViewById(R.id.sample_list);
9288
ItemTouchHelper helper = new ItemTouchHelper(new RecyclerViewCallback());
@@ -114,12 +110,7 @@ public void onResume() {
114110
return;
115111
}
116112
playerManager =
117-
new PlayerManager(
118-
/* listener= */ this,
119-
localPlayerView,
120-
castControlView,
121-
/* context= */ this,
122-
castContext);
113+
new PlayerManager(/* listener= */ this, this, playerView, /* context= */ castContext);
123114
mediaQueueList.setAdapter(mediaQueueListAdapter);
124115
}
125116

demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import android.content.Context;
1919
import android.view.KeyEvent;
20-
import android.view.View;
20+
import androidx.core.content.res.ResourcesCompat;
2121
import com.google.android.exoplayer2.C;
2222
import com.google.android.exoplayer2.ExoPlayer;
2323
import com.google.android.exoplayer2.MediaItem;
@@ -28,8 +28,9 @@
2828
import com.google.android.exoplayer2.TracksInfo;
2929
import com.google.android.exoplayer2.ext.cast.CastPlayer;
3030
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener;
31-
import com.google.android.exoplayer2.ui.PlayerControlView;
3231
import com.google.android.exoplayer2.ui.PlayerView;
32+
import com.google.android.exoplayer2.ui.StyledPlayerControlView;
33+
import com.google.android.exoplayer2.ui.StyledPlayerView;
3334
import com.google.android.gms.cast.framework.CastContext;
3435
import java.util.ArrayList;
3536

@@ -50,8 +51,8 @@ interface Listener {
5051
void onUnsupportedTrack(int trackType);
5152
}
5253

53-
private final PlayerView localPlayerView;
54-
private final PlayerControlView castControlView;
54+
private final Context context;
55+
private final StyledPlayerView playerView;
5556
private final Player localPlayer;
5657
private final CastPlayer castPlayer;
5758
private final ArrayList<MediaItem> mediaQueue;
@@ -64,32 +65,25 @@ interface Listener {
6465
/**
6566
* Creates a new manager for {@link ExoPlayer} and {@link CastPlayer}.
6667
*
67-
* @param listener A {@link Listener} for queue position changes.
68-
* @param localPlayerView The {@link PlayerView} for local playback.
69-
* @param castControlView The {@link PlayerControlView} to control remote playback.
7068
* @param context A {@link Context}.
69+
* @param listener A {@link Listener} for queue position changes.
70+
* @param playerView The {@link PlayerView} for playback.
7171
* @param castContext The {@link CastContext}.
7272
*/
7373
public PlayerManager(
74-
Listener listener,
75-
PlayerView localPlayerView,
76-
PlayerControlView castControlView,
77-
Context context,
78-
CastContext castContext) {
74+
Context context, Listener listener, StyledPlayerView playerView, CastContext castContext) {
75+
this.context = context;
7976
this.listener = listener;
80-
this.localPlayerView = localPlayerView;
81-
this.castControlView = castControlView;
77+
this.playerView = playerView;
8278
mediaQueue = new ArrayList<>();
8379
currentItemIndex = C.INDEX_UNSET;
8480

8581
localPlayer = new ExoPlayer.Builder(context).build();
8682
localPlayer.addListener(this);
87-
localPlayerView.setPlayer(localPlayer);
8883

8984
castPlayer = new CastPlayer(castContext);
9085
castPlayer.addListener(this);
9186
castPlayer.setSessionAvailabilityListener(this);
92-
castControlView.setPlayer(castPlayer);
9387

9488
setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : localPlayer);
9589
}
@@ -192,11 +186,7 @@ public boolean moveItem(MediaItem item, int newIndex) {
192186
* @return Whether the event was handled by the target view.
193187
*/
194188
public boolean dispatchKeyEvent(KeyEvent event) {
195-
if (currentPlayer == localPlayer) {
196-
return localPlayerView.dispatchKeyEvent(event);
197-
} else /* currentPlayer == castPlayer */ {
198-
return castControlView.dispatchKeyEvent(event);
199-
}
189+
return playerView.dispatchKeyEvent(event);
200190
}
201191

202192
/** Releases the manager and the players that it holds. */
@@ -205,7 +195,7 @@ public void release() {
205195
mediaQueue.clear();
206196
castPlayer.setSessionAvailabilityListener(null);
207197
castPlayer.release();
208-
localPlayerView.setPlayer(null);
198+
playerView.setPlayer(null);
209199
localPlayer.release();
210200
}
211201

@@ -270,13 +260,19 @@ private void setCurrentPlayer(Player currentPlayer) {
270260
return;
271261
}
272262

273-
// View management.
274-
if (currentPlayer == localPlayer) {
275-
localPlayerView.setVisibility(View.VISIBLE);
276-
castControlView.hide();
277-
} else /* currentPlayer == castPlayer */ {
278-
localPlayerView.setVisibility(View.GONE);
279-
castControlView.show();
263+
playerView.setPlayer(currentPlayer);
264+
playerView.setControllerHideOnTouch(currentPlayer == localPlayer);
265+
if (currentPlayer == castPlayer) {
266+
playerView.setControllerShowTimeoutMs(0);
267+
playerView.showController();
268+
playerView.setDefaultArtwork(
269+
ResourcesCompat.getDrawable(
270+
context.getResources(),
271+
R.drawable.ic_baseline_cast_connected_400,
272+
/* theme= */ null));
273+
} else { // currentPlayer == localPlayer
274+
playerView.setControllerShowTimeoutMs(StyledPlayerControlView.DEFAULT_SHOW_TIMEOUT_MS);
275+
playerView.setDefaultArtwork(null);
280276
}
281277

282278
// Player state management.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<!--
2+
~ Copyright 2021 The Android Open Source Project
3+
~
4+
~ Licensed under the Apache License, Version 2.0 (the "License");
5+
~ you may not use this file except in compliance with the License.
6+
~ You may obtain a copy of the License at
7+
~
8+
~ https://www.apache.org/licenses/LICENSE-2.0
9+
~
10+
~ Unless required by applicable law or agreed to in writing, software
11+
~ distributed under the License is distributed on an "AS IS" BASIS,
12+
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
~ See the License for the specific language governing permissions and
14+
~ limitations under the License.
15+
-->
16+
<vector android:height="400dp" android:tint="#FFFFFF"
17+
android:viewportHeight="24" android:viewportWidth="24"
18+
android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
19+
<path android:fillColor="@android:color/white" android:pathData="M1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM19,7L5,7v1.63c3.96,1.28 7.09,4.41 8.37,8.37L19,17L19,7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11zM21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2z"/>
20+
</vector>

demos/cast/src/main/res/layout/main_activity.xml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
android:layout_height="match_parent"
2121
android:keepScreenOn="true">
2222

23-
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/local_player_view"
23+
<com.google.android.exoplayer2.ui.StyledPlayerView android:id="@+id/player_view"
2424
android:layout_width="match_parent"
2525
android:layout_height="0dp"
2626
android:layout_weight="1"
@@ -50,11 +50,4 @@
5050

5151
</RelativeLayout>
5252

53-
<com.google.android.exoplayer2.ui.PlayerControlView android:id="@+id/cast_control_view"
54-
android:layout_width="match_parent"
55-
android:layout_height="wrap_content"
56-
android:visibility="gone"
57-
app:repeat_toggle_modes="all|one"
58-
app:show_timeout="-1"/>
59-
6053
</LinearLayout>

demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public void initialize() {
8888
} catch (IOException e) {
8989
throw new IllegalStateException(e);
9090
}
91+
program.use();
9192
GlUtil.Attribute[] attributes = program.getAttributes();
9293
for (GlUtil.Attribute attribute : attributes) {
9394
if (attribute.name.equals("a_position")) {
@@ -142,7 +143,6 @@ public void draw(int frameTexture, long frameTimestampUs, float[] transformMatri
142143
// Run the shader program.
143144
GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms);
144145
GlUtil.Attribute[] attributes = checkNotNull(this.attributes);
145-
checkNotNull(program).use();
146146
for (GlUtil.Uniform uniform : uniforms) {
147147
switch (uniform.name) {
148148
case "tex_sampler_0":

demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,18 +179,17 @@ private void initializePlayer() {
179179
player.play();
180180
VideoProcessingGLSurfaceView videoProcessingGLSurfaceView =
181181
Assertions.checkNotNull(this.videoProcessingGLSurfaceView);
182-
videoProcessingGLSurfaceView.setVideoComponent(
183-
Assertions.checkNotNull(player.getVideoComponent()));
182+
videoProcessingGLSurfaceView.setPlayer(player);
184183
Assertions.checkNotNull(playerView).setPlayer(player);
185184
player.addAnalyticsListener(new EventLogger(/* trackSelector= */ null));
186185
this.player = player;
187186
}
188187

189188
private void releasePlayer() {
190189
Assertions.checkNotNull(playerView).setPlayer(null);
190+
Assertions.checkNotNull(videoProcessingGLSurfaceView).setPlayer(null);
191191
if (player != null) {
192192
player.release();
193-
Assertions.checkNotNull(videoProcessingGLSurfaceView).setVideoComponent(null);
194193
player = null;
195194
}
196195
}

0 commit comments

Comments
 (0)