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_SURFACE_VIEW_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_SURFACE_VIEW_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <jni.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/android/video_render_android_impl.h"
177e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/include/video_render_defines.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AndroidSurfaceViewChannel : public AndroidStream {
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
25e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  AndroidSurfaceViewChannel(uint32_t streamId,
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            JavaVM* jvm,
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            VideoRenderAndroid& renderer,
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            jobject javaRenderObj);
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~AndroidSurfaceViewChannel();
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  int32_t Init(int32_t zOrder, const float left, const float top,
32e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org               const float right, const float bottom);
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //Implement VideoRenderCallback
35e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  virtual int32_t RenderFrame(const uint32_t streamId,
36e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org                              I420VideoFrame& videoFrame);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //Implements AndroidStream
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void DeliverFrame(JNIEnv* jniEnv);
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
42e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  uint32_t _id;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CriticalSectionWrapper& _renderCritSect;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
453bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame _bufferToRender;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoRenderAndroid& _renderer;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  JavaVM* _jvm;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jobject _javaRenderObj;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jobject _javaByteBufferObj;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned char* _directBuffer;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jmethodID _createByteBufferCid;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jmethodID _drawByteBufferCid;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jmethodID _setCoordinatesCid;
563bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  int _bitmapWidth;
573bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  int _bitmapHeight;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AndroidSurfaceViewRenderer : private VideoRenderAndroid {
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
62e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  AndroidSurfaceViewRenderer(const int32_t id,
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             const VideoRenderType videoRenderType,
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             void* window,
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             const bool fullscreen);
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~AndroidSurfaceViewRenderer();
67e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org  int32_t Init();
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual AndroidStream* CreateAndroidRenderChannel(
69e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org      int32_t streamId,
70e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org      int32_t zOrder,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const float left,
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const float top,
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const float right,
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const float bottom,
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      VideoRenderAndroid& renderer);
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jobject _javaRenderObj;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  jclass _javaRenderClass;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_ANDROID_VIDEO_RENDER_ANDROID_SURFACE_VIEW_H_
84