| Index: webrtc/modules/video_render/android/video_render_android_surface_view.cc
|
| diff --git a/webrtc/modules/video_render/android/video_render_android_surface_view.cc b/webrtc/modules/video_render/android/video_render_android_surface_view.cc
|
| deleted file mode 100644
|
| index ea3b106b1ed6a2b12e8ef57fe4f98d6b2bda998e..0000000000000000000000000000000000000000
|
| --- a/webrtc/modules/video_render/android/video_render_android_surface_view.cc
|
| +++ /dev/null
|
| @@ -1,474 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
| -#include "webrtc/modules/video_render/android/video_render_android_surface_view.h"
|
| -#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
|
| -#include "webrtc/system_wrappers/include/tick_util.h"
|
| -
|
| -#ifdef ANDROID_LOG
|
| -#include <android/log.h>
|
| -#include <stdio.h>
|
| -
|
| -#undef WEBRTC_TRACE
|
| -#define WEBRTC_TRACE(a,b,c,...) __android_log_print(ANDROID_LOG_DEBUG, "*WEBRTC*", __VA_ARGS__)
|
| -#else
|
| -#include "webrtc/system_wrappers/include/trace.h"
|
| -#endif
|
| -
|
| -namespace webrtc {
|
| -
|
| -AndroidSurfaceViewRenderer::AndroidSurfaceViewRenderer(
|
| - const int32_t id,
|
| - const VideoRenderType videoRenderType,
|
| - void* window,
|
| - const bool fullscreen) :
|
| - VideoRenderAndroid(id,videoRenderType,window,fullscreen),
|
| - _javaRenderObj(NULL),
|
| - _javaRenderClass(NULL) {
|
| -}
|
| -
|
| -AndroidSurfaceViewRenderer::~AndroidSurfaceViewRenderer() {
|
| - WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id,
|
| - "AndroidSurfaceViewRenderer dtor");
|
| - if(g_jvm) {
|
| - // get the JNI env for this thread
|
| - bool isAttached = false;
|
| - JNIEnv* env = NULL;
|
| - if (g_jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
|
| - // try to attach the thread and get the env
|
| - // Attach this thread to JVM
|
| - jint res = g_jvm->AttachCurrentThread(&env, NULL);
|
| -
|
| - // Get the JNI env for this thread
|
| - if ((res < 0) || !env) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not attach thread to JVM (%d, %p)",
|
| - __FUNCTION__,
|
| - res,
|
| - env);
|
| - env=NULL;
|
| - }
|
| - else {
|
| - isAttached = true;
|
| - }
|
| - }
|
| - env->DeleteGlobalRef(_javaRenderObj);
|
| - env->DeleteGlobalRef(_javaRenderClass);
|
| -
|
| - if (isAttached) {
|
| - if (g_jvm->DetachCurrentThread() < 0) {
|
| - WEBRTC_TRACE(kTraceWarning,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not detach thread from JVM",
|
| - __FUNCTION__);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -int32_t AndroidSurfaceViewRenderer::Init() {
|
| - WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s", __FUNCTION__);
|
| - if (!g_jvm) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "(%s): Not a valid Java VM pointer.",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| - if(!_ptrWindow) {
|
| - WEBRTC_TRACE(kTraceWarning,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "(%s): No window have been provided.",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // get the JNI env for this thread
|
| - bool isAttached = false;
|
| - JNIEnv* env = NULL;
|
| - if (g_jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
|
| - // try to attach the thread and get the env
|
| - // Attach this thread to JVM
|
| - jint res = g_jvm->AttachCurrentThread(&env, NULL);
|
| -
|
| - // Get the JNI env for this thread
|
| - if ((res < 0) || !env) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not attach thread to JVM (%d, %p)",
|
| - __FUNCTION__,
|
| - res,
|
| - env);
|
| - return -1;
|
| - }
|
| - isAttached = true;
|
| - }
|
| -
|
| - // get the ViESurfaceRender class
|
| - jclass javaRenderClassLocal =
|
| - env->FindClass("org/webrtc/videoengine/ViESurfaceRenderer");
|
| - if (!javaRenderClassLocal) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not find ViESurfaceRenderer",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // create a global reference to the class (to tell JNI that
|
| - // we are referencing it after this function has returned)
|
| - _javaRenderClass =
|
| - reinterpret_cast<jclass>(env->NewGlobalRef(javaRenderClassLocal));
|
| - if (!_javaRenderClass) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not create Java ViESurfaceRenderer class reference",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // Delete local class ref, we only use the global ref
|
| - env->DeleteLocalRef(javaRenderClassLocal);
|
| -
|
| - // get the method ID for the constructor
|
| - jmethodID cid = env->GetMethodID(_javaRenderClass,
|
| - "<init>",
|
| - "(Landroid/view/SurfaceView;)V");
|
| - if (cid == NULL) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not get constructor ID",
|
| - __FUNCTION__);
|
| - return -1; /* exception thrown */
|
| - }
|
| -
|
| - // construct the object
|
| - jobject javaRenderObjLocal = env->NewObject(_javaRenderClass,
|
| - cid,
|
| - _ptrWindow);
|
| - if (!javaRenderObjLocal) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not create Java Render",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // create a reference to the object (to tell JNI that we are referencing it
|
| - // after this function has returned)
|
| - _javaRenderObj = env->NewGlobalRef(javaRenderObjLocal);
|
| - if (!_javaRenderObj) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not create Java SurfaceRender object reference",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // Detach this thread if it was attached
|
| - if (isAttached) {
|
| - if (g_jvm->DetachCurrentThread() < 0) {
|
| - WEBRTC_TRACE(kTraceWarning,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not detach thread from JVM", __FUNCTION__);
|
| - }
|
| - }
|
| -
|
| - WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s done", __FUNCTION__);
|
| - return 0;
|
| -}
|
| -
|
| -AndroidStream*
|
| -AndroidSurfaceViewRenderer::CreateAndroidRenderChannel(
|
| - int32_t streamId,
|
| - int32_t zOrder,
|
| - const float left,
|
| - const float top,
|
| - const float right,
|
| - const float bottom,
|
| - VideoRenderAndroid& renderer) {
|
| - WEBRTC_TRACE(kTraceDebug,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Id %d",
|
| - __FUNCTION__,
|
| - streamId);
|
| - AndroidSurfaceViewChannel* stream =
|
| - new AndroidSurfaceViewChannel(streamId, g_jvm, renderer, _javaRenderObj);
|
| - if(stream && stream->Init(zOrder, left, top, right, bottom) == 0)
|
| - return stream;
|
| - else
|
| - delete stream;
|
| - return NULL;
|
| -}
|
| -
|
| -AndroidSurfaceViewChannel::AndroidSurfaceViewChannel(
|
| - uint32_t streamId,
|
| - JavaVM* jvm,
|
| - VideoRenderAndroid& renderer,
|
| - jobject javaRenderObj) :
|
| - _id(streamId),
|
| - _renderCritSect(*CriticalSectionWrapper::CreateCriticalSection()),
|
| - _renderer(renderer),
|
| - _jvm(jvm),
|
| - _javaRenderObj(javaRenderObj),
|
| -#ifndef ANDROID_NDK_8_OR_ABOVE
|
| - _javaByteBufferObj(NULL),
|
| - _directBuffer(NULL),
|
| -#endif
|
| - _bitmapWidth(0),
|
| - _bitmapHeight(0) {
|
| -}
|
| -
|
| -AndroidSurfaceViewChannel::~AndroidSurfaceViewChannel() {
|
| - WEBRTC_TRACE(kTraceInfo,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "AndroidSurfaceViewChannel dtor");
|
| - delete &_renderCritSect;
|
| - if(_jvm) {
|
| - // get the JNI env for this thread
|
| - bool isAttached = false;
|
| - JNIEnv* env = NULL;
|
| - if ( _jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
|
| - // try to attach the thread and get the env
|
| - // Attach this thread to JVM
|
| - jint res = _jvm->AttachCurrentThread(&env, NULL);
|
| -
|
| - // Get the JNI env for this thread
|
| - if ((res < 0) || !env) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not attach thread to JVM (%d, %p)",
|
| - __FUNCTION__,
|
| - res,
|
| - env);
|
| - env=NULL;
|
| - }
|
| - else {
|
| - isAttached = true;
|
| - }
|
| - }
|
| -
|
| - env->DeleteGlobalRef(_javaByteBufferObj);
|
| - if (isAttached) {
|
| - if (_jvm->DetachCurrentThread() < 0) {
|
| - WEBRTC_TRACE(kTraceWarning,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not detach thread from JVM",
|
| - __FUNCTION__);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -int32_t AndroidSurfaceViewChannel::Init(
|
| - int32_t /*zOrder*/,
|
| - const float left,
|
| - const float top,
|
| - const float right,
|
| - const float bottom) {
|
| -
|
| - WEBRTC_TRACE(kTraceDebug,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: AndroidSurfaceViewChannel",
|
| - __FUNCTION__);
|
| - if (!_jvm) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Not a valid Java VM pointer",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - if( (top > 1 || top < 0) ||
|
| - (right > 1 || right < 0) ||
|
| - (bottom > 1 || bottom < 0) ||
|
| - (left > 1 || left < 0)) {
|
| - WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
|
| - "%s: Wrong coordinates", __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // get the JNI env for this thread
|
| - bool isAttached = false;
|
| - JNIEnv* env = NULL;
|
| - if (_jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
|
| - // try to attach the thread and get the env
|
| - // Attach this thread to JVM
|
| - jint res = _jvm->AttachCurrentThread(&env, NULL);
|
| -
|
| - // Get the JNI env for this thread
|
| - if ((res < 0) || !env) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not attach thread to JVM (%d, %p)",
|
| - __FUNCTION__,
|
| - res,
|
| - env);
|
| - return -1;
|
| - }
|
| - isAttached = true;
|
| - }
|
| -
|
| - jclass javaRenderClass =
|
| - env->FindClass("org/webrtc/videoengine/ViESurfaceRenderer");
|
| - if (!javaRenderClass) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not find ViESurfaceRenderer",
|
| - __FUNCTION__);
|
| - return -1;
|
| - }
|
| -
|
| - // get the method ID for the CreateIntArray
|
| - _createByteBufferCid =
|
| - env->GetMethodID(javaRenderClass,
|
| - "CreateByteBuffer",
|
| - "(II)Ljava/nio/ByteBuffer;");
|
| - if (_createByteBufferCid == NULL) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not get CreateByteBuffer ID",
|
| - __FUNCTION__);
|
| - return -1; /* exception thrown */
|
| - }
|
| -
|
| - // get the method ID for the DrawByteBuffer function
|
| - _drawByteBufferCid = env->GetMethodID(javaRenderClass,
|
| - "DrawByteBuffer",
|
| - "()V");
|
| - if (_drawByteBufferCid == NULL) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not get DrawByteBuffer ID",
|
| - __FUNCTION__);
|
| - return -1; /* exception thrown */
|
| - }
|
| -
|
| - // get the method ID for the SetCoordinates function
|
| - _setCoordinatesCid = env->GetMethodID(javaRenderClass,
|
| - "SetCoordinates",
|
| - "(FFFF)V");
|
| - if (_setCoordinatesCid == NULL) {
|
| - WEBRTC_TRACE(kTraceError,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: could not get SetCoordinates ID",
|
| - __FUNCTION__);
|
| - return -1; /* exception thrown */
|
| - }
|
| -
|
| - env->CallVoidMethod(_javaRenderObj, _setCoordinatesCid,
|
| - left, top, right, bottom);
|
| -
|
| - // Detach this thread if it was attached
|
| - if (isAttached) {
|
| - if (_jvm->DetachCurrentThread() < 0) {
|
| - WEBRTC_TRACE(kTraceWarning,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: Could not detach thread from JVM",
|
| - __FUNCTION__);
|
| - }
|
| - }
|
| -
|
| - WEBRTC_TRACE(kTraceDebug,
|
| - kTraceVideoRenderer,
|
| - _id,
|
| - "%s: AndroidSurfaceViewChannel done",
|
| - __FUNCTION__);
|
| - return 0;
|
| -}
|
| -
|
| -int32_t AndroidSurfaceViewChannel::RenderFrame(const uint32_t /*streamId*/,
|
| - const VideoFrame& videoFrame) {
|
| - // WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer,_id, "%s:" ,__FUNCTION__);
|
| - _renderCritSect.Enter();
|
| - _bufferToRender = videoFrame;
|
| - _renderCritSect.Leave();
|
| - _renderer.ReDraw();
|
| - return 0;
|
| -}
|
| -
|
| -
|
| -/*Implements AndroidStream
|
| - * Calls the Java object and render the buffer in _bufferToRender
|
| - */
|
| -void AndroidSurfaceViewChannel::DeliverFrame(JNIEnv* jniEnv) {
|
| - _renderCritSect.Enter();
|
| -
|
| - if (_bitmapWidth != _bufferToRender.width() ||
|
| - _bitmapHeight != _bufferToRender.height()) {
|
| - WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s: New render size %d "
|
| - "%d",__FUNCTION__,
|
| - _bufferToRender.width(), _bufferToRender.height());
|
| - if (_javaByteBufferObj) {
|
| - jniEnv->DeleteGlobalRef(_javaByteBufferObj);
|
| - _javaByteBufferObj = NULL;
|
| - _directBuffer = NULL;
|
| - }
|
| -
|
| - jobject javaByteBufferObj =
|
| - jniEnv->CallObjectMethod(_javaRenderObj, _createByteBufferCid,
|
| - _bufferToRender.width(),
|
| - _bufferToRender.height());
|
| - _javaByteBufferObj = jniEnv->NewGlobalRef(javaByteBufferObj);
|
| - if (!_javaByteBufferObj) {
|
| - WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s: could not "
|
| - "create Java ByteBuffer object reference", __FUNCTION__);
|
| - _renderCritSect.Leave();
|
| - return;
|
| - } else {
|
| - _directBuffer = static_cast<unsigned char*>
|
| - (jniEnv->GetDirectBufferAddress(_javaByteBufferObj));
|
| - _bitmapWidth = _bufferToRender.width();
|
| - _bitmapHeight = _bufferToRender.height();
|
| - }
|
| - }
|
| -
|
| - if(_javaByteBufferObj && _bitmapWidth && _bitmapHeight) {
|
| - const int conversionResult =
|
| - ConvertFromI420(_bufferToRender, kRGB565, 0, _directBuffer);
|
| -
|
| - if (conversionResult < 0) {
|
| - WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s: Color conversion"
|
| - " failed.", __FUNCTION__);
|
| - _renderCritSect.Leave();
|
| - return;
|
| - }
|
| - }
|
| - _renderCritSect.Leave();
|
| - // Draw the Surface
|
| - jniEnv->CallVoidMethod(_javaRenderObj, _drawByteBufferCid);
|
| -}
|
| -
|
| -} // namespace webrtc
|
|
|