OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 20 matching lines...) Expand all Loading... |
31 import java.util.concurrent.CountDownLatch; | 31 import java.util.concurrent.CountDownLatch; |
32 | 32 |
33 import javax.microedition.khronos.egl.EGLConfig; | 33 import javax.microedition.khronos.egl.EGLConfig; |
34 import javax.microedition.khronos.egl.EGL10; | 34 import javax.microedition.khronos.egl.EGL10; |
35 import javax.microedition.khronos.egl.EGLContext; | 35 import javax.microedition.khronos.egl.EGLContext; |
36 import javax.microedition.khronos.opengles.GL10; | 36 import javax.microedition.khronos.opengles.GL10; |
37 | 37 |
38 import android.annotation.SuppressLint; | 38 import android.annotation.SuppressLint; |
39 import android.graphics.Point; | 39 import android.graphics.Point; |
40 import android.graphics.Rect; | 40 import android.graphics.Rect; |
41 import android.graphics.SurfaceTexture; | |
42 import android.opengl.GLES20; | 41 import android.opengl.GLES20; |
43 import android.opengl.GLSurfaceView; | 42 import android.opengl.GLSurfaceView; |
44 | 43 |
45 import org.webrtc.Logging; | 44 import org.webrtc.Logging; |
46 import org.webrtc.VideoRenderer.I420Frame; | 45 import org.webrtc.VideoRenderer.I420Frame; |
47 | 46 |
48 /** | 47 /** |
49 * Efficiently renders YUV frames using the GPU for CSC. | 48 * Efficiently renders YUV frames using the GPU for CSC. |
50 * Clients will want first to call setView() to pass GLSurfaceView | 49 * Clients will want first to call setView() to pass GLSurfaceView |
51 * and then for each video stream either create instance of VideoRenderer using | 50 * and then for each video stream either create instance of VideoRenderer using |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 long now = System.nanoTime(); | 233 long now = System.nanoTime(); |
235 | 234 |
236 final boolean isNewFrame; | 235 final boolean isNewFrame; |
237 synchronized (pendingFrameLock) { | 236 synchronized (pendingFrameLock) { |
238 isNewFrame = (pendingFrame != null); | 237 isNewFrame = (pendingFrame != null); |
239 if (isNewFrame && startTimeNs == -1) { | 238 if (isNewFrame && startTimeNs == -1) { |
240 startTimeNs = now; | 239 startTimeNs = now; |
241 } | 240 } |
242 | 241 |
243 if (isNewFrame) { | 242 if (isNewFrame) { |
| 243 rotatedSamplingMatrix = RendererCommon.rotateTextureMatrix( |
| 244 pendingFrame.samplingMatrix, pendingFrame.rotationDegree); |
244 if (pendingFrame.yuvFrame) { | 245 if (pendingFrame.yuvFrame) { |
245 rendererType = RendererType.RENDERER_YUV; | 246 rendererType = RendererType.RENDERER_YUV; |
246 drawer.uploadYuvData(yuvTextures, pendingFrame.width, pendingFrame.h
eight, | 247 drawer.uploadYuvData(yuvTextures, pendingFrame.width, pendingFrame.h
eight, |
247 pendingFrame.yuvStrides, pendingFrame.yuvPlanes); | 248 pendingFrame.yuvStrides, pendingFrame.yuvPlanes); |
248 // The convention in WebRTC is that the first element in a ByteBuffe
r corresponds to the | |
249 // top-left corner of the image, but in glTexImage2D() the first ele
ment corresponds to | |
250 // the bottom-left corner. We correct this discrepancy by setting a
vertical flip as | |
251 // sampling matrix. | |
252 final float[] samplingMatrix = RendererCommon.verticalFlipMatrix(); | |
253 rotatedSamplingMatrix = | |
254 RendererCommon.rotateTextureMatrix(samplingMatrix, pendingFrame.
rotationDegree); | |
255 } else { | 249 } else { |
256 rendererType = RendererType.RENDERER_TEXTURE; | 250 rendererType = RendererType.RENDERER_TEXTURE; |
257 // External texture rendering. Update texture image to latest and ma
ke a deep copy of | 251 // External texture rendering. Make a deep copy of the external text
ure. |
258 // the external texture. | |
259 // TODO(magjed): Move updateTexImage() to the video source instead. | |
260 final SurfaceTexture surfaceTexture = (SurfaceTexture) pendingFrame.
textureObject; | |
261 surfaceTexture.updateTexImage(); | |
262 final float[] samplingMatrix = new float[16]; | |
263 surfaceTexture.getTransformMatrix(samplingMatrix); | |
264 rotatedSamplingMatrix = | |
265 RendererCommon.rotateTextureMatrix(samplingMatrix, pendingFrame.
rotationDegree); | |
266 | |
267 // Reallocate offscreen texture if necessary. | 252 // Reallocate offscreen texture if necessary. |
268 textureCopy.setSize(pendingFrame.rotatedWidth(), pendingFrame.rotate
dHeight()); | 253 textureCopy.setSize(pendingFrame.rotatedWidth(), pendingFrame.rotate
dHeight()); |
269 | 254 |
270 // Bind our offscreen framebuffer. | 255 // Bind our offscreen framebuffer. |
271 GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, textureCopy.getFrame
BufferId()); | 256 GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, textureCopy.getFrame
BufferId()); |
272 GlUtil.checkNoGLES2Error("glBindFramebuffer"); | 257 GlUtil.checkNoGLES2Error("glBindFramebuffer"); |
273 | 258 |
274 // Copy the OES texture content. This will also normalize the sampli
ng matrix. | 259 // Copy the OES texture content. This will also normalize the sampli
ng matrix. |
275 GLES20.glViewport(0, 0, textureCopy.getWidth(), textureCopy.getHeig
ht()); | 260 GLES20.glViewport(0, 0, textureCopy.getWidth(), textureCopy.getHeig
ht()); |
276 drawer.drawOes(pendingFrame.textureId, rotatedSamplingMatrix); | 261 drawer.drawOes(pendingFrame.textureId, rotatedSamplingMatrix); |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 GLES20.glViewport(0, 0, screenWidth, screenHeight); | 639 GLES20.glViewport(0, 0, screenWidth, screenHeight); |
655 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); | 640 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
656 synchronized (yuvImageRenderers) { | 641 synchronized (yuvImageRenderers) { |
657 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { | 642 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { |
658 yuvImageRenderer.draw(drawer); | 643 yuvImageRenderer.draw(drawer); |
659 } | 644 } |
660 } | 645 } |
661 } | 646 } |
662 | 647 |
663 } | 648 } |
OLD | NEW |