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