118 lines
4.6 KiB
Java
118 lines
4.6 KiB
Java
package org.webrtc;
|
|
|
|
import android.view.SurfaceHolder;
|
|
import h0.c.k0;
|
|
import java.util.concurrent.CountDownLatch;
|
|
import org.webrtc.EglBase;
|
|
import org.webrtc.RendererCommon;
|
|
public class SurfaceEglRenderer extends EglRenderer implements SurfaceHolder.Callback {
|
|
private static final String TAG = "SurfaceEglRenderer";
|
|
private int frameRotation;
|
|
private boolean isFirstFrameRendered;
|
|
private boolean isRenderingPaused;
|
|
private final Object layoutLock = new Object();
|
|
private RendererCommon.RendererEvents rendererEvents;
|
|
private int rotatedFrameHeight;
|
|
private int rotatedFrameWidth;
|
|
|
|
public SurfaceEglRenderer(String str) {
|
|
super(str);
|
|
}
|
|
|
|
private void logD(String str) {
|
|
Logging.d("SurfaceEglRenderer", this.name + ": " + str);
|
|
}
|
|
|
|
private void updateFrameDimensionsAndReportEvents(VideoFrame videoFrame) {
|
|
synchronized (this.layoutLock) {
|
|
if (!this.isRenderingPaused) {
|
|
if (!this.isFirstFrameRendered) {
|
|
this.isFirstFrameRendered = true;
|
|
logD("Reporting first rendered frame.");
|
|
RendererCommon.RendererEvents rendererEvents = this.rendererEvents;
|
|
if (rendererEvents != null) {
|
|
rendererEvents.onFirstFrameRendered();
|
|
}
|
|
}
|
|
if (!(this.rotatedFrameWidth == videoFrame.getRotatedWidth() && this.rotatedFrameHeight == videoFrame.getRotatedHeight() && this.frameRotation == videoFrame.getRotation())) {
|
|
logD("Reporting frame resolution changed to " + videoFrame.getBuffer().getWidth() + "x" + videoFrame.getBuffer().getHeight() + " with rotation " + videoFrame.getRotation());
|
|
RendererCommon.RendererEvents rendererEvents2 = this.rendererEvents;
|
|
if (rendererEvents2 != null) {
|
|
rendererEvents2.onFrameResolutionChanged(videoFrame.getBuffer().getWidth(), videoFrame.getBuffer().getHeight(), videoFrame.getRotation());
|
|
}
|
|
this.rotatedFrameWidth = videoFrame.getRotatedWidth();
|
|
this.rotatedFrameHeight = videoFrame.getRotatedHeight();
|
|
this.frameRotation = videoFrame.getRotation();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.EglRenderer
|
|
public void disableFpsReduction() {
|
|
synchronized (this.layoutLock) {
|
|
this.isRenderingPaused = false;
|
|
}
|
|
super.disableFpsReduction();
|
|
}
|
|
|
|
public void init(EglBase.Context context, RendererCommon.RendererEvents rendererEvents, int[] iArr, RendererCommon.GlDrawer glDrawer) {
|
|
ThreadUtils.checkIsOnMainThread();
|
|
this.rendererEvents = rendererEvents;
|
|
synchronized (this.layoutLock) {
|
|
this.isFirstFrameRendered = false;
|
|
this.rotatedFrameWidth = 0;
|
|
this.rotatedFrameHeight = 0;
|
|
this.frameRotation = 0;
|
|
}
|
|
super.init(context, iArr, glDrawer);
|
|
}
|
|
|
|
@Override // org.webrtc.EglRenderer
|
|
public void init(EglBase.Context context, int[] iArr, RendererCommon.GlDrawer glDrawer) {
|
|
init(context, (RendererCommon.RendererEvents) null, iArr, glDrawer);
|
|
}
|
|
|
|
@Override // org.webrtc.EglRenderer, org.webrtc.VideoSink
|
|
public void onFrame(VideoFrame videoFrame) {
|
|
updateFrameDimensionsAndReportEvents(videoFrame);
|
|
super.onFrame(videoFrame);
|
|
}
|
|
|
|
@Override // org.webrtc.EglRenderer
|
|
public void pauseVideo() {
|
|
synchronized (this.layoutLock) {
|
|
this.isRenderingPaused = true;
|
|
}
|
|
super.pauseVideo();
|
|
}
|
|
|
|
@Override // org.webrtc.EglRenderer
|
|
public void setFpsReduction(float f) {
|
|
synchronized (this.layoutLock) {
|
|
this.isRenderingPaused = f == 0.0f;
|
|
}
|
|
super.setFpsReduction(f);
|
|
}
|
|
|
|
@Override // android.view.SurfaceHolder.Callback
|
|
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
|
|
ThreadUtils.checkIsOnMainThread();
|
|
logD("surfaceChanged: format: " + i + " size: " + i2 + "x" + i3);
|
|
}
|
|
|
|
@Override // android.view.SurfaceHolder.Callback
|
|
public void surfaceCreated(SurfaceHolder surfaceHolder) {
|
|
ThreadUtils.checkIsOnMainThread();
|
|
createEglSurface(surfaceHolder.getSurface());
|
|
}
|
|
|
|
@Override // android.view.SurfaceHolder.Callback
|
|
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
|
|
ThreadUtils.checkIsOnMainThread();
|
|
CountDownLatch countDownLatch = new CountDownLatch(1);
|
|
releaseEglSurface(new k0(countDownLatch));
|
|
ThreadUtils.awaitUninterruptibly(countDownLatch);
|
|
}
|
|
}
|