PageRenderTime 93ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/webrtc/video_engine/test/android/jni/vie_android_java_api.cc

https://github.com/rillian/webrtc
C++ | 1990 lines | 1415 code | 212 blank | 363 comment | 209 complexity | 2ae26d1b96d812a44d29f3ae0020578a MD5 | raw file
Possible License(s): BSD-3-Clause, CC-BY-SA-3.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <android/log.h>
  13. #include "org_webrtc_videoengineapp_vie_android_java_api.h"
  14. #include "voe_base.h"
  15. #include "voe_codec.h"
  16. #include "voe_file.h"
  17. #include "voe_network.h"
  18. #include "voe_audio_processing.h"
  19. #include "voe_volume_control.h"
  20. #include "voe_hardware.h"
  21. #include "voe_rtp_rtcp.h"
  22. #include "vie_base.h"
  23. #include "vie_codec.h"
  24. #include "vie_capture.h"
  25. #include "vie_external_codec.h"
  26. #include "vie_network.h"
  27. #include "vie_render.h"
  28. #include "vie_rtp_rtcp.h"
  29. #include "common_types.h"
  30. #include "android_media_codec_decoder.h"
  31. #include "webrtc/system_wrappers/interface/scoped_ptr.h"
  32. #include "webrtc/test/channel_transport/include/channel_transport.h"
  33. #define WEBRTC_LOG_TAG "*WEBRTCN*"
  34. #define VALIDATE_BASE_POINTER \
  35. if (!voeData.base) \
  36. { \
  37. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  38. "Base pointer doesn't exist"); \
  39. return -1; \
  40. }
  41. #define VALIDATE_CODEC_POINTER \
  42. if (!voeData.codec) \
  43. { \
  44. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  45. "Codec pointer doesn't exist"); \
  46. return -1; \
  47. }
  48. #define VALIDATE_FILE_POINTER \
  49. if (!voeData.file) \
  50. { \
  51. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  52. "File pointer doesn't exist"); \
  53. return -1; \
  54. }
  55. #define VALIDATE_APM_POINTER \
  56. if (!voeData.codec) \
  57. { \
  58. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  59. "Apm pointer doesn't exist"); \
  60. return -1; \
  61. }
  62. #define VALIDATE_HARDWARE_POINTER \
  63. if (!voeData.hardware) \
  64. { \
  65. __android_log_write( \
  66. ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  67. "Hardware pointer doesn't exist"); \
  68. return -1; \
  69. }
  70. #define VALIDATE_VOLUME_POINTER \
  71. if (!voeData.volume) \
  72. { \
  73. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  74. "Volume pointer doesn't exist"); \
  75. return -1; \
  76. }
  77. #define VALIDATE_RTP_POINTER \
  78. if (!voeData.rtp) \
  79. { \
  80. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  81. "rtp pointer doesn't exist"); \
  82. return -1; \
  83. }
  84. using namespace webrtc;
  85. //Forward declaration.
  86. class VideoCallbackAndroid;
  87. // VoiceEngine data struct
  88. typedef struct
  89. {
  90. // VoiceEngine
  91. VoiceEngine* ve;
  92. // Sub-APIs
  93. VoEBase* base;
  94. VoECodec* codec;
  95. VoEFile* file;
  96. VoENetwork* netw;
  97. VoEAudioProcessing* apm;
  98. VoEVolumeControl* volume;
  99. VoEHardware* hardware;
  100. VoERTP_RTCP* rtp;
  101. JavaVM* jvm;
  102. scoped_ptr<test::VoiceChannelTransport> transport;
  103. } VoiceEngineData;
  104. class AndroidVideoRenderCallback;
  105. // VideoEngine data struct
  106. typedef struct
  107. {
  108. VideoEngine* vie;
  109. ViEBase* base;
  110. ViECodec* codec;
  111. ViENetwork* netw;
  112. ViERTP_RTCP* rtp;
  113. ViERender* render;
  114. ViECapture* capture;
  115. ViEExternalCodec* externalCodec;
  116. VideoCallbackAndroid* callback;
  117. scoped_ptr<test::VideoChannelTransport> transport;
  118. } VideoEngineData;
  119. // Global variables
  120. JavaVM* webrtcGlobalVM;
  121. // Global variables visible in this file
  122. static VoiceEngineData voeData;
  123. static VideoEngineData vieData;
  124. // "Local" functions (i.e. not Java accessible)
  125. #define WEBRTC_TRACE_MAX_MESSAGE_SIZE 1024
  126. static bool VE_GetSubApis();
  127. static bool VE_ReleaseSubApis();
  128. #define CHECK_API_RETURN(ret) \
  129. if (ret!=0) \
  130. { \
  131. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
  132. "Return error %d",ret); \
  133. break; \
  134. }
  135. class VideoCallbackAndroid: public ViEDecoderObserver,
  136. public ViEEncoderObserver
  137. {
  138. // Implements ViEDecoderObserver
  139. virtual void IncomingRate(const int videoChannel,
  140. const unsigned int framerate,
  141. const unsigned int bitrate)
  142. {
  143. // Let's print out the network statistics from this call back as well
  144. unsigned short fraction_lost;
  145. unsigned int dummy;
  146. int intdummy;
  147. _vieData.rtp->GetReceivedRTCPStatistics(videoChannel, fraction_lost,
  148. dummy, dummy, dummy, intdummy);
  149. unsigned short packetLossRate = 0;
  150. if (fraction_lost > 0)
  151. {
  152. // Change from frac to %
  153. packetLossRate = (fraction_lost * 100) >> 8;
  154. }
  155. JNIEnv* threadEnv = NULL;
  156. int ret = webrtcGlobalVM->AttachCurrentThread(&threadEnv, NULL);
  157. // Get the JNI env for this thread
  158. if ((ret < 0) || !threadEnv)
  159. {
  160. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  161. "Could not attach thread to JVM (%d, %p)", ret,
  162. threadEnv);
  163. return;
  164. }
  165. threadEnv->CallIntMethod(_callbackObj, _callbackId, framerate, bitrate,
  166. packetLossRate, _frameRateO, _bitRateO);
  167. webrtcGlobalVM->DetachCurrentThread();
  168. }
  169. ;
  170. virtual void IncomingCodecChanged(const int videoChannel,
  171. const webrtc::VideoCodec& videoCodec)
  172. {
  173. }
  174. ;
  175. virtual void RequestNewKeyFrame(const int videoChannel)
  176. {
  177. }
  178. ;
  179. virtual void OutgoingRate(const int videoChannel,
  180. const unsigned int framerate,
  181. const unsigned int bitrate)
  182. {
  183. _frameRateO = framerate;
  184. _bitRateO = bitrate;
  185. //__android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  186. // "SendRate frameRate %d bitrate %d\n",frameRate,bitrate);
  187. }
  188. ;
  189. public:
  190. VideoEngineData& _vieData;
  191. JNIEnv * _env;
  192. jobject _callbackObj;
  193. jclass _callbackCls;
  194. jmethodID _callbackId;
  195. int _frameRateO, _bitRateO;
  196. VideoCallbackAndroid(VideoEngineData& vieData, JNIEnv * env,
  197. jobject callback) :
  198. _vieData(vieData), _env(env), _callbackObj(callback),
  199. _frameRateO(0), _bitRateO(0) {
  200. _callbackCls = _env->GetObjectClass(_callbackObj);
  201. _callbackId
  202. = _env->GetMethodID(_callbackCls, "updateStats", "(IIIII)I");
  203. if (_callbackId == NULL) {
  204. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  205. "Failed to get jid");
  206. }
  207. _callbackObj = _env->NewGlobalRef(_callbackObj);
  208. }
  209. };
  210. // JNI_OnLoad
  211. jint JNI_OnLoad(JavaVM* vm, void* reserved) {
  212. webrtcGlobalVM = vm;
  213. if (!webrtcGlobalVM)
  214. {
  215. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  216. "JNI_OnLoad did not receive a valid VM pointer");
  217. return -1;
  218. }
  219. // Get JNI
  220. JNIEnv* env;
  221. if (JNI_OK != vm->GetEnv(reinterpret_cast<void**> (&env),
  222. JNI_VERSION_1_4)) {
  223. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  224. "JNI_OnLoad could not get JNI env");
  225. return -1;
  226. }
  227. // Init VoiceEngine data
  228. memset(&voeData, 0, sizeof(voeData));
  229. // Store the JVM
  230. voeData.jvm = vm;
  231. // Init VideoEngineData data
  232. memset(&vieData, 0, sizeof(vieData));
  233. return JNI_VERSION_1_4;
  234. }
  235. /*
  236. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  237. * Method: NativeInit
  238. * Signature: (Landroid/content/Context;)Z
  239. */
  240. JNIEXPORT jboolean JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_NativeInit(
  241. JNIEnv * env,
  242. jobject,
  243. jobject context)
  244. {
  245. return true;
  246. }
  247. /*
  248. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  249. * Method: GetVideoEngine
  250. * Signature: ()I
  251. */
  252. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_GetVideoEngine(
  253. JNIEnv *,
  254. jobject context) {
  255. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "GetVideoEngine");
  256. // Check if already got
  257. if (vieData.vie) {
  258. __android_log_write(ANDROID_LOG_INFO, WEBRTC_LOG_TAG,
  259. "ViE already got");
  260. return 0;
  261. }
  262. VideoEngine::SetAndroidObjects(webrtcGlobalVM, context);
  263. // Create
  264. vieData.vie = VideoEngine::Create();
  265. if (!vieData.vie) {
  266. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, "Get ViE failed");
  267. return -1;
  268. }
  269. vieData.base = ViEBase::GetInterface(vieData.vie);
  270. if (!vieData.base) {
  271. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  272. "Get base sub-API failed");
  273. return -1;
  274. }
  275. vieData.codec = ViECodec::GetInterface(vieData.vie);
  276. if (!vieData.codec) {
  277. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  278. "Get codec sub-API failed");
  279. return -1;
  280. }
  281. vieData.netw = ViENetwork::GetInterface(vieData.vie);
  282. if (!vieData.netw) {
  283. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  284. "Get network sub-API failed");
  285. return -1;
  286. }
  287. vieData.rtp = ViERTP_RTCP::GetInterface(vieData.vie);
  288. if (!vieData.rtp) {
  289. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  290. "Get RTP sub-API failed");
  291. return -1;
  292. }
  293. vieData.render = ViERender::GetInterface(vieData.vie);
  294. if (!vieData.render) {
  295. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  296. "Get Render sub-API failed");
  297. return -1;
  298. }
  299. vieData.capture = ViECapture::GetInterface(vieData.vie);
  300. if (!vieData.capture) {
  301. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  302. "Get Capture sub-API failed");
  303. return -1;
  304. }
  305. vieData.externalCodec = ViEExternalCodec::GetInterface(vieData.vie);
  306. if (!vieData.capture) {
  307. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  308. "Get External Codec sub-API failed");
  309. return -1;
  310. }
  311. return 0;
  312. }
  313. /*
  314. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  315. * Method: Init
  316. * Signature: (Z)I
  317. */
  318. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_Init(
  319. JNIEnv *,
  320. jobject,
  321. jboolean enableTrace)
  322. {
  323. if (vieData.vie) {
  324. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "Init");
  325. int ret = vieData.base->Init();
  326. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  327. "Init return %d", ret);
  328. if (enableTrace)
  329. {
  330. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  331. "SetTraceFile");
  332. if (0 != vieData.vie->SetTraceFile(("/sdcard/trace.txt"), false))
  333. {
  334. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  335. "Video Engine could not enable trace");
  336. }
  337. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  338. "SetTraceFilter");
  339. if (0 != vieData.vie->SetTraceFilter(webrtc::kTraceError))
  340. {
  341. __android_log_write(ANDROID_LOG_WARN, WEBRTC_LOG_TAG,
  342. "Could not set trace filter");
  343. }
  344. }
  345. else
  346. {
  347. if (0 != vieData.vie->SetTraceFilter(webrtc::kTraceNone))
  348. {
  349. __android_log_write(ANDROID_LOG_WARN, WEBRTC_LOG_TAG,
  350. "Could not set trace filter");
  351. }
  352. }
  353. if (voeData.ve) // VoiceEngine is enabled
  354. {
  355. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  356. "SetVoiceEngine");
  357. if (0 != vieData.base->SetVoiceEngine(voeData.ve))
  358. {
  359. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  360. "SetVoiceEngine failed");
  361. }
  362. }
  363. return ret;
  364. }
  365. else
  366. {
  367. return -1;
  368. }
  369. }
  370. /*
  371. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  372. * Method: Terminate
  373. * Signature: ()I
  374. */
  375. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_Terminate(
  376. JNIEnv *,
  377. jobject)
  378. {
  379. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "Terminate");
  380. if (vieData.vie) {
  381. if (!vieData.rtp || vieData.rtp->Release() != 0) {
  382. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  383. "Failed to release RTP sub-API");
  384. }
  385. if (!vieData.netw || vieData.netw->Release() != 0) {
  386. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  387. "Failed to release Network sub-API");
  388. }
  389. if (!vieData.codec || vieData.codec->Release() != 0) {
  390. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  391. "Failed to release Codec sub-API");
  392. }
  393. if (!vieData.render || vieData.render->Release()) {
  394. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  395. "Failed to release Render sub-API");
  396. }
  397. if (!vieData.capture || vieData.capture->Release()) {
  398. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  399. "Failed to release Capture sub-API");
  400. }
  401. if (!vieData.base || vieData.base->Release() != 0) {
  402. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  403. "Failed to release Base sub-API");
  404. }
  405. if (!vieData.externalCodec || vieData.externalCodec->Release()) {
  406. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  407. "Failed to release External Codec sub-API");
  408. }
  409. // Delete Vie
  410. if (!VideoEngine::Delete(vieData.vie)) {
  411. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  412. "Failed to delete ViE ");
  413. return -1;
  414. }
  415. memset(&vieData, 0, sizeof(vieData));
  416. return 0;
  417. }
  418. else {
  419. return -1;
  420. }
  421. }
  422. /*
  423. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  424. * Method: StartSend
  425. * Signature: (I)I
  426. */
  427. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StartSend(
  428. JNIEnv *,
  429. jobject,
  430. jint channel)
  431. {
  432. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartSend");
  433. if (vieData.base) {
  434. int ret = vieData.base->StartSend(channel);
  435. return ret;
  436. }
  437. else {
  438. return -1;
  439. }
  440. }
  441. /*
  442. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  443. * Method: StopRender
  444. * Signature: (I)I
  445. */
  446. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StopRender(
  447. JNIEnv *,
  448. jobject,
  449. jint channel)
  450. {
  451. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StopRender");
  452. if (vieData.render) {
  453. return vieData.render->StopRender(channel);
  454. }
  455. else {
  456. return -1;
  457. }
  458. }
  459. /*
  460. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  461. * Method: StopSend
  462. * Signature: (I)I
  463. */
  464. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StopSend(
  465. JNIEnv *,
  466. jobject,
  467. jint channel)
  468. {
  469. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StopSend");
  470. if (vieData.base) {
  471. return vieData.base->StopSend(channel);
  472. }
  473. else {
  474. return -1;
  475. }
  476. }
  477. /*
  478. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  479. * Method: StartReceive
  480. * Signature: (I)I
  481. */
  482. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StartReceive(
  483. JNIEnv *,
  484. jobject,
  485. jint channel)
  486. {
  487. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartReceive");
  488. if (vieData.base) {
  489. return vieData.base->StartReceive(channel);
  490. }
  491. else {
  492. return -1;
  493. }
  494. }
  495. /*
  496. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  497. * Method: StopReceive
  498. * Signature: (I)I
  499. */
  500. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StopReceive(
  501. JNIEnv *,
  502. jobject,
  503. jint channel)
  504. {
  505. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StopReceive");
  506. if (vieData.base) {
  507. return vieData.base->StopReceive(channel);
  508. }
  509. else {
  510. return -1;
  511. }
  512. }
  513. /*
  514. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  515. * Method: CreateChannel
  516. * Signature: (I)I
  517. */
  518. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_CreateChannel(
  519. JNIEnv *,
  520. jobject,
  521. jint voiceChannel)
  522. {
  523. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "CreateChannel");
  524. if (vieData.vie) {
  525. int channel = 0;
  526. if (vieData.base->CreateChannel(channel) != 0) {
  527. return -1;
  528. }
  529. if (voiceChannel >= 0) {
  530. vieData.base->ConnectAudioChannel(channel, voiceChannel);
  531. }
  532. vieData.transport.reset(new test::VideoChannelTransport(vieData.netw,
  533. channel));
  534. return channel;
  535. }
  536. else {
  537. return -1;
  538. }
  539. }
  540. /*
  541. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  542. * Method: SetLocalReceiver
  543. * Signature: (II)I
  544. */
  545. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetLocalReceiver(
  546. JNIEnv *,
  547. jobject,
  548. jint channel,
  549. jint port)
  550. {
  551. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetLocalReceiver");
  552. if (vieData.transport.get()) {
  553. return vieData.transport->SetLocalReceiver(port);
  554. }
  555. return -1;
  556. }
  557. /*
  558. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  559. * Method: SetSendDestination
  560. * Signature: (IILjava/lang/String)I
  561. */
  562. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetSendDestination(
  563. JNIEnv * env,
  564. jobject,
  565. jint channel,
  566. jint port,
  567. jstring ipaddr)
  568. {
  569. if (NULL == vieData.vie)
  570. return -1;
  571. const char* ip = env->GetStringUTFChars(ipaddr, NULL);
  572. if (!ip) {
  573. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  574. "Could not get UTF string");
  575. return -1;
  576. }
  577. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  578. "SetSendDestination: channel=%d, port=%d, ip=%s\n",
  579. channel, port, ip);
  580. if (vieData.transport.get()) {
  581. return vieData.transport->SetSendDestination(ip, port);
  582. }
  583. return -1;
  584. }
  585. /*
  586. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  587. * Method: SetReceiveCodec
  588. * Signature: (IIIIII)I
  589. */
  590. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetReceiveCodec(
  591. JNIEnv *,
  592. jobject,
  593. jint channel,
  594. jint codecNum,
  595. jint intbitRate,
  596. jint width,
  597. jint height,
  598. jint frameRate)
  599. {
  600. if (NULL == vieData.codec)
  601. return -1;
  602. //Create codec
  603. webrtc::VideoCodec codec;
  604. vieData.codec->GetCodec(codecNum, codec);
  605. __android_log_print(
  606. ANDROID_LOG_DEBUG,
  607. WEBRTC_LOG_TAG,
  608. "SetReceiveCodec %s, pltype=%d, bitRate=%d, maxBitRate=%d,"
  609. " width=%d, height=%d, frameRate=%d \n",
  610. codec.plName, codec.plType, codec.startBitrate,
  611. codec.maxBitrate, codec.width, codec.height,
  612. codec.maxFramerate);
  613. int ret = vieData.codec->SetReceiveCodec(channel, codec);
  614. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  615. "SetReceiveCodec return %d", ret);
  616. return ret;
  617. }
  618. /*
  619. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  620. * Method: SetSendCodec
  621. * Signature: (IIIIII)I
  622. */
  623. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetSendCodec(
  624. JNIEnv *,
  625. jobject,
  626. jint channel,
  627. jint codecNum,
  628. jint intbitRate,
  629. jint width,
  630. jint height,
  631. jint frameRate)
  632. {
  633. if (NULL == vieData.codec)
  634. return -1;
  635. //Create codec
  636. webrtc::VideoCodec codec;
  637. vieData.codec->GetCodec(codecNum, codec);
  638. codec.startBitrate = intbitRate;
  639. codec.maxBitrate = 600;
  640. codec.width = width;
  641. codec.height = height;
  642. codec.maxFramerate = frameRate;
  643. for (int i = 0; i < vieData.codec->NumberOfCodecs(); ++i) {
  644. webrtc::VideoCodec codecToList;
  645. vieData.codec->GetCodec(i, codecToList);
  646. __android_log_print(
  647. ANDROID_LOG_DEBUG,
  648. WEBRTC_LOG_TAG,
  649. "Codec list %s, pltype=%d, bitRate=%d, maxBitRate=%d,"
  650. " width=%d, height=%d, frameRate=%d\n",
  651. codecToList.plName, codecToList.plType,
  652. codecToList.startBitrate, codecToList.maxBitrate,
  653. codecToList.width, codecToList.height,
  654. codecToList.maxFramerate);
  655. }
  656. __android_log_print(
  657. ANDROID_LOG_DEBUG,
  658. WEBRTC_LOG_TAG,
  659. "SetSendCodec %s, pltype=%d, bitRate=%d, maxBitRate=%d, "
  660. "width=%d, height=%d, frameRate=%d\n",
  661. codec.plName, codec.plType, codec.startBitrate,
  662. codec.maxBitrate, codec.width, codec.height,
  663. codec.maxFramerate);
  664. return vieData.codec->SetSendCodec(channel, codec);
  665. }
  666. /*
  667. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  668. * Method: SetSendCodec
  669. * Signature: ()Z
  670. */
  671. JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_GetCodecs(
  672. JNIEnv *env,
  673. jobject)
  674. {
  675. if (NULL == vieData.codec) {
  676. return NULL;
  677. }
  678. jobjectArray ret;
  679. int num = vieData.codec->NumberOfCodecs();
  680. char info[32];
  681. ret = (jobjectArray)env->NewObjectArray(
  682. num,
  683. env->FindClass("java/lang/String"),
  684. env->NewStringUTF(""));
  685. for (int i = 0; i < num; ++i) {
  686. webrtc::VideoCodec codecToList;
  687. vieData.codec->GetCodec(i, codecToList);
  688. sprintf(info, "%s pltype:%d", codecToList.plName, codecToList.plType);
  689. env->SetObjectArrayElement(ret, i, env->NewStringUTF( info ));
  690. __android_log_print(
  691. ANDROID_LOG_DEBUG,
  692. WEBRTC_LOG_TAG,
  693. "Codec[%d] %s, pltype=%d, bitRate=%d, maxBitRate=%d,"
  694. " width=%d, height=%d, frameRate=%d\n",
  695. i, codecToList.plName, codecToList.plType,
  696. codecToList.startBitrate, codecToList.maxBitrate,
  697. codecToList.width, codecToList.height,
  698. codecToList.maxFramerate);
  699. }
  700. return ret;
  701. }
  702. /*
  703. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  704. * Method: AddRemoteRenderer
  705. * Signature: (ILjava/lang/Object;)I
  706. */
  707. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_AddRemoteRenderer(
  708. JNIEnv *,
  709. jobject,
  710. jint channel,
  711. jobject glSurface)
  712. {
  713. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "AddRemoteRenderer");
  714. if (vieData.vie) {
  715. return vieData.render->AddRenderer(channel, glSurface, 0, 0, 0, 1, 1);
  716. }
  717. else {
  718. return -1;
  719. }
  720. }
  721. /*
  722. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  723. * Method: RemoveRemoteRenderer
  724. * Signature: (I)I
  725. */
  726. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_RemoveRemoteRenderer(
  727. JNIEnv *,
  728. jobject,
  729. jint channel)
  730. {
  731. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "RemoveRemoteRenderer");
  732. if (vieData.vie) {
  733. return vieData.render->RemoveRenderer(channel);
  734. }
  735. else {
  736. return -1;
  737. }
  738. return 0;
  739. }
  740. /*
  741. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  742. * Method: StartRender
  743. * Signature: (I)I
  744. */
  745. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StartRender(
  746. JNIEnv *,
  747. jobject,
  748. jint channel)
  749. {
  750. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartRender");
  751. if (vieData.render) {
  752. return vieData.render->StartRender(channel);
  753. }
  754. else {
  755. return -1;
  756. }
  757. }
  758. /*
  759. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  760. * Method: StartCamera
  761. * Signature: (II)I
  762. */
  763. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StartCamera(
  764. JNIEnv * env,
  765. jobject,
  766. jint channel,
  767. jint cameraNum)
  768. {
  769. if (NULL == vieData.vie)
  770. return -1;
  771. int i = 0;
  772. char deviceName[64];
  773. char deviceUniqueName[64];
  774. int re;
  775. do {
  776. re = vieData.capture->GetCaptureDevice(i, deviceName,
  777. sizeof(deviceName),
  778. deviceUniqueName,
  779. sizeof(deviceUniqueName));
  780. __android_log_print(
  781. ANDROID_LOG_DEBUG,
  782. WEBRTC_LOG_TAG,
  783. "GetCaptureDevice ret %d devicenum %d deviceUniqueName %s",
  784. re, i, deviceUniqueName);
  785. i++;
  786. } while (re == 0);
  787. int ret;
  788. int cameraId;
  789. vieData.capture->GetCaptureDevice(cameraNum, deviceName,
  790. sizeof(deviceName), deviceUniqueName,
  791. sizeof(deviceUniqueName));
  792. vieData.capture->AllocateCaptureDevice(deviceUniqueName,
  793. sizeof(deviceUniqueName), cameraId);
  794. if (cameraId >= 0) { //Connect the
  795. ret = vieData.capture->ConnectCaptureDevice(cameraId, channel);
  796. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  797. "ConnectCaptureDevice ret %d ", ret);
  798. ret = vieData.capture->StartCapture(cameraId);
  799. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  800. "StartCapture ret %d ", ret);
  801. }
  802. return cameraId;
  803. }
  804. /*
  805. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  806. * Method: StopCamera
  807. * Signature: (I)I
  808. */
  809. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StopCamera(
  810. JNIEnv *,
  811. jobject,
  812. jint cameraId)
  813. {
  814. if (NULL == vieData.capture)
  815. return -1;
  816. int ret = vieData.capture->StopCapture(cameraId);
  817. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  818. "StopCapture ret %d ", ret);
  819. ret = vieData.capture->ReleaseCaptureDevice(cameraId);
  820. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  821. "ReleaseCaptureDevice ret %d ", ret);
  822. return ret;
  823. }
  824. /*
  825. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  826. * Method: GetCameraOrientation
  827. * Signature: (I)I
  828. */
  829. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_GetCameraOrientation(
  830. JNIEnv *,
  831. jobject,
  832. jint cameraNum)
  833. {
  834. char deviceName[64];
  835. char deviceUniqueName[64];
  836. int ret;
  837. ret = vieData.capture->GetCaptureDevice(cameraNum, deviceName,
  838. sizeof(deviceName),
  839. deviceUniqueName,
  840. sizeof(deviceUniqueName));
  841. if (ret != 0) {
  842. return -1;
  843. }
  844. RotateCapturedFrame orientation;
  845. ret = vieData.capture->GetOrientation(deviceUniqueName, orientation);
  846. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  847. "GetOrientation ret %d orientation %d", ret,
  848. orientation);
  849. return (jint) orientation;
  850. }
  851. /*
  852. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  853. * Method: SetRotation
  854. * Signature: (II)I
  855. */
  856. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetRotation(
  857. JNIEnv *,
  858. jobject,
  859. jint captureId,
  860. jint degrees)
  861. {
  862. if (NULL == vieData.capture)
  863. return -1;
  864. RotateCapturedFrame rotation = RotateCapturedFrame_0;
  865. if (degrees == 90)
  866. rotation = RotateCapturedFrame_90;
  867. else if (degrees == 180)
  868. rotation = RotateCapturedFrame_180;
  869. else if (degrees == 270)
  870. rotation = RotateCapturedFrame_270;
  871. int ret = vieData.capture->SetRotateCapturedFrames(captureId, rotation);
  872. return ret;
  873. }
  874. /*
  875. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  876. * Method: SetExternalMediaCodecDecoderRenderer
  877. * Signature: (ILjava/lang/Object;)I
  878. */
  879. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetExternalMediaCodecDecoderRenderer(
  880. JNIEnv *env,
  881. jobject,
  882. jint channel,
  883. jobject glSurface)
  884. {
  885. __android_log_write(
  886. ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetExternalMediaCodecDecoder");
  887. jclass cls = env->FindClass("org/webrtc/videoengine/ViEMediaCodecDecoder");
  888. env->NewGlobalRef(cls);
  889. AndroidMediaCodecDecoder* mediaCodecDecoder =
  890. new AndroidMediaCodecDecoder(webrtcGlobalVM, glSurface, cls);
  891. // TODO(dwkang): Check the ownership of decoder object and release it
  892. // if needed.
  893. return vieData.externalCodec->RegisterExternalReceiveCodec(
  894. channel, 120, mediaCodecDecoder, true);
  895. }
  896. /*
  897. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  898. * Method: EnableNACK
  899. * Signature: (IZ)I
  900. */
  901. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_EnableNACK(
  902. JNIEnv *,
  903. jobject,
  904. jint channel,
  905. jboolean enable)
  906. {
  907. if (NULL == vieData.rtp)
  908. return -1;
  909. int ret = vieData.rtp->SetNACKStatus(channel, enable);
  910. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  911. "EnableNACK(%d) ret:%d", enable, ret);
  912. return ret;
  913. }
  914. /*
  915. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  916. * Method: EnablePLI
  917. * Signature: (IZ)I
  918. */
  919. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_EnablePLI(
  920. JNIEnv *,
  921. jobject,
  922. jint channel,
  923. jboolean enable)
  924. {
  925. if (NULL == vieData.rtp)
  926. return -1;
  927. if (enable)
  928. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  929. "EnablePLI enable");
  930. else
  931. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  932. "EnablePLI disable");
  933. int ret = vieData.rtp->SetKeyFrameRequestMethod(channel,
  934. kViEKeyFrameRequestPliRtcp);
  935. return ret;
  936. }
  937. /*
  938. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  939. * Method: SetCallback
  940. * Signature: (ILorg/webrtc/videoengineapp/IViEAndroidCallback;)I
  941. */
  942. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetCallback(
  943. JNIEnv * env,
  944. jobject,
  945. jint channel,
  946. jobject callback)
  947. {
  948. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetCallback");
  949. if (NULL == vieData.codec)
  950. return -1;
  951. if (vieData.callback == NULL) {
  952. vieData.callback = new VideoCallbackAndroid(vieData, env, callback);
  953. }
  954. else if (vieData.codec) {
  955. vieData.codec->DeregisterDecoderObserver(channel); // Wrong channel?
  956. vieData.codec->DeregisterEncoderObserver(channel);
  957. }
  958. vieData.codec->RegisterDecoderObserver(channel, *vieData.callback);
  959. vieData.codec->RegisterEncoderObserver(channel, *vieData.callback);
  960. return 0;
  961. }
  962. /*
  963. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  964. * Method: StartIncomingRTPDump
  965. * Signature: (ILjava/lang/String;)I
  966. */
  967. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StartIncomingRTPDump(
  968. JNIEnv* env,
  969. jobject,
  970. jint channel,
  971. jstring filename) {
  972. if (NULL == vieData.rtp) {
  973. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  974. "video RTP_RTCP interface is null");
  975. return -1;
  976. }
  977. const char* file = env->GetStringUTFChars(filename, NULL);
  978. if (!file) {
  979. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  980. "Video StartRTPDump file name error");
  981. return -1;
  982. }
  983. if (vieData.rtp->StartRTPDump(channel, file, kRtpIncoming) != 0) {
  984. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  985. "Video StartRTPDump error");
  986. return -1;
  987. }
  988. return 0;
  989. }
  990. /*
  991. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  992. * Method: StopIncomingRTPDump
  993. * Signature: (I)I
  994. */
  995. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_StopIncomingRTPDump(
  996. JNIEnv *,
  997. jobject,
  998. jint channel) {
  999. if (NULL == vieData.rtp) {
  1000. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1001. "video RTP_RTCP interface is null");
  1002. return -1;
  1003. }
  1004. if (vieData.rtp->StopRTPDump(channel, kRtpIncoming) != 0) {
  1005. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1006. "Video StopRTPDump error");
  1007. return -1;
  1008. }
  1009. return 0;
  1010. }
  1011. //
  1012. // VoiceEngine API wrapper functions
  1013. //
  1014. /*
  1015. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1016. * Method: VoE_Create
  1017. * Signature: (Landroid/content/Context)Z
  1018. */
  1019. JNIEXPORT jboolean JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Create(
  1020. JNIEnv *env,
  1021. jobject context,
  1022. jobject ctx) {
  1023. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "Create VoiceEngine");
  1024. VoiceEngine::SetAndroidObjects(webrtcGlobalVM, env, ctx);
  1025. // Check if already created
  1026. if (voeData.ve) {
  1027. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1028. "VoE already created");
  1029. return false;
  1030. }
  1031. // Create
  1032. voeData.ve = VoiceEngine::Create();
  1033. if (!voeData.ve) {
  1034. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1035. "Create VoE failed");
  1036. return false;
  1037. }
  1038. // Get sub-APIs
  1039. if (!VE_GetSubApis()) {
  1040. // If not OK, release all sub-APIs and delete VoE
  1041. VE_ReleaseSubApis();
  1042. if (!VoiceEngine::Delete(voeData.ve)) {
  1043. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1044. "Delete VoE failed");
  1045. }
  1046. return false;
  1047. }
  1048. return true;
  1049. }
  1050. /*
  1051. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1052. * Method: VoE_Delete
  1053. * Signature: ()Z
  1054. */
  1055. JNIEXPORT jboolean JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Delete(
  1056. JNIEnv *,
  1057. jobject)
  1058. {
  1059. // Check if exists
  1060. if (!voeData.ve) {
  1061. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1062. "VoE does not exist");
  1063. return false;
  1064. }
  1065. // Release sub-APIs
  1066. VE_ReleaseSubApis();
  1067. // Delete
  1068. if (!VoiceEngine::Delete(voeData.ve)) {
  1069. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1070. "Delete VoE failed");
  1071. return false;
  1072. }
  1073. voeData.ve = NULL;
  1074. // Clear instance independent Java objects
  1075. VoiceEngine::SetAndroidObjects(NULL, NULL, NULL);
  1076. return true;
  1077. }
  1078. /*
  1079. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1080. * Method: VoE_Init
  1081. * Signature: (Z)I
  1082. */
  1083. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Init(
  1084. JNIEnv *,
  1085. jobject,
  1086. jboolean enableTrace)
  1087. {
  1088. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "VE_Init");
  1089. VALIDATE_BASE_POINTER;
  1090. return voeData.base->Init();
  1091. }
  1092. /*
  1093. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1094. * Method: VoE_Terminate
  1095. * Signature: ()I
  1096. */
  1097. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Terminate(
  1098. JNIEnv *,
  1099. jobject)
  1100. {
  1101. VALIDATE_BASE_POINTER;
  1102. jint retVal = voeData.base->Terminate();
  1103. return retVal;
  1104. }
  1105. /*
  1106. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1107. * Method: VoE_CreateChannel
  1108. * Signature: ()I
  1109. */
  1110. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1CreateChannel(
  1111. JNIEnv *,
  1112. jobject)
  1113. {
  1114. VALIDATE_BASE_POINTER;
  1115. webrtc::CodecInst voiceCodec;
  1116. int numOfVeCodecs = voeData.codec->NumOfCodecs();
  1117. //enum all the supported codec
  1118. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  1119. "Supported Voice Codec:\n");
  1120. for (int i = 0; i < numOfVeCodecs; ++i) {
  1121. if (voeData.codec->GetCodec(i, voiceCodec) != -1) {
  1122. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  1123. "num: %d name: %s\n", i, voiceCodec.plname);
  1124. }
  1125. }
  1126. jint channel = voeData.base->CreateChannel();
  1127. voeData.transport.reset(new test::VoiceChannelTransport(voeData.netw,
  1128. channel));
  1129. return channel;
  1130. }
  1131. /*
  1132. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1133. * Method: VoE_DeleteChannel
  1134. * Signature: (I)I
  1135. */
  1136. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1DeleteChannel(
  1137. JNIEnv *,
  1138. jobject,
  1139. jint channel)
  1140. {
  1141. VALIDATE_BASE_POINTER;
  1142. voeData.transport.reset(NULL);
  1143. return voeData.base->DeleteChannel(channel);
  1144. }
  1145. /*
  1146. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1147. * Method: ViE_DeleteChannel
  1148. * Signature: (I)I
  1149. */
  1150. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_ViE_1DeleteChannel(
  1151. JNIEnv *,
  1152. jobject,
  1153. jint channel)
  1154. {
  1155. VALIDATE_BASE_POINTER;
  1156. vieData.transport.reset(NULL);
  1157. return vieData.base->DeleteChannel(channel);
  1158. }
  1159. /*
  1160. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1161. * Method: VoE_SetLocalReceiver
  1162. * Signature: (II)I
  1163. */
  1164. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetLocalReceiver(
  1165. JNIEnv *,
  1166. jobject,
  1167. jint channel,
  1168. jint port)
  1169. {
  1170. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetLocalReceiver");
  1171. VALIDATE_BASE_POINTER;
  1172. if (voeData.transport.get()) {
  1173. return voeData.transport->SetLocalReceiver(port);
  1174. }
  1175. return -1;
  1176. }
  1177. /*
  1178. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1179. * Method: VoE_SetSendDestination
  1180. * Signature: (IILjava/lang/String;)I
  1181. */
  1182. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetSendDestination(
  1183. JNIEnv *env,
  1184. jobject,
  1185. jint channel,
  1186. jint port,
  1187. jstring ipaddr)
  1188. {
  1189. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetSendDestination");
  1190. VALIDATE_BASE_POINTER;
  1191. const char* ipaddrNative = env->GetStringUTFChars(ipaddr, NULL);
  1192. if (!ipaddrNative) {
  1193. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1194. "Could not get UTF string");
  1195. return -1;
  1196. }
  1197. if (voeData.transport.get()) {
  1198. jint retVal = voeData.transport->SetSendDestination(ipaddrNative, port);
  1199. env->ReleaseStringUTFChars(ipaddr, ipaddrNative);
  1200. return retVal;
  1201. }
  1202. env->ReleaseStringUTFChars(ipaddr, ipaddrNative);
  1203. return -1;
  1204. }
  1205. /*
  1206. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1207. * Method: VoE_StartListen
  1208. * Signature: (I)I
  1209. */
  1210. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartListen(
  1211. JNIEnv *,
  1212. jobject,
  1213. jint channel)
  1214. {
  1215. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartListen");
  1216. VALIDATE_BASE_POINTER;
  1217. return voeData.base->StartReceive(channel);
  1218. }
  1219. /*
  1220. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1221. * Method: VoE_StartPlayout
  1222. * Signature: (I)I
  1223. */
  1224. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartPlayout(
  1225. JNIEnv *,
  1226. jobject,
  1227. jint channel)
  1228. {
  1229. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartPlayout");
  1230. VALIDATE_BASE_POINTER;
  1231. return voeData.base->StartPlayout(channel);
  1232. }
  1233. /*
  1234. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1235. * Method: VoE_StartSend
  1236. * Signature: (I)I
  1237. */
  1238. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartSend(
  1239. JNIEnv *,
  1240. jobject,
  1241. jint channel)
  1242. {
  1243. __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "StartSend");
  1244. VALIDATE_BASE_POINTER;
  1245. return voeData.base->StartSend(channel);
  1246. }
  1247. /*
  1248. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1249. * Method: VoE_StopListen
  1250. * Signature: (I)I
  1251. */
  1252. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StopListen(
  1253. JNIEnv *,
  1254. jobject,
  1255. jint channel)
  1256. {
  1257. VALIDATE_BASE_POINTER;
  1258. return voeData.base->StartReceive(channel);
  1259. }
  1260. /*
  1261. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1262. * Method: VoE_StopPlayout
  1263. * Signature: (I)I
  1264. */
  1265. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StopPlayout(
  1266. JNIEnv *,
  1267. jobject,
  1268. jint channel)
  1269. {
  1270. VALIDATE_BASE_POINTER;
  1271. return voeData.base->StopPlayout(channel);
  1272. }
  1273. /*
  1274. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1275. * Method: VoE_StopSend
  1276. * Signature: (I)I
  1277. */
  1278. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StopSend(
  1279. JNIEnv *,
  1280. jobject,
  1281. jint channel)
  1282. {
  1283. VALIDATE_BASE_POINTER;
  1284. return voeData.base->StopSend(channel);
  1285. }
  1286. /*
  1287. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1288. * Method: VoE_SetSpeakerVolume
  1289. * Signature: (I)I
  1290. */
  1291. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetSpeakerVolume(
  1292. JNIEnv *,
  1293. jobject,
  1294. jint level)
  1295. {
  1296. VALIDATE_VOLUME_POINTER;
  1297. if (voeData.volume->SetSpeakerVolume(level) != 0) {
  1298. return -1;
  1299. }
  1300. return 0;
  1301. }
  1302. /*
  1303. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1304. * Method: VoE_SetLoudspeakerStatus
  1305. * Signature: (Z)I
  1306. */
  1307. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetLoudspeakerStatus(
  1308. JNIEnv *,
  1309. jobject,
  1310. jboolean enable) {
  1311. VALIDATE_HARDWARE_POINTER;
  1312. if (voeData.hardware->SetLoudspeakerStatus(enable) != 0) {
  1313. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1314. "SetLoudspeakerStatus(%d) failed", enable);
  1315. return -1;
  1316. }
  1317. return 0;
  1318. }
  1319. /*
  1320. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1321. * Method: VoE_StartPlayingFileLocally
  1322. * Signature: (ILjava/lang/String;Z)I
  1323. */
  1324. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartPlayingFileLocally(
  1325. JNIEnv * env,
  1326. jobject,
  1327. jint channel,
  1328. jstring fileName,
  1329. jboolean loop)
  1330. {
  1331. VALIDATE_FILE_POINTER;
  1332. const char* fileNameNative = env->GetStringUTFChars(fileName, NULL);
  1333. if (!fileNameNative) {
  1334. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1335. "Could not get UTF string");
  1336. return -1;
  1337. }
  1338. jint retVal = voeData.file->StartPlayingFileLocally(channel,
  1339. fileNameNative,
  1340. loop);
  1341. env->ReleaseStringUTFChars(fileName, fileNameNative);
  1342. return retVal;
  1343. }
  1344. /*
  1345. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1346. * Method: VoE_StopPlayingFileLocally
  1347. * Signature: (I)I
  1348. */
  1349. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StopPlayingFileLocally(
  1350. JNIEnv *,
  1351. jobject,
  1352. jint channel)
  1353. {
  1354. VALIDATE_FILE_POINTER;
  1355. return voeData.file->StopPlayingFileLocally(channel);
  1356. }
  1357. /*
  1358. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1359. * Method: VoE_StartPlayingFileAsMicrophone
  1360. * Signature: (ILjava/lang/String;Z)I
  1361. */
  1362. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartPlayingFileAsMicrophone(
  1363. JNIEnv *env,
  1364. jobject,
  1365. jint channel,
  1366. jstring fileName,
  1367. jboolean loop)
  1368. {
  1369. VALIDATE_FILE_POINTER;
  1370. const char* fileNameNative = env->GetStringUTFChars(fileName, NULL);
  1371. if (!fileNameNative) {
  1372. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1373. "Could not get UTF string");
  1374. return -1;
  1375. }
  1376. jint retVal = voeData.file->StartPlayingFileAsMicrophone(channel,
  1377. fileNameNative,
  1378. loop);
  1379. env->ReleaseStringUTFChars(fileName, fileNameNative);
  1380. return retVal;
  1381. }
  1382. /*
  1383. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1384. * Method: VoE_StopPlayingFileAsMicrophone
  1385. * Signature: (I)I
  1386. */
  1387. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StopPlayingFileAsMicrophone(
  1388. JNIEnv *,
  1389. jobject,
  1390. jint channel)
  1391. {
  1392. VALIDATE_FILE_POINTER;
  1393. return voeData.file->StopPlayingFileAsMicrophone(channel);
  1394. }
  1395. /*
  1396. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1397. * Method: VoE_NumOfCodecs
  1398. * Signature: ()I
  1399. */
  1400. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1NumOfCodecs(
  1401. JNIEnv *,
  1402. jobject)
  1403. {
  1404. VALIDATE_CODEC_POINTER;
  1405. return voeData.codec->NumOfCodecs();
  1406. }
  1407. /*
  1408. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1409. * Method: VoE_NumOfCodecs
  1410. * Signature: ()I
  1411. */
  1412. JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1GetCodecs(
  1413. JNIEnv *env,
  1414. jobject)
  1415. {
  1416. if (!voeData.codec) {
  1417. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1418. "Codec pointer doesn't exist");
  1419. return NULL;
  1420. }
  1421. jobjectArray ret;
  1422. int i;
  1423. int num = voeData.codec->NumOfCodecs();
  1424. char info[256];
  1425. ret = (jobjectArray)env->NewObjectArray(
  1426. num,
  1427. env->FindClass("java/lang/String"),
  1428. env->NewStringUTF(""));
  1429. for(i = 0; i < num; i++) {
  1430. webrtc::CodecInst codecToList;
  1431. voeData.codec->GetCodec(i, codecToList);
  1432. int written = snprintf(info, sizeof(info),
  1433. "%s type:%d freq:%d pac:%d ch:%d rate:%d",
  1434. codecToList.plname, codecToList.pltype,
  1435. codecToList.plfreq, codecToList.pacsize,
  1436. codecToList.channels, codecToList.rate);
  1437. assert(written >= 0 && written < static_cast<int>(sizeof(info)));
  1438. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  1439. "VoiceEgnine Codec[%d] %s", i, info);
  1440. env->SetObjectArrayElement(ret, i, env->NewStringUTF( info ));
  1441. }
  1442. return ret;
  1443. }
  1444. /*
  1445. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1446. * Method: VoE_SetSendCodec
  1447. * Signature: (II)I
  1448. */
  1449. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetSendCodec(
  1450. JNIEnv *,
  1451. jobject,
  1452. jint channel,
  1453. jint index)
  1454. {
  1455. VALIDATE_CODEC_POINTER;
  1456. webrtc::CodecInst codec;
  1457. for (int i = 0; i < voeData.codec->NumOfCodecs(); ++i) {
  1458. webrtc::CodecInst codecToList;
  1459. voeData.codec->GetCodec(i, codecToList);
  1460. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
  1461. "VE Codec list %s, pltype=%d\n",
  1462. codecToList.plname, codecToList.pltype);
  1463. }
  1464. if (voeData.codec->GetCodec(index, codec) != 0) {
  1465. __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1466. "Failed to get codec");
  1467. return -1;
  1468. }
  1469. __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetSendCodec %s\n",
  1470. codec.plname);
  1471. return voeData.codec->SetSendCodec(channel, codec);
  1472. }
  1473. /*
  1474. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1475. * Method: VoE_SetECStatus
  1476. * Signature: (Z)I
  1477. */
  1478. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetECStatus(
  1479. JNIEnv *,
  1480. jobject,
  1481. jboolean enable) {
  1482. VALIDATE_APM_POINTER;
  1483. if (voeData.apm->SetEcStatus(enable, kEcAecm) < 0) {
  1484. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1485. "Failed SetECStatus(%d,%d)", enable, kEcAecm);
  1486. return -1;
  1487. }
  1488. if (voeData.apm->SetAecmMode(kAecmSpeakerphone, false) != 0) {
  1489. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1490. "Failed SetAecmMode(%d,%d)", kAecmSpeakerphone, 0);
  1491. return -1;
  1492. }
  1493. return 0;
  1494. }
  1495. /*
  1496. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1497. * Method: VoE_SetAGCStatus
  1498. * Signature: (Z)I
  1499. */
  1500. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetAGCStatus(
  1501. JNIEnv *,
  1502. jobject,
  1503. jboolean enable) {
  1504. VALIDATE_APM_POINTER;
  1505. if (voeData.apm->SetAgcStatus(enable, kAgcFixedDigital) < 0) {
  1506. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1507. "Failed SetAgcStatus(%d,%d)", enable, kAgcFixedDigital);
  1508. return -1;
  1509. }
  1510. webrtc::AgcConfig config;
  1511. // The following settings are by default, explicitly set here.
  1512. config.targetLeveldBOv = 3;
  1513. config.digitalCompressionGaindB = 9;
  1514. config.limiterEnable = true;
  1515. if (voeData.apm->SetAgcConfig(config) != 0) {
  1516. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1517. "Failed SetAgcConfig(%d,%d,%d)",
  1518. config.targetLeveldBOv,
  1519. config.digitalCompressionGaindB,
  1520. config.limiterEnable);
  1521. return -1;
  1522. }
  1523. return 0;
  1524. }
  1525. /*
  1526. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1527. * Method: VoE_SetNSStatus
  1528. * Signature: (Z)I
  1529. */
  1530. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1SetNSStatus(
  1531. JNIEnv *,
  1532. jobject,
  1533. jboolean enable) {
  1534. VALIDATE_APM_POINTER;
  1535. if (voeData.apm->SetNsStatus(enable, kNsModerateSuppression) < 0) {
  1536. __android_log_print(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
  1537. "Failed SetNsStatus(%d,%d)",
  1538. enable, kNsModerateSuppression);
  1539. return -1;
  1540. }
  1541. return 0;
  1542. }
  1543. /*
  1544. * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
  1545. * Method: VoE_StartDebugRecording
  1546. * Signature: (Ljava/lang/String)I
  1547. */
  1548. JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1StartDebugRecording(
  1549. JNIEnv* env,
  1550. jobject,
  1551. jstring filename) {
  1552. VALIDATE_APM_POINTER;
  1553. const char* file = env->GetStringUTFChars(filename, NULL);
  1554. i

Large files files are truncated, but you can click here to view the full file