1a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org/*
2a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *
4a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org */
10a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
11a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// This file contains JNI for the video engine interfaces.
12a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// The native functions are found using jni's auto discovery.
13a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
14a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/video_engine_jni.h"
15a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
16a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <map>
17a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <string>
18a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
19a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/common_types.h"
20a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/jni_helpers.h"
21a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/media_codec_video_decoder.h"
22a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/voice_engine_jni.h"
23a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/modules/utility/interface/helpers_android.h"
24a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/test/channel_transport/include/channel_transport.h"
25a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_base.h"
26a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_capture.h"
27a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_codec.h"
28a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_external_codec.h"
29a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
30a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_render.h"
31a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
32a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
33a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Macro for native functions that can be found by way of jni-auto discovery.
34a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Note extern "C" is needed for "discovery" of native methods to work.
35a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define JOWW(rettype, name)                                             \
36a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  extern "C" rettype JNIEXPORT JNICALL Java_org_webrtc_webrtcdemo_##name
37a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
38a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgnamespace {
39a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
40a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgstatic JavaVM* g_vm = NULL;
41a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgstatic ClassReferenceHolder* g_class_reference_holder = NULL;
42a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
43a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgjclass GetClass(const char* name) {
44a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(g_class_reference_holder, "Class reference holder NULL");
45a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return g_class_reference_holder->GetClass(name);
46a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
47a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
48a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// C(++) description of a camera. This class is created by Java native calls
49a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// and associated with the CameraDesc Java class. The Java class is used in the
50a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Java code but it is just a thin wrapper of the C(++) class that contain the
51a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// actual information. The information is stored in C(++) as it is used to
52a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// call video engine APIs.
53a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgstruct CameraDesc {
54a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  // The name and id corresponds to ViECapture's |device_nameUTF8| and
55a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  // |unique_idUTF8|.
56a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  char name[64];
57a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  char unique_id[64];
58a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org};
59a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
60a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// C++ callback class that can be used to register for callbacks from the
61a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// video engine. It further propagates the callbacks to
62a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// VideoDecodeEncodeObserver.java interface. The memory associated with this
63a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// class is managed globally by the VideoEngineData class when registering and
64a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// unregistering VideoDecodeEncodeObserver.java to receive callbacks.
65a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgclass VideoDecodeEncodeObserver : public webrtc::ViEDecoderObserver,
66a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                  public webrtc::ViEEncoderObserver {
67a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org public:
68a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  explicit VideoDecodeEncodeObserver(jobject j_observer)
69a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      : j_observer_(j_observer) {
70a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
71a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
72a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jclass j_observer_class = jni->GetObjectClass(j_observer_);
73a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    incoming_rate_ =
74a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        GetMethodID(jni, j_observer_class, "incomingRate", "(III)V");
75a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    incoming_codec_changed_ =
76a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        GetMethodID(jni, j_observer_class, "incomingCodecChanged",
77a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                    "(ILorg/webrtc/webrtcdemo/VideoCodecInst;)V");
78a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    request_new_keyframe_ =
79a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        GetMethodID(jni, j_observer_class, "requestNewKeyFrame", "(I)V");
80a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    outgoing_rate_ =
81a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        GetMethodID(jni, j_observer_class, "outgoingRate", "(III)V");
82a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    j_observer_ = jni->NewGlobalRef(j_observer_);
83a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
84a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
85a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  ~VideoDecodeEncodeObserver() {
86a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
87a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
88a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jni->DeleteGlobalRef(j_observer_);
89a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
90a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
91a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void IncomingRate(const int video_channel,
92a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                            const unsigned int framerate,
93a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                            const unsigned int bitrate) {
94a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
95a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
96a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jni->CallVoidMethod(j_observer_, incoming_rate_, video_channel,
97a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                        static_cast<int>(framerate), static_cast<int>(bitrate));
98a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
99a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
100a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void DecoderTiming(int decode_ms, int max_decode_ms,
101a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                             int current_delay_ms, int target_delay_ms,
102a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                             int jitter_buffer_ms, int min_playout_delay_ms,
103a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                             int render_delay_ms) {
104a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    // TODO(fischman): consider plumbing this through to Java.
105a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
106a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
107a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void IncomingCodecChanged(const int video_channel,
108a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    const webrtc::VideoCodec& video_codec) {
109a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
110a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
111a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::VideoCodec* codec = new webrtc::VideoCodec(video_codec);
112a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jclass j_codec_class =
113a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        GetClass("org/webrtc/webrtcdemo/VideoCodecInst");
114a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jmethodID j_codec_ctor = GetMethodID(jni, j_codec_class, "<init>", "(J)V");
115a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jobject j_codec =
116a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        jni->NewObject(j_codec_class, j_codec_ctor, jlongFromPointer(codec));
117a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK_EXCEPTION(jni, "error during NewObject");
118a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jni->CallVoidMethod(j_observer_, incoming_codec_changed_, video_channel,
119a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                        j_codec);
120a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
121a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
122a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void RequestNewKeyFrame(const int video_channel) {
123a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
124a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
125a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jni->CallVoidMethod(j_observer_, request_new_keyframe_, video_channel);
126a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
127a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
128a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void OutgoingRate(const int video_channel,
129a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                            const unsigned int framerate,
130a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                            const unsigned int bitrate) {
131a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
132a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    JNIEnv* jni = ats.env();
133a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    jni->CallVoidMethod(j_observer_, outgoing_rate_, video_channel,
134a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                        static_cast<int>(framerate), static_cast<int>(bitrate));
135a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
136a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
137a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  virtual void SuspendChange(int video_channel, bool is_suspended) {}
138a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
139a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org private:
140a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jobject j_observer_;
141a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID incoming_rate_;
142a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID incoming_codec_changed_;
143a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID request_new_keyframe_;
144a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID outgoing_rate_;
145a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org};
146a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
147a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgtemplate<typename T>
148a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgvoid ReleaseSubApi(T instance) {
149a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(instance->Release() == 0, "failed to release instance")
150a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
151a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
152a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgclass VideoEngineData {
153a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org public:
154a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData()
155a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      : vie(webrtc::VideoEngine::Create()),
156a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        base(webrtc::ViEBase::GetInterface(vie)),
157a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        codec(webrtc::ViECodec::GetInterface(vie)),
158a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        network(webrtc::ViENetwork::GetInterface(vie)),
159a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        rtp(webrtc::ViERTP_RTCP::GetInterface(vie)),
160a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        render(webrtc::ViERender::GetInterface(vie)),
161a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        capture(webrtc::ViECapture::GetInterface(vie)),
162a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        externalCodec(webrtc::ViEExternalCodec::GetInterface(vie)) {
163a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(vie != NULL, "Video engine instance failed to be created");
164a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(base != NULL, "Failed to acquire base interface");
165a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(codec != NULL, "Failed to acquire codec interface");
166a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(network != NULL, "Failed to acquire network interface");
167a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(rtp != NULL, "Failed to acquire rtp interface");
168a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(render != NULL, "Failed to acquire render interface");
169a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(capture != NULL, "Failed to acquire capture interface");
170a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(externalCodec != NULL, "Failed to acquire externalCodec interface");
171a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
172a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
173a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  ~VideoEngineData() {
174a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(channel_transports_.empty(),
175a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "ViE transports must be deleted before terminating");
176a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(observers_.empty(),
177a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "ViE observers must be deleted before terminating");
178a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(external_decoders_.empty(),
179a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "ViE external decoders must be deleted before terminating");
180a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(externalCodec);
181a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(capture);
182a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(render);
183a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(rtp);
184a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(network);
185a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(codec);
186a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ReleaseSubApi(base);
187a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::VideoEngine* vie_pointer = vie;
188a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(webrtc::VideoEngine::Delete(vie_pointer), "ViE failed to be deleted");
189a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
190a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
191a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int CreateChannel() {
192a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    int channel;
193a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(base->CreateChannel(channel) == 0, "Failed to create channel");
194a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CreateTransport(channel);
195a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return channel;
196a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
197a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
198a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int DeleteChannel(int channel) {
199a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    if (base->DeleteChannel(channel) != 0) {
200a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      return -1;
201a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    }
202a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    DeleteTransport(channel);
203a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return 0;
204a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
205a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
206a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::test::VideoChannelTransport* GetTransport(int channel) {
207a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ChannelTransports::iterator found = channel_transports_.find(channel);
208a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    if (found == channel_transports_.end()) {
209a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      return NULL;
210a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    }
211a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return found->second;
212a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
213a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
214a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int RegisterObserver(int channel, jobject j_observer) {
215a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(observers_.find(channel) == observers_.end(),
216a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "Observer already created for channel, inconsistent state");
217a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    observers_[channel] = new VideoDecodeEncodeObserver(j_observer);
218a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    int ret_val = codec->RegisterDecoderObserver(channel, *observers_[channel]);
219a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ret_val |= codec->RegisterEncoderObserver(channel, *observers_[channel]);
220a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return ret_val;
221a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
222a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
223a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int DeregisterObserver(int channel) {
224a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    Observers::iterator found = observers_.find(channel);
225a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    if (observers_.find(channel) == observers_.end()) {
226a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      return -1;
227a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    }
228a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    int ret_val = codec->DeregisterDecoderObserver(channel);
229a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ret_val |= codec->DeregisterEncoderObserver(channel);
230a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    delete found->second;
231a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    observers_.erase(found);
232a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return ret_val;
233a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
234a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
235a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int RegisterExternalReceiveCodec(jint channel, jint pl_type, jobject decoder,
236a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                   bool internal_source) {
237a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(external_decoders_.find(channel) == external_decoders_.end(),
238a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "External decoder already created for channel, inconsistent state");
239a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    external_decoders_[channel] =
240a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        new webrtc::MediaCodecVideoDecoder(g_vm, decoder);
241a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return externalCodec->RegisterExternalReceiveCodec(
242a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        channel, pl_type, external_decoders_[channel], internal_source);
243a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
244a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
245a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int DeRegisterExternalReceiveCodec(jint channel, jint pl_type) {
246a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    ExternalDecoders::iterator found = external_decoders_.find(channel);
247a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(found != external_decoders_.end(),
248a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "ViE channel missing external decoder, inconsistent state");
249a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(externalCodec->DeRegisterExternalReceiveCodec(channel, pl_type) == 0,
250a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "Failed to register external receive decoder");
251a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    delete found->second;
252a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    external_decoders_.erase(found);
253a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return 0;
254a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
255a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
256a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::VideoEngine* const vie;
257a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViEBase* const base;
258a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViECodec* const codec;
259a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViENetwork* const network;
260a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViERTP_RTCP* const rtp;
261a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViERender* const render;
262a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViECapture* const capture;
263a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::ViEExternalCodec* const externalCodec;
264a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
265a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org private:
266a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  // Video engine no longer provides a socket implementation. There is,
267a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  // however, a socket implementation in webrtc::test.
268a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  typedef std::map<int, webrtc::test::VideoChannelTransport*>
269a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  ChannelTransports;
270a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  typedef std::map<int, VideoDecodeEncodeObserver*> Observers;
271a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  typedef std::map<int, webrtc::MediaCodecVideoDecoder*> ExternalDecoders;
272a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
273a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  void CreateTransport(int channel) {
274a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(GetTransport(channel) == NULL,
275a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "Transport already created for ViE channel, inconsistent state");
276a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    channel_transports_[channel] =
277a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        new webrtc::test::VideoChannelTransport(network, channel);
278a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
279a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  void DeleteTransport(int channel) {
280a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    CHECK(GetTransport(channel) != NULL,
281a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          "ViE channel missing transport, inconsistent state");
282a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    delete channel_transports_[channel];
283a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    channel_transports_.erase(channel);
284a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
285a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
286a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  ChannelTransports channel_transports_;
287a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  Observers observers_;
288a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  ExternalDecoders external_decoders_;
289a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org};
290a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
291a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgwebrtc::VideoCodec* GetCodecInst(JNIEnv* jni, jobject j_codec) {
292a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_codec_class = jni->GetObjectClass(j_codec);
293a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jfieldID native_codec_id =
294a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni->GetFieldID(j_codec_class, "nativeCodecInst", "J");
295a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jlong j_p = jni->GetLongField(j_codec, native_codec_id);
296a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return reinterpret_cast<webrtc::VideoCodec*>(j_p);
297a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
298a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
299a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgCameraDesc* GetCameraDesc(JNIEnv* jni, jobject j_camera) {
300a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_camera_class = jni->GetObjectClass(j_camera);
301a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jfieldID native_camera_id =
302a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni->GetFieldID(j_camera_class, "nativeCameraDesc", "J");
303a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jlong j_p = jni->GetLongField(j_camera, native_camera_id);
304a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return reinterpret_cast<CameraDesc*>(j_p);
305a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
306a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
307a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgVideoEngineData* GetVideoEngineData(JNIEnv* jni, jobject j_vie) {
308a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_vie_class = jni->GetObjectClass(j_vie);
309a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jfieldID native_vie_id =
310a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni->GetFieldID(j_vie_class, "nativeVideoEngine", "J");
311a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jlong j_p = jni->GetLongField(j_vie, native_vie_id);
312a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return reinterpret_cast<VideoEngineData*>(j_p);
313a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
314a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
315a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}  // namespace
316a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
317a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgnamespace webrtc_examples {
318a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
319a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgstatic const char* g_classes[] = {
320a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  "org/webrtc/webrtcdemo/CameraDesc",
321a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  "org/webrtc/webrtcdemo/RtcpStatistics",
322a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  "org/webrtc/webrtcdemo/VideoCodecInst",
323a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  "org/webrtc/webrtcdemo/VideoDecodeEncodeObserver",
324a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  "org/webrtc/webrtcdemo/MediaCodecVideoDecoder"};
325a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
326a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgvoid SetVieDeviceObjects(JavaVM* vm) {
327a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(vm, "Trying to register NULL vm");
328a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(!g_vm, "Trying to re-register vm");
329a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  g_vm = vm;
330a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::AttachThreadScoped ats(g_vm);
331a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  JNIEnv* jni = ats.env();
332a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  g_class_reference_holder = new ClassReferenceHolder(
333a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni, g_classes, ARRAYSIZE(g_classes));
334a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
335a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
336a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgvoid ClearVieDeviceObjects() {
337a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(g_vm, "Clearing vm without it being set");
338a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  {
339a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    webrtc::AttachThreadScoped ats(g_vm);
340a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    g_class_reference_holder->FreeReferences(ats.env());
341a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
342a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  g_vm = NULL;
343a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  delete g_class_reference_holder;
344a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  g_class_reference_holder = NULL;
345a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
346a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
347a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}  // namespace webrtc_examples
348a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
349a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jlong, VideoEngine_create)(JNIEnv* jni, jclass) {
350a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = new VideoEngineData();
351a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return jlongFromPointer(vie_data);
352a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
353a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
354a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_init)(JNIEnv* jni, jobject j_vie) {
355a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
356a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->Init();
357a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
358a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
359a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setVoiceEngine)(JNIEnv* jni, jobject j_vie,
360a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                       jobject j_voe) {
361a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
362a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::VoiceEngine* voe = GetVoiceEngine(jni, j_voe);
363a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->SetVoiceEngine(voe);
364a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
365a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
366a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoEngine_dispose)(JNIEnv* jni, jobject j_vie) {
367a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
368a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  delete vie_data;
369a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
370a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
371a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_startSend)(JNIEnv* jni, jobject j_vie, jint channel) {
372a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
373a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->StartSend(channel);
374a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
375a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
376a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_stopRender)(JNIEnv* jni, jobject j_vie, jint channel) {
377a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
378a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->render->StopRender(channel);
379a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
380a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
381a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_stopSend)(JNIEnv* jni, jobject j_vie, jint channel) {
382a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
383a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->StopSend(channel);
384a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
385a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
386a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_startReceive)(JNIEnv* jni, jobject j_vie, jint channel) {
387a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
388a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->StartReceive(channel);
389a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
390a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
391a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_stopReceive)(JNIEnv* jni, jobject j_vie, jint channel) {
392a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
393a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->StopReceive(channel);
394a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
395a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
396a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_createChannel)(JNIEnv* jni, jobject j_vie) {
397a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
398a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->CreateChannel();
399a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
400a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
401a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_deleteChannel)(JNIEnv* jni, jobject j_vie,
402a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                      jint channel) {
403a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
404a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->DeleteChannel(channel);
405a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
406a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
407a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint,
408a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org     VideoEngine_connectAudioChannel(JNIEnv* jni, jobject j_vie,
409a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jint video_channel, jint audio_channel)) {
410a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
411a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->base->ConnectAudioChannel(video_channel, audio_channel);
412a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
413a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
414a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setLocalReceiver)(JNIEnv* jni, jobject j_vie,
415a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                         jint channel, jint port) {
416a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
417a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->GetTransport(channel)->SetLocalReceiver(port);
418a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
419a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
420a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setSendDestination)(JNIEnv* jni, jobject j_vie,
421a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                           jint channel, jint port,
422a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                           jstring j_addr) {
423a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
424a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  std::string addr = JavaToStdString(jni, j_addr);
425a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::test::VideoChannelTransport* transport =
426a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      vie_data->GetTransport(channel);
427a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return transport->SetSendDestination(addr.c_str(), port);
428a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
429a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
430a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setReceiveCodec)(JNIEnv* jni, jobject j_vie,
431a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                        jint channel, jobject j_codec) {
432a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
433a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::VideoCodec* codec = GetCodecInst(jni, j_codec);
434a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->codec->SetReceiveCodec(channel, *codec);
435a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
436a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
437a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setSendCodec)(JNIEnv* jni, jobject j_vie, jint channel,
438a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jobject j_codec) {
439a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
440a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::VideoCodec* codec = GetCodecInst(jni, j_codec);
441a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->codec->SetSendCodec(channel, *codec);
442a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
443a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
444a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_numberOfCodecs)(JNIEnv* jni, jobject j_vie) {
445a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
446a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->codec->NumberOfCodecs();
447a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
448a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
449a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jobject, VideoEngine_getCodec)(JNIEnv* jni, jobject j_vie, jint index) {
450a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
451a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::VideoCodec* codec = new webrtc::VideoCodec();
452a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK(vie_data->codec->GetCodec(index, *codec) == 0,
453a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org        "getCodec must be called with valid index");
454a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_codec_class = GetClass("org/webrtc/webrtcdemo/VideoCodecInst");
455a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID j_codec_ctor = GetMethodID(jni, j_codec_class, "<init>", "(J)V");
456a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jobject j_codec =
457a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni->NewObject(j_codec_class, j_codec_ctor, jlongFromPointer(codec));
458a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK_EXCEPTION(jni, "error during NewObject");
459a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return j_codec;
460a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
461a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
462a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_addRenderer)(JNIEnv* jni, jobject j_vie, jint channel,
463a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jobject gl_surface, jint z_order,
464a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jfloat left, jfloat top, jfloat right,
465a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jfloat bottom) {
466a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
467a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->render->AddRenderer(channel, gl_surface, z_order, left, top,
468a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                       right, bottom);
469a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
470a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
471a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_removeRenderer)(JNIEnv* jni, jobject j_vie,
472a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                       jint channel) {
473a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
474a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->render->RemoveRenderer(channel);
475a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
476a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
477a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_registerExternalReceiveCodec)(JNIEnv* jni, jobject j_vie,
478a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                     jint channel, jint pl_type,
479a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                     jobject decoder,
480a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                     bool internal_source) {
481a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
482a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->RegisterExternalReceiveCodec(channel, pl_type, decoder,
483a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                true);
484a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
485a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
486a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint,
487a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org     VideoEngine_deRegisterExternalReceiveCodec)(JNIEnv* jni, jobject j_vie,
488a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                 jint channel, jint pl_type) {
489a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
490a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->DeRegisterExternalReceiveCodec(channel, pl_type);
491a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
492a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
493a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_startRender)(JNIEnv* jni, jobject j_vie, jint channel) {
494a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
495a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->render->StartRender(channel);
496a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
497a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
498a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_numberOfCaptureDevices)(JNIEnv* jni, jobject j_vie) {
499a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
500a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->NumberOfCaptureDevices();
501a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
502a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
503a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jobject,
504a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org     VideoEngine_getCaptureDevice(JNIEnv* jni, jobject j_vie, jint index)) {
505a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
506a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CameraDesc* camera_info = new CameraDesc();
507a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  if (vie_data->capture->GetCaptureDevice(
508a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          index, camera_info->name, sizeof(camera_info->name),
509a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org          camera_info->unique_id, sizeof(camera_info->unique_id)) != 0) {
510a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    delete camera_info;
511a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return NULL;
512a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
513a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_camera_class = GetClass("org/webrtc/webrtcdemo/CameraDesc");
514a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID j_camera_ctor = GetMethodID(jni, j_camera_class, "<init>", "(J)V");
515a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jobject j_camera = jni->NewObject(j_camera_class, j_camera_ctor,
516a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jlongFromPointer(camera_info));
517a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK_EXCEPTION(jni, "error during NewObject");
518a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return j_camera;
519a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
520a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
521a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_allocateCaptureDevice)(JNIEnv* jni, jobject j_vie,
522a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                              jobject j_camera) {
523a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
524a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CameraDesc* camera_info = GetCameraDesc(jni, j_camera);
525a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jint capture_id;
526a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  if (vie_data->capture->AllocateCaptureDevice(camera_info->unique_id,
527a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                               sizeof(camera_info->unique_id),
528a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                               capture_id) != 0) {
529a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return -1;
530a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
531a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return capture_id;
532a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
533a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
534a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_connectCaptureDevice)(JNIEnv* jni, jobject j_vie,
535a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                             jint camera_num, jint channel) {
536a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
537a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->ConnectCaptureDevice(camera_num, channel);
538a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
539a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
540a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_startCapture)(JNIEnv* jni, jobject j_vie,
541a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jint camera_num) {
542a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
543a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->StartCapture(camera_num);
544a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
545a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
546a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_stopCapture)(JNIEnv* jni, jobject j_vie,
547a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jint camera_id) {
548a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
549a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->StopCapture(camera_id);
550a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
551a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
552a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_releaseCaptureDevice)(JNIEnv* jni, jobject j_vie,
553a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                             jint camera_id) {
554a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
555a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->ReleaseCaptureDevice(camera_id);
556a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
557a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
558a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_getOrientation)(JNIEnv* jni, jobject j_vie,
559a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                       jobject j_camera) {
560a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
561a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CameraDesc* camera_info = GetCameraDesc(jni, j_camera);
562a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  webrtc::RotateCapturedFrame orientation;
563a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  if (vie_data->capture->GetOrientation(camera_info->unique_id, orientation) !=
564a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      0) {
565a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return -1;
566a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
567a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return static_cast<jint>(orientation);
568a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
569a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
570a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setRotateCapturedFrames)(JNIEnv* jni, jobject j_vie,
571a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                jint capture_id, jint degrees) {
572a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
573a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->capture->SetRotateCapturedFrames(
574a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      capture_id, static_cast<webrtc::RotateCapturedFrame>(degrees));
575a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
576a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
577a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setNackStatus)(JNIEnv* jni, jobject j_vie, jint channel,
578a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                      jboolean enable) {
579a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
580a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->rtp->SetNACKStatus(channel, enable);
581a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
582a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
583a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setKeyFrameRequestMethod)(JNIEnv* jni, jobject j_vie,
584a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                 jint channel,
585a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                 jint request_method) {
586a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
587a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->rtp->SetKeyFrameRequestMethod(
588a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      channel, static_cast<webrtc::ViEKeyFrameRequestMethod>(request_method));
589a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
590a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
591a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jobject, VideoEngine_getReceivedRtcpStatistics)(JNIEnv* jni, jobject j_vie,
592a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                                     jint channel) {
593a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  unsigned short fraction_lost;  // NOLINT
594a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  unsigned int cumulative_lost;  // NOLINT
595a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  unsigned int extended_max;     // NOLINT
596a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  unsigned int jitter;           // NOLINT
597a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  int rtt_ms;
598a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
599a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  if (vie_data->rtp->GetReceivedRTCPStatistics(channel, fraction_lost,
600a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                               cumulative_lost, extended_max,
601a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                               jitter, rtt_ms) != 0) {
602a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org    return NULL;
603a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  }
604a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jclass j_rtcp_statistics_class =
605a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      GetClass("org/webrtc/webrtcdemo/RtcpStatistics");
606a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jmethodID j_rtcp_statistics_ctor =
607a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      GetMethodID(jni, j_rtcp_statistics_class, "<init>", "(IIIII)V");
608a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  jobject j_rtcp_statistics =
609a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      jni->NewObject(j_rtcp_statistics_class, j_rtcp_statistics_ctor,
610a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                     fraction_lost, cumulative_lost, extended_max, jitter,
611a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                     rtt_ms);
612a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  CHECK_EXCEPTION(jni, "error during NewObject");
613a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return j_rtcp_statistics;
614a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
615a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
616a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_registerObserver)(JNIEnv* jni, jobject j_vie,
617a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                         jint channel, jobject callback) {
618a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
619a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->RegisterObserver(channel, callback);
620a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
621a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
622a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_deregisterObserver)(JNIEnv* jni, jobject j_vie,
623a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                           jint channel) {
624a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
625a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->DeregisterObserver(channel);
626a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
627a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
628a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_setTraceFile)(JNIEnv* jni, jobject, jstring j_filename,
629a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jboolean file_counter) {
630a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  std::string filename = JavaToStdString(jni, j_filename);
631a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return webrtc::VideoEngine::SetTraceFile(filename.c_str(), file_counter);
632a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
633a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
634c9d06348141937ae7dc655b2564fa41580edbc75braveyao@webrtc.orgJOWW(jint, VideoEngine_nativeSetTraceFilter)(JNIEnv* jni, jobject,
635c9d06348141937ae7dc655b2564fa41580edbc75braveyao@webrtc.org                                             jint filter) {
636a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return webrtc::VideoEngine::SetTraceFilter(filter);
637a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
638a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
639a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_startRtpDump)(JNIEnv* jni, jobject j_vie, jint channel,
640a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jstring j_filename, jint direction) {
641a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
642a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  std::string filename = JavaToStdString(jni, j_filename);
643a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->rtp->StartRTPDump(
644a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      channel, filename.c_str(), static_cast<webrtc::RTPDirections>(direction));
645a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
646a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
647a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoEngine_stopRtpDump)(JNIEnv* jni, jobject j_vie, jint channel,
648a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                    jint direction) {
649a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
650a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return vie_data->rtp->StopRTPDump(
651a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org      channel, static_cast<webrtc::RTPDirections>(direction));
652a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
653a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
654a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_dispose)(JNIEnv* jni, jobject j_codec) {
655a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  delete GetCodecInst(jni, j_codec);
656a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
657a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
658a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_plType)(JNIEnv* jni, jobject j_codec) {
659a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->plType;
660a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
661a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
662a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jstring, VideoCodecInst_name)(JNIEnv* jni, jobject j_codec) {
663a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return jni->NewStringUTF(GetCodecInst(jni, j_codec)->plName);
664a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
665a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
666a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_width)(JNIEnv* jni, jobject j_codec) {
667a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->width;
668a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
669a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
670a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_setWidth)(JNIEnv* jni, jobject j_codec, jint width) {
671a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  GetCodecInst(jni, j_codec)->width = width;
672a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
673a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
674a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_height)(JNIEnv* jni, jobject j_codec) {
675a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->height;
676a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
677a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
678a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_setHeight)(JNIEnv* jni, jobject j_codec,
679a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                     jint height) {
680a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  GetCodecInst(jni, j_codec)->height = height;
681a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
682a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
683a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_startBitRate)(JNIEnv* jni, jobject j_codec) {
684a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->startBitrate;
685a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
686a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
687a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_setStartBitRate)(JNIEnv* jni, jobject j_codec,
688a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                           jint bitrate) {
689a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  GetCodecInst(jni, j_codec)->startBitrate = bitrate;
690a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
691a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
692a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_maxBitRate)(JNIEnv* jni, jobject j_codec) {
693a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->maxBitrate;
694a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
695a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
696a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_setMaxBitRate)(JNIEnv* jni, jobject j_codec,
697a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                         jint bitrate) {
698a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  GetCodecInst(jni, j_codec)->maxBitrate = bitrate;
699a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
700a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
701a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(jint, VideoCodecInst_maxFrameRate)(JNIEnv* jni, jobject j_codec) {
702a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  return GetCodecInst(jni, j_codec)->maxFramerate;
703a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
704a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
705a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, VideoCodecInst_setMaxFrameRate)(JNIEnv* jni, jobject j_codec,
706a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org                                           jint framerate) {
707a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  GetCodecInst(jni, j_codec)->maxFramerate = framerate;
708a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
709a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org
710a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgJOWW(void, CameraDesc_dispose)(JNIEnv* jni, jobject j_camera) {
711a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org  delete GetCameraDesc(jni, j_camera);
712a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}
713