Hide the shutter view when no video is being rendered.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=129849825
This commit is contained in:
parent
aab4e36d1a
commit
23981a6fc4
@ -456,7 +456,7 @@ public class PlayerActivity extends Activity implements OnKeyListener, OnTouchLi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDrawnToSurface(Surface surface) {
|
public void onRenderedFirstFrame(Surface surface) {
|
||||||
shutterView.setVisibility(View.GONE);
|
shutterView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,6 +471,17 @@ public class PlayerActivity extends Activity implements OnKeyListener, OnTouchLi
|
|||||||
if (trackInfo.hasOnlyUnplayableTracks(C.TRACK_TYPE_AUDIO)) {
|
if (trackInfo.hasOnlyUnplayableTracks(C.TRACK_TYPE_AUDIO)) {
|
||||||
showToast(R.string.error_unsupported_audio);
|
showToast(R.string.error_unsupported_audio);
|
||||||
}
|
}
|
||||||
|
boolean renderingVideo = false;
|
||||||
|
for (int i = 0; i < trackInfo.rendererCount; i++) {
|
||||||
|
if (player.getRendererType(i) == C.TRACK_TYPE_VIDEO
|
||||||
|
&& trackInfo.getTrackSelection(i) != null) {
|
||||||
|
renderingVideo = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!renderingVideo) {
|
||||||
|
shutterView.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// User controls
|
// User controls
|
||||||
|
@ -67,7 +67,6 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
|||||||
private VpxOutputBuffer nextOutputBuffer;
|
private VpxOutputBuffer nextOutputBuffer;
|
||||||
|
|
||||||
private Bitmap bitmap;
|
private Bitmap bitmap;
|
||||||
private boolean drawnToSurface;
|
|
||||||
private boolean renderedFirstFrame;
|
private boolean renderedFirstFrame;
|
||||||
private long joiningDeadlineMs;
|
private long joiningDeadlineMs;
|
||||||
private Surface surface;
|
private Surface surface;
|
||||||
@ -234,13 +233,8 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
// If we have not rendered any frame so far (either initially or immediately following a seek),
|
// If we have not rendered any frame so far (either initially or immediately following a seek),
|
||||||
// render one frame irrespective of the state or current position.
|
// render one frame irrespective of the state or current position.
|
||||||
if (!renderedFirstFrame) {
|
if (!renderedFirstFrame
|
||||||
renderBuffer();
|
|| (getState() == STATE_STARTED && outputBuffer.timeUs <= positionUs + 30000)) {
|
||||||
renderedFirstFrame = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getState() == STATE_STARTED && outputBuffer.timeUs <= positionUs + 30000) {
|
|
||||||
renderBuffer();
|
renderBuffer();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -252,14 +246,18 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
|||||||
maybeNotifyVideoSizeChanged(outputBuffer.width, outputBuffer.height);
|
maybeNotifyVideoSizeChanged(outputBuffer.width, outputBuffer.height);
|
||||||
if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_RGB && surface != null) {
|
if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_RGB && surface != null) {
|
||||||
renderRgbFrame(outputBuffer, scaleToFit);
|
renderRgbFrame(outputBuffer, scaleToFit);
|
||||||
if (!drawnToSurface) {
|
if (!renderedFirstFrame) {
|
||||||
drawnToSurface = true;
|
renderedFirstFrame = true;
|
||||||
eventDispatcher.drawnToSurface(surface);
|
eventDispatcher.renderedFirstFrame(surface);
|
||||||
}
|
}
|
||||||
outputBuffer.release();
|
outputBuffer.release();
|
||||||
} else if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_YUV && outputBufferRenderer != null) {
|
} else if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_YUV && outputBufferRenderer != null) {
|
||||||
// The renderer will release the buffer.
|
// The renderer will release the buffer.
|
||||||
outputBufferRenderer.setOutputBuffer(outputBuffer);
|
outputBufferRenderer.setOutputBuffer(outputBuffer);
|
||||||
|
if (!renderedFirstFrame) {
|
||||||
|
renderedFirstFrame = true;
|
||||||
|
eventDispatcher.renderedFirstFrame(null);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
outputBuffer.release();
|
outputBuffer.release();
|
||||||
}
|
}
|
||||||
@ -433,11 +431,11 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
|||||||
if (this.surface == surface) {
|
if (this.surface == surface) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
renderedFirstFrame = false;
|
||||||
this.surface = surface;
|
this.surface = surface;
|
||||||
outputBufferRenderer = null;
|
outputBufferRenderer = null;
|
||||||
outputMode = (surface != null) ? VpxDecoder.OUTPUT_MODE_RGB : VpxDecoder.OUTPUT_MODE_NONE;
|
outputMode = (surface != null) ? VpxDecoder.OUTPUT_MODE_RGB : VpxDecoder.OUTPUT_MODE_NONE;
|
||||||
updateDecoder();
|
updateDecoder();
|
||||||
drawnToSurface = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOutputBufferRenderer(VpxOutputBufferRenderer outputBufferRenderer) {
|
private void setOutputBufferRenderer(VpxOutputBufferRenderer outputBufferRenderer) {
|
||||||
|
@ -59,7 +59,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
|
|||||||
public interface VideoListener {
|
public interface VideoListener {
|
||||||
void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
|
void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
|
||||||
float pixelWidthHeightRatio);
|
float pixelWidthHeightRatio);
|
||||||
void onDrawnToSurface(Surface surface);
|
void onRenderedFirstFrame(Surface surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -565,9 +565,9 @@ public final class SimpleExoPlayer implements ExoPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDrawnToSurface(Surface surface) {
|
public void onRenderedFirstFrame(Surface surface) {
|
||||||
if (videoListener != null) {
|
if (videoListener != null) {
|
||||||
videoListener.onDrawnToSurface(surface);
|
videoListener.onRenderedFirstFrame(surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
private CodecMaxValues codecMaxValues;
|
private CodecMaxValues codecMaxValues;
|
||||||
|
|
||||||
private Surface surface;
|
private Surface surface;
|
||||||
private boolean reportedDrawnToSurface;
|
|
||||||
private boolean renderedFirstFrame;
|
private boolean renderedFirstFrame;
|
||||||
private long joiningDeadlineMs;
|
private long joiningDeadlineMs;
|
||||||
private long droppedFrameAccumulationStartTimeMs;
|
private long droppedFrameAccumulationStartTimeMs;
|
||||||
@ -295,8 +294,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
if (this.surface == surface) {
|
if (this.surface == surface) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
renderedFirstFrame = false;
|
||||||
this.surface = surface;
|
this.surface = surface;
|
||||||
this.reportedDrawnToSurface = false;
|
|
||||||
int state = getState();
|
int state = getState();
|
||||||
if (state == STATE_ENABLED || state == STATE_STARTED) {
|
if (state == STATE_ENABLED || state == STATE_STARTED) {
|
||||||
releaseCodec();
|
releaseCodec();
|
||||||
@ -467,8 +466,10 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
TraceUtil.endSection();
|
TraceUtil.endSection();
|
||||||
decoderCounters.renderedOutputBufferCount++;
|
decoderCounters.renderedOutputBufferCount++;
|
||||||
consecutiveDroppedFrameCount = 0;
|
consecutiveDroppedFrameCount = 0;
|
||||||
|
if (!renderedFirstFrame) {
|
||||||
renderedFirstFrame = true;
|
renderedFirstFrame = true;
|
||||||
maybeNotifyDrawnToSurface();
|
eventDispatcher.renderedFirstFrame(surface);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(21)
|
@TargetApi(21)
|
||||||
@ -479,8 +480,10 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
TraceUtil.endSection();
|
TraceUtil.endSection();
|
||||||
decoderCounters.renderedOutputBufferCount++;
|
decoderCounters.renderedOutputBufferCount++;
|
||||||
consecutiveDroppedFrameCount = 0;
|
consecutiveDroppedFrameCount = 0;
|
||||||
|
if (!renderedFirstFrame) {
|
||||||
renderedFirstFrame = true;
|
renderedFirstFrame = true;
|
||||||
maybeNotifyDrawnToSurface();
|
eventDispatcher.renderedFirstFrame(surface);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
@ -578,13 +581,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
return (maxPixels * 3) / (2 * minCompressionRatio);
|
return (maxPixels * 3) / (2 * minCompressionRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void maybeNotifyDrawnToSurface() {
|
|
||||||
if (!reportedDrawnToSurface) {
|
|
||||||
eventDispatcher.drawnToSurface(surface);
|
|
||||||
reportedDrawnToSurface = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void maybeNotifyVideoSizeChanged() {
|
private void maybeNotifyVideoSizeChanged() {
|
||||||
if (lastReportedWidth != currentWidth || lastReportedHeight != currentHeight
|
if (lastReportedWidth != currentWidth || lastReportedHeight != currentHeight
|
||||||
|| lastReportedUnappliedRotationDegrees != currentUnappliedRotationDegrees
|
|| lastReportedUnappliedRotationDegrees != currentUnappliedRotationDegrees
|
||||||
|
@ -88,12 +88,13 @@ public interface VideoRendererEventListener {
|
|||||||
float pixelWidthHeightRatio);
|
float pixelWidthHeightRatio);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a frame is rendered to a surface for the first time following that surface
|
* Called when a frame is rendered for the first time since setting the surface, and when a frame
|
||||||
* having been set as the target for the renderer.
|
* is rendered for the first time since the renderer was reset.
|
||||||
*
|
*
|
||||||
* @param surface The surface to which a first frame has been rendered.
|
* @param surface The {@link Surface} to which a first frame has been rendered, or {@code null} if
|
||||||
|
* the renderer renders to something that isn't a {@link Surface}.
|
||||||
*/
|
*/
|
||||||
void onDrawnToSurface(Surface surface);
|
void onRenderedFirstFrame(Surface surface);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the renderer is disabled.
|
* Called when the renderer is disabled.
|
||||||
@ -195,14 +196,14 @@ public interface VideoRendererEventListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invokes {@link VideoRendererEventListener#onDrawnToSurface(Surface)}.
|
* Invokes {@link VideoRendererEventListener#onRenderedFirstFrame(Surface)}.
|
||||||
*/
|
*/
|
||||||
public void drawnToSurface(final Surface surface) {
|
public void renderedFirstFrame(final Surface surface) {
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
handler.post(new Runnable() {
|
handler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
listener.onDrawnToSurface(surface);
|
listener.onRenderedFirstFrame(surface);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user