2021-06-27 20:44:35 +00:00
|
|
|
package org.webrtc;
|
|
|
|
|
|
|
|
import android.graphics.Matrix;
|
|
|
|
import android.opengl.GLES20;
|
2021-11-08 18:25:28 +00:00
|
|
|
import h0.c.j0;
|
2021-06-27 20:44:35 +00:00
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
import org.webrtc.GlGenericDrawer;
|
|
|
|
import org.webrtc.ThreadUtils;
|
|
|
|
import org.webrtc.VideoFrame;
|
2022-03-02 20:59:20 +00:00
|
|
|
/* loaded from: classes3.dex */
|
2021-06-27 20:44:35 +00:00
|
|
|
public class YuvConverter {
|
|
|
|
private static final String FRAGMENT_SHADER = "uniform vec2 xUnit;\nuniform vec4 coeffs;\n\nvoid main() {\n gl_FragColor.r = coeffs.a + dot(coeffs.rgb,\n sample(tc - 1.5 * xUnit).rgb);\n gl_FragColor.g = coeffs.a + dot(coeffs.rgb,\n sample(tc - 0.5 * xUnit).rgb);\n gl_FragColor.b = coeffs.a + dot(coeffs.rgb,\n sample(tc + 0.5 * xUnit).rgb);\n gl_FragColor.a = coeffs.a + dot(coeffs.rgb,\n sample(tc + 1.5 * xUnit).rgb);\n}\n";
|
|
|
|
private final GlGenericDrawer drawer;
|
|
|
|
private final GlTextureFrameBuffer i420TextureFrameBuffer;
|
|
|
|
private final ShaderCallbacks shaderCallbacks;
|
|
|
|
private final ThreadUtils.ThreadChecker threadChecker;
|
|
|
|
private final VideoFrameDrawer videoFrameDrawer;
|
|
|
|
|
2022-03-02 20:59:20 +00:00
|
|
|
/* loaded from: classes3.dex */
|
2021-06-27 20:44:35 +00:00
|
|
|
public static class ShaderCallbacks implements GlGenericDrawer.ShaderCallbacks {
|
|
|
|
private float[] coeffs;
|
|
|
|
private int coeffsLoc;
|
|
|
|
private float stepSize;
|
|
|
|
private int xUnitLoc;
|
2022-03-02 20:59:20 +00:00
|
|
|
private static final float[] yCoeffs = {0.256788f, 0.504129f, 0.0979059f, 0.0627451f};
|
|
|
|
private static final float[] uCoeffs = {-0.148223f, -0.290993f, 0.439216f, 0.501961f};
|
|
|
|
private static final float[] vCoeffs = {0.439216f, -0.367788f, -0.0714274f, 0.501961f};
|
2021-06-27 20:44:35 +00:00
|
|
|
|
|
|
|
private ShaderCallbacks() {
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // org.webrtc.GlGenericDrawer.ShaderCallbacks
|
|
|
|
public void onNewShader(GlShader glShader) {
|
|
|
|
this.xUnitLoc = glShader.getUniformLocation("xUnit");
|
|
|
|
this.coeffsLoc = glShader.getUniformLocation("coeffs");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // org.webrtc.GlGenericDrawer.ShaderCallbacks
|
|
|
|
public void onPrepareShader(GlShader glShader, float[] fArr, int i, int i2, int i3, int i4) {
|
|
|
|
GLES20.glUniform4fv(this.coeffsLoc, 1, this.coeffs, 0);
|
|
|
|
int i5 = this.xUnitLoc;
|
|
|
|
float f = this.stepSize;
|
2022-03-02 20:59:20 +00:00
|
|
|
float f2 = i;
|
2021-06-27 20:44:35 +00:00
|
|
|
GLES20.glUniform2f(i5, (fArr[0] * f) / f2, (f * fArr[1]) / f2);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setPlaneU() {
|
|
|
|
this.coeffs = uCoeffs;
|
|
|
|
this.stepSize = 2.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setPlaneV() {
|
|
|
|
this.coeffs = vCoeffs;
|
|
|
|
this.stepSize = 2.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setPlaneY() {
|
|
|
|
this.coeffs = yCoeffs;
|
|
|
|
this.stepSize = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public YuvConverter() {
|
|
|
|
this(new VideoFrameDrawer());
|
|
|
|
}
|
|
|
|
|
|
|
|
public YuvConverter(VideoFrameDrawer videoFrameDrawer) {
|
|
|
|
ThreadUtils.ThreadChecker threadChecker = new ThreadUtils.ThreadChecker();
|
|
|
|
this.threadChecker = threadChecker;
|
|
|
|
this.i420TextureFrameBuffer = new GlTextureFrameBuffer(6408);
|
|
|
|
ShaderCallbacks shaderCallbacks = new ShaderCallbacks();
|
|
|
|
this.shaderCallbacks = shaderCallbacks;
|
2021-08-09 22:50:01 +00:00
|
|
|
this.drawer = new GlGenericDrawer(FRAGMENT_SHADER, shaderCallbacks);
|
2021-06-27 20:44:35 +00:00
|
|
|
this.videoFrameDrawer = videoFrameDrawer;
|
|
|
|
threadChecker.detachThread();
|
|
|
|
}
|
|
|
|
|
|
|
|
public VideoFrame.I420Buffer convert(VideoFrame.TextureBuffer textureBuffer) {
|
|
|
|
this.threadChecker.checkIsOnValidThread();
|
|
|
|
VideoFrame.TextureBuffer textureBuffer2 = (VideoFrame.TextureBuffer) this.videoFrameDrawer.prepareBufferForViewportSize(textureBuffer, textureBuffer.getWidth(), textureBuffer.getHeight());
|
|
|
|
int width = textureBuffer2.getWidth();
|
|
|
|
int height = textureBuffer2.getHeight();
|
|
|
|
int i = ((width + 7) / 8) * 8;
|
|
|
|
int i2 = (height + 1) / 2;
|
|
|
|
int i3 = height + i2;
|
|
|
|
ByteBuffer nativeAllocateByteBuffer = JniCommon.nativeAllocateByteBuffer(i * i3);
|
|
|
|
int i4 = i / 4;
|
|
|
|
Matrix matrix = new Matrix();
|
|
|
|
matrix.preTranslate(0.5f, 0.5f);
|
|
|
|
matrix.preScale(1.0f, -1.0f);
|
|
|
|
matrix.preTranslate(-0.5f, -0.5f);
|
|
|
|
this.i420TextureFrameBuffer.setSize(i4, i3);
|
|
|
|
GLES20.glBindFramebuffer(36160, this.i420TextureFrameBuffer.getFrameBufferId());
|
|
|
|
GlUtil.checkNoGLES2Error("glBindFramebuffer");
|
|
|
|
this.shaderCallbacks.setPlaneY();
|
|
|
|
VideoFrameDrawer.drawTexture(this.drawer, textureBuffer2, matrix, width, height, 0, 0, i4, height);
|
|
|
|
this.shaderCallbacks.setPlaneU();
|
|
|
|
int i5 = i4 / 2;
|
|
|
|
VideoFrameDrawer.drawTexture(this.drawer, textureBuffer2, matrix, width, height, 0, height, i5, i2);
|
|
|
|
this.shaderCallbacks.setPlaneV();
|
|
|
|
VideoFrameDrawer.drawTexture(this.drawer, textureBuffer2, matrix, width, height, i5, height, i5, i2);
|
|
|
|
GLES20.glReadPixels(0, 0, this.i420TextureFrameBuffer.getWidth(), this.i420TextureFrameBuffer.getHeight(), 6408, 5121, nativeAllocateByteBuffer);
|
|
|
|
GlUtil.checkNoGLES2Error("YuvConverter.convert");
|
|
|
|
GLES20.glBindFramebuffer(36160, 0);
|
|
|
|
int i6 = (i * height) + 0;
|
|
|
|
int i7 = i / 2;
|
|
|
|
int i8 = i6 + i7;
|
|
|
|
nativeAllocateByteBuffer.position(0);
|
|
|
|
nativeAllocateByteBuffer.limit(i6);
|
|
|
|
ByteBuffer slice = nativeAllocateByteBuffer.slice();
|
|
|
|
nativeAllocateByteBuffer.position(i6);
|
|
|
|
int i9 = ((i2 - 1) * i) + i7;
|
|
|
|
nativeAllocateByteBuffer.limit(i6 + i9);
|
|
|
|
ByteBuffer slice2 = nativeAllocateByteBuffer.slice();
|
|
|
|
nativeAllocateByteBuffer.position(i8);
|
|
|
|
nativeAllocateByteBuffer.limit(i8 + i9);
|
|
|
|
ByteBuffer slice3 = nativeAllocateByteBuffer.slice();
|
|
|
|
textureBuffer2.release();
|
|
|
|
return JavaI420Buffer.wrap(width, height, slice, i, slice2, i, slice3, i, new j0(nativeAllocateByteBuffer));
|
|
|
|
}
|
|
|
|
|
|
|
|
public void release() {
|
|
|
|
this.threadChecker.checkIsOnValidThread();
|
|
|
|
this.drawer.release();
|
|
|
|
this.i420TextureFrameBuffer.release();
|
|
|
|
this.videoFrameDrawer.release();
|
|
|
|
this.threadChecker.detachThread();
|
|
|
|
}
|
|
|
|
}
|