@Override @Deprecated @SuppressWarnings("deprecation") public void sendMessages(ExoPlayerMessage... messages) { for (ExoPlayerMessage message : messages) { createMessage(message.target).setType(message.messageType).setPayload(message.message).send(); } }
@Override @Deprecated @SuppressWarnings("deprecation") public void blockingSendMessages(ExoPlayerMessage... messages) { List<PlayerMessage> playerMessages = new ArrayList<>(); for (ExoPlayerMessage message : messages) { playerMessages.add( createMessage(message.target) .setType(message.messageType) .setPayload(message.message) .send()); } boolean wasInterrupted = false; for (PlayerMessage message : playerMessages) { boolean blockMessage = true; while (blockMessage) { try { message.blockUntilDelivered(); blockMessage = false; } catch (InterruptedException e) { wasInterrupted = true; } } } if (wasInterrupted) { // Restore the interrupted status. Thread.currentThread().interrupt(); } }
private void setVideoSurfaceInternal(@Nullable Surface surface, boolean ownsSurface) { // Note: We don't turn this method into a no-op if the surface is being replaced with itself // so as to ensure onRenderedFirstFrame callbacks are still called in this case. List<PlayerMessage> messages = new ArrayList<>(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { messages.add( player.createMessage(renderer).setType(C.MSG_SET_SURFACE).setPayload(surface).send()); } } if (this.surface != null && this.surface != surface) { // We're replacing a surface. Block to ensure that it's not accessed after the method returns. try { for (PlayerMessage message : messages) { message.blockUntilDelivered(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // If we created the previous surface, we are responsible for releasing it. if (this.ownsSurface) { this.surface.release(); } } this.surface = surface; this.ownsSurface = ownsSurface; }
private void sendVolumeToRenderers() { float scaledVolume = audioVolume * audioFocusManager.getVolumeMultiplier(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { player.createMessage(renderer).setType(C.MSG_SET_VOLUME).setPayload(scaledVolume).send(); } } }
@Override public void setAuxEffectInfo(AuxEffectInfo auxEffectInfo) { verifyApplicationThread(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { player .createMessage(renderer) .setType(C.MSG_SET_AUX_EFFECT_INFO) .setPayload(auxEffectInfo) .send(); } } }
@Override public void setCameraMotionListener(CameraMotionListener listener) { verifyApplicationThread(); cameraMotionListener = listener; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_CAMERA_MOTION) { player .createMessage(renderer) .setType(C.MSG_SET_CAMERA_MOTION_LISTENER) .setPayload(listener) .send(); } } }
@Override public void setVideoFrameMetadataListener(VideoFrameMetadataListener listener) { verifyApplicationThread(); videoFrameMetadataListener = listener; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { player .createMessage(renderer) .setType(C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER) .setPayload(listener) .send(); } } }
@Override public void clearCameraMotionListener(CameraMotionListener listener) { verifyApplicationThread(); if (cameraMotionListener != listener) { return; } for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_CAMERA_MOTION) { player .createMessage(renderer) .setType(C.MSG_SET_CAMERA_MOTION_LISTENER) .setPayload(null) .send(); } } }
@Override public void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener) { verifyApplicationThread(); if (videoFrameMetadataListener != listener) { return; } for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { player .createMessage(renderer) .setType(C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER) .setPayload(null) .send(); } } }
/** * Sets the video scaling mode. * * <p>Note that the scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} * is enabled and if the output surface is owned by a {@link android.view.SurfaceView}. * * @param videoScalingMode The video scaling mode. */ @Override public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { verifyApplicationThread(); this.videoScalingMode = videoScalingMode; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { player .createMessage(renderer) .setType(C.MSG_SET_SCALING_MODE) .setPayload(videoScalingMode) .send(); } } }
@Override public void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { verifyApplicationThread(); if (!Util.areEqual(this.audioAttributes, audioAttributes)) { this.audioAttributes = audioAttributes; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { player .createMessage(renderer) .setType(C.MSG_SET_AUDIO_ATTRIBUTES) .setPayload(audioAttributes) .send(); } } for (AudioListener audioListener : audioListeners) { audioListener.onAudioAttributesChanged(audioAttributes); } } @AudioFocusManager.PlayerCommand int playerCommand = audioFocusManager.setAudioAttributes( handleAudioFocus ? audioAttributes : null, getPlayWhenReady(), getPlaybackState()); updatePlayWhenReady(getPlayWhenReady(), playerCommand); }
@Override public void run() { Looper.prepare(); LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0); DefaultTrackSelector trackSelector = new DefaultTrackSelector(); player = ExoPlayerFactory.newInstance(new Renderer[] {videoRenderer}, trackSelector); player.addListener(this); MediaSource mediaSource = new ExtractorMediaSource.Factory( new DefaultDataSourceFactory(context, "ExoPlayerExtVp9Test")) .setExtractorsFactory(MatroskaExtractor.FACTORY) .createMediaSource(uri); player .createMessage(videoRenderer) .setType(LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER) .setPayload(new VpxVideoSurfaceView(context)) .send(); player.prepare(mediaSource); player.setPlayWhenReady(true); Looper.loop(); }
protected void sendMessage(int renderType, int messageType, Object message, boolean blocking) { if (renderers.isEmpty()) { return; } List<PlayerMessage> messages = new ArrayList<>(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == renderType) { messages.add(player.createMessage(renderer).setType(messageType).setPayload(message)); } } if (blocking) { blockingSendMessages(messages); } else { for (PlayerMessage playerMessage : messages) { playerMessage.send(); } } }