aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/video_render/android/video_render_android_impl.h
blob: 34950db7d1d2ec2f967ba17c5d52b31dc07be6cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 *  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.
 */

#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_
#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_

#include <jni.h>

#include <map>

#include "webrtc/modules/video_render/i_video_render.h"
#include "webrtc/system_wrappers/include/thread_wrapper.h"


namespace webrtc {

//#define ANDROID_LOG

class CriticalSectionWrapper;
class EventWrapper;

// The object a module user uses to send new frames to the java renderer
// Base class for android render streams.

class AndroidStream : public VideoRenderCallback {
 public:
  // DeliverFrame is called from a thread connected to the Java VM.
  // Used for Delivering frame for rendering.
  virtual void DeliverFrame(JNIEnv* jniEnv)=0;

  virtual ~AndroidStream() {};
};

class VideoRenderAndroid: IVideoRender {
 public:
  VideoRenderAndroid(const int32_t id,
                     const VideoRenderType videoRenderType,
                     void* window,
                     const bool fullscreen);

  virtual ~VideoRenderAndroid();

  virtual int32_t Init()=0;

  virtual int32_t ChangeWindow(void* window);

  virtual VideoRenderCallback* AddIncomingRenderStream(
      const uint32_t streamId,
      const uint32_t zOrder,
      const float left, const float top,
      const float right, const float bottom);

  virtual int32_t DeleteIncomingRenderStream(
      const uint32_t streamId);

  virtual int32_t GetIncomingRenderStreamProperties(
      const uint32_t streamId,
      uint32_t& zOrder,
      float& left, float& top,
      float& right, float& bottom) const;

  virtual int32_t StartRender();

  virtual int32_t StopRender();

  virtual void ReDraw();

  // Properties

  virtual VideoRenderType RenderType();

  virtual RawVideoType PerferedVideoType();

  virtual bool FullScreen();

  virtual int32_t GetGraphicsMemory(
      uint64_t& totalGraphicsMemory,
      uint64_t& availableGraphicsMemory) const;

  virtual int32_t GetScreenResolution(
      uint32_t& screenWidth,
      uint32_t& screenHeight) const;

  virtual uint32_t RenderFrameRate(const uint32_t streamId);

  virtual int32_t SetStreamCropping(const uint32_t streamId,
                                    const float left, const float top,
                                    const float right, const float bottom);

  virtual int32_t SetTransparentBackground(const bool enable);

  virtual int32_t ConfigureRenderer(const uint32_t streamId,
                                    const unsigned int zOrder,
                                    const float left, const float top,
                                    const float right, const float bottom);

  virtual int32_t SetText(const uint8_t textId,
                          const uint8_t* text,
                          const int32_t textLength,
                          const uint32_t textColorRef,
                          const uint32_t backgroundColorRef,
                          const float left, const float top,
                          const float rigth, const float bottom);

  virtual int32_t SetBitmap(const void* bitMap,
                            const uint8_t pictureId,
                            const void* colorKey, const float left,
                            const float top, const float right,
                            const float bottom);
  static JavaVM* g_jvm;

 protected:
  virtual AndroidStream* CreateAndroidRenderChannel(
      int32_t streamId,
      int32_t zOrder,
      const float left,
      const float top,
      const float right,
      const float bottom,
      VideoRenderAndroid& renderer) = 0;

  int32_t _id;
  CriticalSectionWrapper& _critSect;
  VideoRenderType _renderType;
  jobject _ptrWindow;

 private:
  static bool JavaRenderThreadFun(void* obj);
  bool JavaRenderThreadProcess();

  // Map with streams to render.
  typedef std::map<int32_t, AndroidStream*> AndroidStreamMap;
  AndroidStreamMap _streamsMap;
  // True if the _javaRenderThread thread shall be detached from the JVM.
  bool _javaShutDownFlag;
  EventWrapper& _javaShutdownEvent;
  EventWrapper& _javaRenderEvent;
  int64_t _lastJavaRenderEvent;
  JNIEnv* _javaRenderJniEnv; // JNIEnv for the java render thread.
  rtc::scoped_ptr<ThreadWrapper> _javaRenderThread;
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_IMPL_H_