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
public void onDrawnToSurface(Surface surface) {
public void onRenderedFirstFrame(Surface surface) {
shutterView.setVisibility(View.GONE);
}
@ -471,6 +471,17 @@ public class PlayerActivity extends Activity implements OnKeyListener, OnTouchLi
if (trackInfo.hasOnlyUnplayableTracks(C.TRACK_TYPE_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

View File

@ -67,7 +67,6 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
private VpxOutputBuffer nextOutputBuffer;
private Bitmap bitmap;
private boolean drawnToSurface;
private boolean renderedFirstFrame;
private long joiningDeadlineMs;
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),
// render one frame irrespective of the state or current position.
if (!renderedFirstFrame) {
renderBuffer();
renderedFirstFrame = true;
return false;
}
if (getState() == STATE_STARTED && outputBuffer.timeUs <= positionUs + 30000) {
if (!renderedFirstFrame
|| (getState() == STATE_STARTED && outputBuffer.timeUs <= positionUs + 30000)) {
renderBuffer();
}
return false;
@ -252,14 +246,18 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
maybeNotifyVideoSizeChanged(outputBuffer.width, outputBuffer.height);
if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_RGB && surface != null) {
renderRgbFrame(outputBuffer, scaleToFit);
if (!drawnToSurface) {
drawnToSurface = true;
eventDispatcher.drawnToSurface(surface);
if (!renderedFirstFrame) {
renderedFirstFrame = true;
eventDispatcher.renderedFirstFrame(surface);
}
outputBuffer.release();
} else if (outputBuffer.mode == VpxDecoder.OUTPUT_MODE_YUV && outputBufferRenderer != null) {
// The renderer will release the buffer.
outputBufferRenderer.setOutputBuffer(outputBuffer);
if (!renderedFirstFrame) {
renderedFirstFrame = true;
eventDispatcher.renderedFirstFrame(null);
}
} else {
outputBuffer.release();
}
@ -433,11 +431,11 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
if (this.surface == surface) {
return;
}
renderedFirstFrame = false;
this.surface = surface;
outputBufferRenderer = null;
outputMode = (surface != null) ? VpxDecoder.OUTPUT_MODE_RGB : VpxDecoder.OUTPUT_MODE_NONE;
updateDecoder();
drawnToSurface = false;
}
private void setOutputBufferRenderer(VpxOutputBufferRenderer outputBufferRenderer) {

View File

@ -59,7 +59,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
public interface VideoListener {
void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
float pixelWidthHeightRatio);
void onDrawnToSurface(Surface surface);
void onRenderedFirstFrame(Surface surface);
}
/**
@ -565,9 +565,9 @@ public final class SimpleExoPlayer implements ExoPlayer {
}
@Override
public void onDrawnToSurface(Surface surface) {
public void onRenderedFirstFrame(Surface surface) {
if (videoListener != null) {
videoListener.onDrawnToSurface(surface);
videoListener.onRenderedFirstFrame(surface);
}
}

View File

@ -63,7 +63,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
private CodecMaxValues codecMaxValues;
private Surface surface;
private boolean reportedDrawnToSurface;
private boolean renderedFirstFrame;
private long joiningDeadlineMs;
private long droppedFrameAccumulationStartTimeMs;
@ -295,8 +294,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
if (this.surface == surface) {
return;
}
renderedFirstFrame = false;
this.surface = surface;
this.reportedDrawnToSurface = false;
int state = getState();
if (state == STATE_ENABLED || state == STATE_STARTED) {
releaseCodec();
@ -467,8 +466,10 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
TraceUtil.endSection();
decoderCounters.renderedOutputBufferCount++;
consecutiveDroppedFrameCount = 0;
renderedFirstFrame = true;
maybeNotifyDrawnToSurface();
if (!renderedFirstFrame) {
renderedFirstFrame = true;
eventDispatcher.renderedFirstFrame(surface);
}
}
@TargetApi(21)
@ -479,8 +480,10 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
TraceUtil.endSection();
decoderCounters.renderedOutputBufferCount++;
consecutiveDroppedFrameCount = 0;
renderedFirstFrame = true;
maybeNotifyDrawnToSurface();
if (!renderedFirstFrame) {
renderedFirstFrame = true;
eventDispatcher.renderedFirstFrame(surface);
}
}
@SuppressLint("InlinedApi")
@ -578,13 +581,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
return (maxPixels * 3) / (2 * minCompressionRatio);
}
private void maybeNotifyDrawnToSurface() {
if (!reportedDrawnToSurface) {
eventDispatcher.drawnToSurface(surface);
reportedDrawnToSurface = true;
}
}
private void maybeNotifyVideoSizeChanged() {
if (lastReportedWidth != currentWidth || lastReportedHeight != currentHeight
|| lastReportedUnappliedRotationDegrees != currentUnappliedRotationDegrees

View File

@ -88,12 +88,13 @@ public interface VideoRendererEventListener {
float pixelWidthHeightRatio);
/**
* Called when a frame is rendered to a surface for the first time following that surface
* having been set as the target for the renderer.
* Called when a frame is rendered for the first time since setting the surface, and when a frame
* 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.
@ -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) {
handler.post(new Runnable() {
@Override
public void run() {
listener.onDrawnToSurface(surface);
listener.onRenderedFirstFrame(surface);
}
});
}