mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Send renderer settings messages to secondary renderers in ExoPlayer
They are currently only sent to the primary renderer. PiperOrigin-RevId: 726864595
This commit is contained in:
parent
12afdfbaea
commit
cd6e61d856
@ -2875,6 +2875,11 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
||||
createMessageInternal(renderer).setType(messageType).setPayload(payload).send();
|
||||
}
|
||||
}
|
||||
for (@Nullable Renderer renderer : secondaryRenderers) {
|
||||
if (renderer != null && (trackType == -1 || renderer.getTrackType() == trackType)) {
|
||||
createMessageInternal(renderer).setType(messageType).setPayload(payload).send();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePriorityTaskManagerForIsLoadingChange(boolean isLoading) {
|
||||
|
@ -16356,6 +16356,114 @@ public class ExoPlayerTest {
|
||||
verify(listener).onAudioSessionIdChanged(audioSessionId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setVideoScalingMode_isSetOnPrimaryAndSecondaryVideoRenderers() throws Exception {
|
||||
AtomicBoolean videoScalingSetOnAudioRenderer = new AtomicBoolean();
|
||||
AtomicBoolean videoScalingSetOnVideoRenderer1 = new AtomicBoolean();
|
||||
AtomicBoolean videoScalingSetOnVideoRenderer2 = new AtomicBoolean();
|
||||
AtomicBoolean videoScalingSetOnSecondaryAudioRenderer = new AtomicBoolean();
|
||||
AtomicBoolean videoScalingSetOnSecondaryVideoRenderer = new AtomicBoolean();
|
||||
ExoPlayer player =
|
||||
new ExoPlayer.Builder(context)
|
||||
.setRenderersFactory(
|
||||
new RenderersFactory() {
|
||||
private boolean secondaryRendererCreated = false;
|
||||
|
||||
@Override
|
||||
public Renderer[] createRenderers(
|
||||
Handler handler,
|
||||
VideoRendererEventListener videoRendererEventListener,
|
||||
AudioRendererEventListener audioRendererEventListener,
|
||||
TextOutput textRendererOutput,
|
||||
MetadataOutput metadataRendererOutput) {
|
||||
return new Renderer[] {
|
||||
new FakeRenderer(C.TRACK_TYPE_AUDIO) {
|
||||
@Override
|
||||
public void handleMessage(
|
||||
@MessageType int messageType, @Nullable Object message)
|
||||
throws ExoPlaybackException {
|
||||
if (messageType == Renderer.MSG_SET_SCALING_MODE) {
|
||||
videoScalingSetOnAudioRenderer.set(true);
|
||||
}
|
||||
super.handleMessage(messageType, message);
|
||||
}
|
||||
},
|
||||
new FakeRenderer(C.TRACK_TYPE_VIDEO) {
|
||||
@Override
|
||||
public void handleMessage(
|
||||
@MessageType int messageType, @Nullable Object message)
|
||||
throws ExoPlaybackException {
|
||||
if (messageType == Renderer.MSG_SET_SCALING_MODE) {
|
||||
videoScalingSetOnVideoRenderer1.set(true);
|
||||
}
|
||||
super.handleMessage(messageType, message);
|
||||
}
|
||||
},
|
||||
new FakeRenderer(C.TRACK_TYPE_VIDEO) {
|
||||
@Override
|
||||
public void handleMessage(
|
||||
@MessageType int messageType, @Nullable Object message)
|
||||
throws ExoPlaybackException {
|
||||
if (messageType == Renderer.MSG_SET_SCALING_MODE) {
|
||||
videoScalingSetOnVideoRenderer2.set(true);
|
||||
}
|
||||
super.handleMessage(messageType, message);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Renderer createSecondaryRenderer(
|
||||
Renderer renderer,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener videoRendererEventListener,
|
||||
AudioRendererEventListener audioRendererEventListener,
|
||||
TextOutput textRendererOutput,
|
||||
MetadataOutput metadataRendererOutput) {
|
||||
if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) {
|
||||
return new FakeRenderer(C.TRACK_TYPE_AUDIO) {
|
||||
@Override
|
||||
public void handleMessage(
|
||||
@MessageType int messageType, @Nullable Object message)
|
||||
throws ExoPlaybackException {
|
||||
if (messageType == Renderer.MSG_SET_SCALING_MODE) {
|
||||
videoScalingSetOnSecondaryAudioRenderer.set(true);
|
||||
}
|
||||
super.handleMessage(messageType, message);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (!secondaryRendererCreated) {
|
||||
secondaryRendererCreated = true;
|
||||
return new FakeRenderer(C.TRACK_TYPE_VIDEO) {
|
||||
@Override
|
||||
public void handleMessage(
|
||||
@MessageType int messageType, @Nullable Object message)
|
||||
throws ExoPlaybackException {
|
||||
if (messageType == Renderer.MSG_SET_SCALING_MODE) {
|
||||
videoScalingSetOnSecondaryVideoRenderer.set(true);
|
||||
}
|
||||
super.handleMessage(messageType, message);
|
||||
}
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.build();
|
||||
|
||||
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
|
||||
advance(player).untilPendingCommandsAreFullyHandled();
|
||||
|
||||
assertThat(videoScalingSetOnAudioRenderer.get()).isFalse();
|
||||
assertThat(videoScalingSetOnVideoRenderer1.get()).isTrue();
|
||||
assertThat(videoScalingSetOnVideoRenderer2.get()).isTrue();
|
||||
assertThat(videoScalingSetOnSecondaryAudioRenderer.get()).isFalse();
|
||||
assertThat(videoScalingSetOnSecondaryVideoRenderer.get()).isTrue();
|
||||
}
|
||||
|
||||
// Internal methods.
|
||||
|
||||
private void addWatchAsSystemFeature() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user