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:
andrewlewis 2016-08-10 03:44:22 -07:00 committed by Oliver Woodman
parent aab4e36d1a
commit 23981a6fc4
5 changed files with 42 additions and 36 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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);
} }
} }

View File

@ -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

View File

@ -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);
} }
}); });
} }