video_render_android_native_opengl2.cc revision ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9
1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
266487e16299d868af6602258c72675b220518235leozwang@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "video_render_android_native_opengl2.h"
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "critical_section_wrapper.h"
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "tick_util.h"
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef ANDROID_LOG
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <stdio.h>
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <android/log.h>
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#undef WEBRTC_TRACE
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_TRACE(a,b,c,...)  __android_log_print(ANDROID_LOG_DEBUG, "*WEBRTC*", __VA_ARGS__)
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "trace.h"
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc {
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comAndroidNativeOpenGl2Renderer::AndroidNativeOpenGl2Renderer(
28ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org    const int32_t id,
29ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const VideoRenderType videoRenderType,
30ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    void* window,
31ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const bool fullscreen) :
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    VideoRenderAndroid(id, videoRenderType, window, fullscreen),
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    _javaRenderObj(NULL),
34f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    _javaRenderClass(NULL) {
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
37f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.orgbool AndroidNativeOpenGl2Renderer::UseOpenGL2(void* window) {
38f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!g_jvm) {
39f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1,
40f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "RendererAndroid():UseOpenGL No JVM set.");
41f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return false;
42f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
43f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  bool isAttached = false;
44f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  JNIEnv* env = NULL;
45f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (g_jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
46f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // try to attach the thread and get the env
47f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Attach this thread to JVM
48f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    jint res = g_jvm->AttachCurrentThread(&env, NULL);
49f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
50f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Get the JNI env for this thread
51f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if ((res < 0) || !env) {
52f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(
53f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org          kTraceError,
54f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org          kTraceVideoRenderer,
55f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org          -1,
56f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org          "RendererAndroid(): Could not attach thread to JVM (%d, %p)",
57f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org          res, env);
58f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      return false;
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
60f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    isAttached = true;
61f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
62f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
63f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the renderer class
64f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jclass javaRenderClassLocal =
65f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      env->FindClass("org/webrtc/videoengine/ViEAndroidGLES20");
66f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!javaRenderClassLocal) {
67f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1,
68f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not find ViEAndroidRenderer class",
69f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 __FUNCTION__);
70f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return false;
71f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
72f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
73f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the method ID for UseOpenGL
74f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jmethodID cidUseOpenGL = env->GetStaticMethodID(javaRenderClassLocal,
75f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                                  "UseOpenGL2",
76f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                                  "(Ljava/lang/Object;)Z");
77f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (cidUseOpenGL == NULL) {
78f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1,
79f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not get UseOpenGL ID", __FUNCTION__);
80f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return false;
81f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
82f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jboolean res = env->CallStaticBooleanMethod(javaRenderClassLocal,
83f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                              cidUseOpenGL, (jobject) window);
84f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
85f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // Detach this thread if it was attached
86f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (isAttached) {
87f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (g_jvm->DetachCurrentThread() < 0) {
88f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, -1,
89f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   "%s: Could not detach thread from JVM", __FUNCTION__);
90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
91f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
92f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  return res;
93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
95f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.orgAndroidNativeOpenGl2Renderer::~AndroidNativeOpenGl2Renderer() {
96f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id,
97f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               "AndroidNativeOpenGl2Renderer dtor");
98f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (g_jvm) {
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // get the JNI env for this thread
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool isAttached = false;
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    JNIEnv* env = NULL;
102f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (g_jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
103f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // try to attach the thread and get the env
104f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // Attach this thread to JVM
105f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      jint res = g_jvm->AttachCurrentThread(&env, NULL);
106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
107f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // Get the JNI env for this thread
108f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      if ((res < 0) || !env) {
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
110f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     "%s: Could not attach thread to JVM (%d, %p)",
111f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     __FUNCTION__, res, env);
112f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        env = NULL;
113f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      }
114f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      else {
115f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        isAttached = true;
116f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      }
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
119f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    env->DeleteGlobalRef(_javaRenderObj);
120f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    env->DeleteGlobalRef(_javaRenderClass);
121f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
122f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (isAttached) {
123f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      if (g_jvm->DetachCurrentThread() < 0) {
124f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id,
125f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     "%s: Could not detach thread from JVM",
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                     __FUNCTION__);
127f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      }
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
129f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
130f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org}
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
132ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.orgint32_t AndroidNativeOpenGl2Renderer::Init() {
133f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s", __FUNCTION__);
134f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!g_jvm) {
135f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
136f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "(%s): Not a valid Java VM pointer.", __FUNCTION__);
137f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
138f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
139f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!_ptrWindow) {
140f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id,
141f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "(%s): No window have been provided.", __FUNCTION__);
142f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
143f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
144f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
145f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the JNI env for this thread
146f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  bool isAttached = false;
147f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  JNIEnv* env = NULL;
148f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (g_jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
149f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // try to attach the thread and get the env
150f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Attach this thread to JVM
151f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    jint res = g_jvm->AttachCurrentThread(&env, NULL);
152f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
153f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Get the JNI env for this thread
154f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if ((res < 0) || !env) {
155f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
156f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   "%s: Could not attach thread to JVM (%d, %p)",
157f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   __FUNCTION__, res, env);
158f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      return -1;
159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
160f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    isAttached = true;
161f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
162f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
163f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the ViEAndroidGLES20 class
164f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jclass javaRenderClassLocal =
165f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      env->FindClass("org/webrtc/videoengine/ViEAndroidGLES20");
166f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!javaRenderClassLocal) {
167f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
168f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not find ViEAndroidGLES20", __FUNCTION__);
169f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
170f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
171f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
172f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // create a global reference to the class (to tell JNI that
173f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // we are referencing it after this function has returned)
174f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _javaRenderClass =
175f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      reinterpret_cast<jclass> (env->NewGlobalRef(javaRenderClassLocal));
176f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!_javaRenderClass) {
177f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
178f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not create Java SurfaceHolder class reference",
179f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 __FUNCTION__);
180f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
181f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
182f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
183f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // Delete local class ref, we only use the global ref
184f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  env->DeleteLocalRef(javaRenderClassLocal);
185f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
186f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // create a reference to the object (to tell JNI that we are referencing it
187f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // after this function has returned)
188f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _javaRenderObj = env->NewGlobalRef(_ptrWindow);
189f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!_javaRenderObj) {
190f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(
191f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        kTraceError,
192f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        kTraceVideoRenderer,
193f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        _id,
194f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        "%s: could not create Java SurfaceRender object reference",
195f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        __FUNCTION__);
196f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
197f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
198f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
199f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // Detach this thread if it was attached
200f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (isAttached) {
201f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (g_jvm->DetachCurrentThread() < 0) {
202f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id,
203f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   "%s: Could not detach thread from JVM", __FUNCTION__);
204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
205f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
206470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
207f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s done",
208f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               __FUNCTION__);
209f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  return 0;
210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comAndroidStream*
213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comAndroidNativeOpenGl2Renderer::CreateAndroidRenderChannel(
214ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org    int32_t streamId,
215ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org    int32_t zOrder,
216ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const float left,
217ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const float top,
218ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const float right,
219ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    const float bottom,
220f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    VideoRenderAndroid& renderer) {
221f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s: Id %d",
222f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               __FUNCTION__, streamId);
223f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  AndroidNativeOpenGl2Channel* stream =
224f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      new AndroidNativeOpenGl2Channel(streamId, g_jvm, renderer,
225f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                      _javaRenderObj);
226f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (stream && stream->Init(zOrder, left, top, right, bottom) == 0)
227f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return stream;
228f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  else {
229f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    delete stream;
230f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
231f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  return NULL;
232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
234ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.orgAndroidNativeOpenGl2Channel::AndroidNativeOpenGl2Channel(
235ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org    uint32_t streamId,
236ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    JavaVM* jvm,
237ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    VideoRenderAndroid& renderer,jobject javaRenderObj):
238470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    _id(streamId),
239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    _renderCritSect(*CriticalSectionWrapper::CreateCriticalSection()),
240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    _renderer(renderer), _jvm(jvm), _javaRenderObj(javaRenderObj),
241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    _registerNativeCID(NULL), _deRegisterNativeCID(NULL),
242f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    _openGLRenderer(streamId) {
243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
245f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.orgAndroidNativeOpenGl2Channel::~AndroidNativeOpenGl2Channel() {
246f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id,
247f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               "AndroidNativeOpenGl2Channel dtor");
248f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  delete &_renderCritSect;
249f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_jvm) {
250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // get the JNI env for this thread
251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool isAttached = false;
252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    JNIEnv* env = NULL;
253f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (_jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
254f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // try to attach the thread and get the env
255f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // Attach this thread to JVM
256f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      jint res = _jvm->AttachCurrentThread(&env, NULL);
257470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
258f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      // Get the JNI env for this thread
259f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      if ((res < 0) || !env) {
260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
261f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     "%s: Could not attach thread to JVM (%d, %p)",
262f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     __FUNCTION__, res, env);
263f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        env = NULL;
264f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      } else {
265f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        isAttached = true;
266f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      }
267470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
268f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (env && _deRegisterNativeCID) {
269f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      env->CallVoidMethod(_javaRenderObj, _deRegisterNativeCID);
270470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
272f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (isAttached) {
273f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      if (_jvm->DetachCurrentThread() < 0) {
274f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org        WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id,
275f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                     "%s: Could not detach thread from JVM",
276470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                     __FUNCTION__);
277f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      }
278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
279f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
280f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org}
281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
282ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.orgint32_t AndroidNativeOpenGl2Channel::Init(int32_t zOrder,
283ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org                                          const float left,
284ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org                                          const float top,
285ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org                                          const float right,
286ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org                                          const float bottom)
287f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org{
288f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id,
289f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               "%s: AndroidNativeOpenGl2Channel", __FUNCTION__);
290f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!_jvm) {
291f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
292f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: Not a valid Java VM pointer", __FUNCTION__);
293f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
294f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
295f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
296f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the JNI env for this thread
297f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  bool isAttached = false;
298f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  JNIEnv* env = NULL;
299f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
300f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // try to attach the thread and get the env
301f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Attach this thread to JVM
302f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    jint res = _jvm->AttachCurrentThread(&env, NULL);
303f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
304f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    // Get the JNI env for this thread
305f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if ((res < 0) || !env) {
306f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
307f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   "%s: Could not attach thread to JVM (%d, %p)",
308f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   __FUNCTION__, res, env);
309f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      return -1;
310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
311f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    isAttached = true;
312f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
313f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
314f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jclass javaRenderClass =
315f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      env->FindClass("org/webrtc/videoengine/ViEAndroidGLES20");
316f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (!javaRenderClass) {
317f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
318f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not find ViESurfaceRenderer", __FUNCTION__);
319f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
320f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
321f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
322f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // get the method ID for the ReDraw function
323f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _redrawCid = env->GetMethodID(javaRenderClass, "ReDraw", "()V");
324f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_redrawCid == NULL) {
325f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
326f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not get ReDraw ID", __FUNCTION__);
327f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
328f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
329f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
330f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _registerNativeCID = env->GetMethodID(javaRenderClass,
331f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                        "RegisterNativeObject", "(J)V");
332f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_registerNativeCID == NULL) {
333f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
334f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not get RegisterNativeObject ID", __FUNCTION__);
335f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
336f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
337f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
338f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _deRegisterNativeCID = env->GetMethodID(javaRenderClass,
339f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                                          "DeRegisterNativeObject", "()V");
340f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_deRegisterNativeCID == NULL) {
341f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
342f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: could not get DeRegisterNativeObject ID",
343f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 __FUNCTION__);
344f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
345f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
346f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
347f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  JNINativeMethod nativeFunctions[2] = {
348f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    { "DrawNative",
349f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      "(J)V",
350f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      (void*) &AndroidNativeOpenGl2Channel::DrawNativeStatic, },
351f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    { "CreateOpenGLNative",
352f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      "(JII)I",
353f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      (void*) &AndroidNativeOpenGl2Channel::CreateOpenGLNativeStatic },
354f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  };
355f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (env->RegisterNatives(javaRenderClass, nativeFunctions, 2) == 0) {
356f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, -1,
357f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: Registered native functions", __FUNCTION__);
358f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
359f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  else {
360f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1,
361f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                 "%s: Failed to register native functions", __FUNCTION__);
362f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
363f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
364f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
365f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  env->CallVoidMethod(_javaRenderObj, _registerNativeCID, (jlong) this);
366f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
367f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // Detach this thread if it was attached
368f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (isAttached) {
369f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    if (_jvm->DetachCurrentThread() < 0) {
370f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org      WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id,
371f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org                   "%s: Could not detach thread from JVM", __FUNCTION__);
372470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
373f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
374f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org
375f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  if (_openGLRenderer.SetCoordinates(zOrder, left, top, right, bottom) != 0) {
376f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org    return -1;
377f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  }
378f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id,
379f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org               "%s: AndroidNativeOpenGl2Channel done", __FUNCTION__);
380f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  return 0;
381470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
383ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.orgint32_t AndroidNativeOpenGl2Channel::RenderFrame(
384ddf94e71e524371f0cc2f6bcfed9ee5a972f11e9pbos@webrtc.org    const uint32_t /*streamId*/,
3859fedff7c17a8d3dc46ed5b3207220f59a22391d6mikhal@webrtc.org    I420VideoFrame& videoFrame) {
386f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  //   WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer,_id, "%s:" ,__FUNCTION__);
387f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _renderCritSect.Enter();
3889fedff7c17a8d3dc46ed5b3207220f59a22391d6mikhal@webrtc.org  _bufferToRender.SwapFrame(&videoFrame);
389f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _renderCritSect.Leave();
390f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  _renderer.ReDraw();
391f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  return 0;
392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*Implements AndroidStream
395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Calls the Java object and render the buffer in _bufferToRender
396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
397f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.orgvoid AndroidNativeOpenGl2Channel::DeliverFrame(JNIEnv* jniEnv) {
398f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  //TickTime timeNow=TickTime::Now();
399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
400f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  //Draw the Surface
401f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  jniEnv->CallVoidMethod(_javaRenderObj, _redrawCid);
402470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
403f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer,_id,
404f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // "%s: time to deliver %lld" ,__FUNCTION__,
405f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org  // (TickTime::Now()-timeNow).Milliseconds());
406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
408470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
409ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org * JNI callback from Java class. Called when the render
410ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org * want to render a frame. Called from the GLRenderThread
411470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Method:    DrawNative
412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Signature: (J)V
413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
414ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.orgvoid JNICALL AndroidNativeOpenGl2Channel::DrawNativeStatic(
415ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    JNIEnv * env, jobject, jlong context) {
416ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  AndroidNativeOpenGl2Channel* renderChannel =
417ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org      reinterpret_cast<AndroidNativeOpenGl2Channel*>(context);
418ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  renderChannel->DrawNative();
419470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
420470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
421f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.orgvoid AndroidNativeOpenGl2Channel::DrawNative() {
422ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  _openGLRenderer.Render(_bufferToRender);
423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
424ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org
425470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
426ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org * JNI callback from Java class. Called when the GLSurfaceview
427ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org * have created a surface. Called from the GLRenderThread
428470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Method:    CreateOpenGLNativeStatic
429470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Signature: (JII)I
430470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
431ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.orgjint JNICALL AndroidNativeOpenGl2Channel::CreateOpenGLNativeStatic(
432ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    JNIEnv * env,
433ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    jobject,
434ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    jlong context,
435ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    jint width,
436ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    jint height) {
437ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  AndroidNativeOpenGl2Channel* renderChannel =
438ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org      reinterpret_cast<AndroidNativeOpenGl2Channel*> (context);
439ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, -1, "%s:", __FUNCTION__);
440ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  return renderChannel->CreateOpenGLNative(width, height);
441470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
442470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
443ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.orgjint AndroidNativeOpenGl2Channel::CreateOpenGLNative(
444ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org    int width, int height) {
445ac9fd8af0964158842792daf9e6ab1ba3bc748a7leozwang@webrtc.org  return _openGLRenderer.Setup(width, height);
446470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
447470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
448f3dc22f7d19f750a47919196e6285fc21d81dae5leozwang@webrtc.org}  //namespace webrtc
449