1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <jni.h> 1552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 1652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org#include <map> 1752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 1807e96da4b4ae3ba9e722128fc650f6b10ff663f5andrew@webrtc.org#include "webrtc/modules/video_render/i_video_render.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//#define ANDROID_LOG 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper; 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper; 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The object a module user uses to send new frames to the java renderer 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Base class for android render streams. 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AndroidStream : public VideoRenderCallback { 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // DeliverFrame is called from a thread connected to the Java VM. 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Used for Delivering frame for rendering. 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void DeliverFrame(JNIEnv* jniEnv)=0; 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~AndroidStream() {}; 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoRenderAndroid: IVideoRender { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 43e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoRenderAndroid(const int32_t id, 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const VideoRenderType videoRenderType, 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* window, 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool fullscreen); 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~VideoRenderAndroid(); 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 50e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t Init()=0; 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 52e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t ChangeUniqueId(const int32_t id); 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t ChangeWindow(void* window); 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual VideoRenderCallback* AddIncomingRenderStream( 57e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 58e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t zOrder, 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, const float top, 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, const float bottom); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t DeleteIncomingRenderStream( 63e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t GetIncomingRenderStreamProperties( 66e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 67e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& zOrder, 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float& left, float& top, 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float& right, float& bottom) const; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t StartRender(); 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t StopRender(); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ReDraw(); 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Properties 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual VideoRenderType RenderType(); 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual RawVideoType PerferedVideoType(); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool FullScreen(); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t GetGraphicsMemory( 86e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint64_t& totalGraphicsMemory, 87e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint64_t& availableGraphicsMemory) const; 88e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 89e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t GetScreenResolution( 90e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& screenWidth, 91e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& screenHeight) const; 92e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 93e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual uint32_t RenderFrameRate(const uint32_t streamId); 94e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 95e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t SetStreamCropping(const uint32_t streamId, 96e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float left, const float top, 97e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float right, const float bottom); 98e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 99e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t SetTransparentBackground(const bool enable); 100e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 101e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t ConfigureRenderer(const uint32_t streamId, 102e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const unsigned int zOrder, 103e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float left, const float top, 104e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float right, const float bottom); 105e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 106e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t SetText(const uint8_t textId, 107e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint8_t* text, 108e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const int32_t textLength, 109e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t textColorRef, 110e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t backgroundColorRef, 111e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float left, const float top, 112e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float rigth, const float bottom); 113e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 114e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t SetBitmap(const void* bitMap, 115e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint8_t pictureId, 116e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const void* colorKey, const float left, 117e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float top, const float right, 118e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float bottom); 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static JavaVM* g_jvm; 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual AndroidStream* CreateAndroidRenderChannel( 123e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t streamId, 124e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t zOrder, 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom, 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderAndroid& renderer) = 0; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t _id; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _critSect; 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderType _renderType; 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org jobject _ptrWindow; 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static bool JavaRenderThreadFun(void* obj); 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool JavaRenderThreadProcess(); 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Map with streams to render. 14152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org typedef std::map<int32_t, AndroidStream*> AndroidStreamMap; 14252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org AndroidStreamMap _streamsMap; 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // True if the _javaRenderThread thread shall be detached from the JVM. 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _javaShutDownFlag; 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventWrapper& _javaShutdownEvent; 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventWrapper& _javaRenderEvent; 147e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int64_t _lastJavaRenderEvent; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org JNIEnv* _javaRenderJniEnv; // JNIEnv for the java render thread. 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ThreadWrapper* _javaRenderThread; 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1523b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_ 155