| 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.opengl.EGL14; |
| 41 import android.opengl.GLES20; | 42 import android.opengl.GLES20; |
| 42 import android.opengl.GLSurfaceView; | 43 import android.opengl.GLSurfaceView; |
| 43 | 44 |
| 44 import org.webrtc.Logging; | 45 import org.webrtc.Logging; |
| 45 import org.webrtc.VideoRenderer.I420Frame; | 46 import org.webrtc.VideoRenderer.I420Frame; |
| 46 | 47 |
| 47 /** | 48 /** |
| 48 * Efficiently renders YUV frames using the GPU for CSC. | 49 * Efficiently renders YUV frames using the GPU for CSC. |
| 49 * Clients will want first to call setView() to pass GLSurfaceView | 50 * Clients will want first to call setView() to pass GLSurfaceView |
| 50 * and then for each video stream either create instance of VideoRenderer using | 51 * and then for each video stream either create instance of VideoRenderer using |
| 51 * createGui() call or VideoRenderer.Callbacks interface using create() call. | 52 * createGui() call or VideoRenderer.Callbacks interface using create() call. |
| 52 * Only one instance of the class can be created. | 53 * Only one instance of the class can be created. |
| 53 */ | 54 */ |
| 54 public class VideoRendererGui implements GLSurfaceView.Renderer { | 55 public class VideoRendererGui implements GLSurfaceView.Renderer { |
| 55 // |instance|, |instance.surface|, |eglContext|, and |eglContextReady| are syn
chronized on | 56 // |instance|, |instance.surface|, |eglContext|, and |eglContextReady| are syn
chronized on |
| 56 // |VideoRendererGui.class|. | 57 // |VideoRendererGui.class|. |
| 57 private static VideoRendererGui instance = null; | 58 private static VideoRendererGui instance = null; |
| 58 private static Runnable eglContextReady = null; | 59 private static Runnable eglContextReady = null; |
| 59 private static final String TAG = "VideoRendererGui"; | 60 private static final String TAG = "VideoRendererGui"; |
| 60 private GLSurfaceView surface; | 61 private GLSurfaceView surface; |
| 61 private static EGLContext eglContext = null; | 62 private static EglBase.Context eglContext = null; |
| 62 // Indicates if SurfaceView.Renderer.onSurfaceCreated was called. | 63 // Indicates if SurfaceView.Renderer.onSurfaceCreated was called. |
| 63 // If true then for every newly created yuv image renderer createTexture() | 64 // If true then for every newly created yuv image renderer createTexture() |
| 64 // should be called. The variable is accessed on multiple threads and | 65 // should be called. The variable is accessed on multiple threads and |
| 65 // all accesses are synchronized on yuvImageRenderers' object lock. | 66 // all accesses are synchronized on yuvImageRenderers' object lock. |
| 66 private boolean onSurfaceCreatedCalled; | 67 private boolean onSurfaceCreatedCalled; |
| 67 private int screenWidth; | 68 private int screenWidth; |
| 68 private int screenHeight; | 69 private int screenHeight; |
| 69 // List of yuv renderers. | 70 // List of yuv renderers. |
| 70 private final ArrayList<YuvImageRenderer> yuvImageRenderers; | 71 private final ArrayList<YuvImageRenderer> yuvImageRenderers; |
| 71 // Render and draw threads. | 72 // Render and draw threads. |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 | 412 |
| 412 /** Passes GLSurfaceView to video renderer. */ | 413 /** Passes GLSurfaceView to video renderer. */ |
| 413 public static synchronized void setView(GLSurfaceView surface, | 414 public static synchronized void setView(GLSurfaceView surface, |
| 414 Runnable eglContextReadyCallback) { | 415 Runnable eglContextReadyCallback) { |
| 415 Logging.d(TAG, "VideoRendererGui.setView"); | 416 Logging.d(TAG, "VideoRendererGui.setView"); |
| 416 instance = new VideoRendererGui(surface); | 417 instance = new VideoRendererGui(surface); |
| 417 eglContextReady = eglContextReadyCallback; | 418 eglContextReady = eglContextReadyCallback; |
| 418 } | 419 } |
| 419 | 420 |
| 420 public static synchronized EglBase.Context getEglBaseContext() { | 421 public static synchronized EglBase.Context getEglBaseContext() { |
| 421 return new EglBase10.Context(eglContext); | 422 return eglContext; |
| 422 } | 423 } |
| 423 | 424 |
| 424 /** Releases GLSurfaceView video renderer. */ | 425 /** Releases GLSurfaceView video renderer. */ |
| 425 public static synchronized void dispose() { | 426 public static synchronized void dispose() { |
| 426 if (instance == null){ | 427 if (instance == null){ |
| 427 return; | 428 return; |
| 428 } | 429 } |
| 429 Logging.d(TAG, "VideoRendererGui.dispose"); | 430 Logging.d(TAG, "VideoRendererGui.dispose"); |
| 430 synchronized (instance.yuvImageRenderers) { | 431 synchronized (instance.yuvImageRenderers) { |
| 431 for (YuvImageRenderer yuvImageRenderer : instance.yuvImageRenderers) { | 432 for (YuvImageRenderer yuvImageRenderer : instance.yuvImageRenderers) { |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 printStackTrace(renderFrameThread, "Render frame thread"); | 601 printStackTrace(renderFrameThread, "Render frame thread"); |
| 601 printStackTrace(drawThread, "Draw thread"); | 602 printStackTrace(drawThread, "Draw thread"); |
| 602 } | 603 } |
| 603 | 604 |
| 604 @SuppressLint("NewApi") | 605 @SuppressLint("NewApi") |
| 605 @Override | 606 @Override |
| 606 public void onSurfaceCreated(GL10 unused, EGLConfig config) { | 607 public void onSurfaceCreated(GL10 unused, EGLConfig config) { |
| 607 Logging.d(TAG, "VideoRendererGui.onSurfaceCreated"); | 608 Logging.d(TAG, "VideoRendererGui.onSurfaceCreated"); |
| 608 // Store render EGL context. | 609 // Store render EGL context. |
| 609 synchronized (VideoRendererGui.class) { | 610 synchronized (VideoRendererGui.class) { |
| 610 eglContext = ((EGL10) EGLContext.getEGL()).eglGetCurrentContext(); | 611 if (EglBase14.isEGL14Supported()) { |
| 612 eglContext = new EglBase14.Context(EGL14.eglGetCurrentContext()); |
| 613 } else { |
| 614 eglContext = new EglBase10.Context(((EGL10) EGLContext.getEGL()).eglGetC
urrentContext()); |
| 615 } |
| 616 |
| 611 Logging.d(TAG, "VideoRendererGui EGL Context: " + eglContext); | 617 Logging.d(TAG, "VideoRendererGui EGL Context: " + eglContext); |
| 612 } | 618 } |
| 613 | 619 |
| 614 synchronized (yuvImageRenderers) { | 620 synchronized (yuvImageRenderers) { |
| 615 // Create textures for all images. | 621 // Create textures for all images. |
| 616 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { | 622 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { |
| 617 yuvImageRenderer.createTextures(); | 623 yuvImageRenderer.createTextures(); |
| 618 } | 624 } |
| 619 onSurfaceCreatedCalled = true; | 625 onSurfaceCreatedCalled = true; |
| 620 } | 626 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 651 GLES20.glViewport(0, 0, screenWidth, screenHeight); | 657 GLES20.glViewport(0, 0, screenWidth, screenHeight); |
| 652 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); | 658 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
| 653 synchronized (yuvImageRenderers) { | 659 synchronized (yuvImageRenderers) { |
| 654 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { | 660 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { |
| 655 yuvImageRenderer.draw(); | 661 yuvImageRenderer.draw(); |
| 656 } | 662 } |
| 657 } | 663 } |
| 658 } | 664 } |
| 659 | 665 |
| 660 } | 666 } |
| OLD | NEW |