// Update frame dimensions and report any changes to |rendererEvents|. private void updateFrameDimensionsAndReportEvents(VideoRenderer.I420Frame frame) { synchronized (layoutLock) { if (!isFirstFrameRendered) { isFirstFrameRendered = true; logD("Reporting first rendered frame."); if (rendererEvents != null) { rendererEvents.onFirstFrameRendered(); } } if (rotatedFrameWidth != frame.rotatedWidth() || rotatedFrameHeight != frame.rotatedHeight() || frameRotation != frame.rotationDegree) { logD( "Reporting frame resolution changed to " + frame.width + "x" + frame.height + " with rotation " + frame.rotationDegree); if (rendererEvents != null) { rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree); } rotatedFrameWidth = frame.rotatedWidth(); rotatedFrameHeight = frame.rotatedHeight(); frameRotation = frame.rotationDegree; post( new Runnable() { @Override public void run() { requestLayout(); } }); } } }
@Override public synchronized void renderFrame(I420Frame frame) { if (surface == null) { // This object has been released. VideoRenderer.renderFrameDone(frame); return; } if (!seenFrame && rendererEvents != null) { Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame."); rendererEvents.onFirstFrameRendered(); } framesReceived++; synchronized (pendingFrameLock) { // Check input frame parameters. if (frame.yuvFrame) { if (frame.yuvStrides[0] < frame.width || frame.yuvStrides[1] < frame.width / 2 || frame.yuvStrides[2] < frame.width / 2) { Logging.e( TAG, "Incorrect strides " + frame.yuvStrides[0] + ", " + frame.yuvStrides[1] + ", " + frame.yuvStrides[2]); VideoRenderer.renderFrameDone(frame); return; } } if (pendingFrame != null) { // Skip rendering of this frame if previous frame was not rendered yet. framesDropped++; VideoRenderer.renderFrameDone(frame); return; } pendingFrame = frame; } setSize(frame.width, frame.height, frame.rotationDegree); seenFrame = true; // Request rendering. surface.requestRender(); }
private void setSize(final int videoWidth, final int videoHeight, final int rotation) { if (videoWidth == this.videoWidth && videoHeight == this.videoHeight && rotation == rotationDegree) { return; } if (rendererEvents != null) { Logging.d( TAG, "ID: " + id + ". Reporting frame resolution changed to " + videoWidth + " x " + videoHeight); rendererEvents.onFrameResolutionChanged(videoWidth, videoHeight, rotation); } synchronized (updateLayoutLock) { Logging.d( TAG, "ID: " + id + ". YuvImageRenderer.setSize: " + videoWidth + " x " + videoHeight + " rotation " + rotation); this.videoWidth = videoWidth; this.videoHeight = videoHeight; rotationDegree = rotation; updateLayoutProperties = true; Logging.d(TAG, " YuvImageRenderer.setSize done."); } }