Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: webrtc/sdk/android/src/jni/peerconnection_jni.cc

Issue 2854123003: Build WebRTC with data channel only. (Closed)
Patch Set: Add an end to end test for libjingle_peerconnection_datachannel_only. Make it 2.37Mb. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #include "webrtc/base/checks.h" 54 #include "webrtc/base/checks.h"
55 #include "webrtc/base/event_tracer.h" 55 #include "webrtc/base/event_tracer.h"
56 #include "webrtc/base/logging.h" 56 #include "webrtc/base/logging.h"
57 #include "webrtc/base/logsinks.h" 57 #include "webrtc/base/logsinks.h"
58 #include "webrtc/base/messagequeue.h" 58 #include "webrtc/base/messagequeue.h"
59 #include "webrtc/base/networkmonitor.h" 59 #include "webrtc/base/networkmonitor.h"
60 #include "webrtc/base/rtccertificategenerator.h" 60 #include "webrtc/base/rtccertificategenerator.h"
61 #include "webrtc/base/ssladapter.h" 61 #include "webrtc/base/ssladapter.h"
62 #include "webrtc/base/stringutils.h" 62 #include "webrtc/base/stringutils.h"
63 #include "webrtc/media/base/videocapturer.h" 63 #include "webrtc/media/base/videocapturer.h"
64 #include "webrtc/media/engine/webrtcvideodecoderfactory.h" 64
65 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" 65 // Adding 'nogncheck' to disable the gn include header check. We don't want to
66 // depend on audio and video related targets when build the datachannel only
67 // targets.
68 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
69 #include "webrtc/media/engine/webrtcvideodecoderfactory.h" // nogncheck
70 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" // nogncheck
71 #endif
72
66 #include "webrtc/modules/utility/include/jvm_android.h" 73 #include "webrtc/modules/utility/include/jvm_android.h"
67 #include "webrtc/system_wrappers/include/field_trial.h" 74 #include "webrtc/system_wrappers/include/field_trial.h"
68 #include "webrtc/pc/webrtcsdp.h" 75 #include "webrtc/pc/webrtcsdp.h"
69 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" 76
70 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" 77 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
78 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" // nogncheck
79 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" // nogncheck
80 #endif
81
71 #include "webrtc/sdk/android/src/jni/androidnetworkmonitor_jni.h" 82 #include "webrtc/sdk/android/src/jni/androidnetworkmonitor_jni.h"
72 #include "webrtc/sdk/android/src/jni/androidvideotracksource.h" 83
84 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
85 #include "webrtc/sdk/android/src/jni/androidvideotracksource.h" // nogncheck
86 #endif
87
73 #include "webrtc/sdk/android/src/jni/classreferenceholder.h" 88 #include "webrtc/sdk/android/src/jni/classreferenceholder.h"
74 #include "webrtc/sdk/android/src/jni/jni_helpers.h" 89 #include "webrtc/sdk/android/src/jni/jni_helpers.h"
75 #include "webrtc/sdk/android/src/jni/native_handle_impl.h" 90
91 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
92 #include "webrtc/sdk/android/src/jni/native_handle_impl.h" // nogncheck
93 #endif
94
76 #include "webrtc/sdk/android/src/jni/rtcstatscollectorcallbackwrapper.h" 95 #include "webrtc/sdk/android/src/jni/rtcstatscollectorcallbackwrapper.h"
77 // Adding 'nogncheck' to disable the gn include headers check. 96 // Adding 'nogncheck' to disable the gn include headers check.
78 // We don't want to depend on 'system_wrappers:field_trial_default' because 97 // We don't want to depend on 'system_wrappers:field_trial_default' because
79 // clients should be able to provide their own implementation. 98 // clients should be able to provide their own implementation.
80 #include "webrtc/system_wrappers/include/field_trial_default.h" // nogncheck 99 #include "webrtc/system_wrappers/include/field_trial_default.h" // nogncheck
81 #include "webrtc/system_wrappers/include/logcat_trace_context.h" 100 #include "webrtc/system_wrappers/include/logcat_trace_context.h"
82 #include "webrtc/system_wrappers/include/trace.h" 101 #include "webrtc/system_wrappers/include/trace.h"
83 #include "webrtc/voice_engine/include/voe_base.h" 102 #include "webrtc/voice_engine/include/voe_base.h" // nogncheck
84 103
85 using cricket::WebRtcVideoDecoderFactory; 104 using cricket::WebRtcVideoDecoderFactory;
86 using cricket::WebRtcVideoEncoderFactory; 105 using cricket::WebRtcVideoEncoderFactory;
87 using rtc::Bind; 106 using rtc::Bind;
88 using rtc::Thread; 107 using rtc::Thread;
89 using rtc::ThreadManager; 108 using rtc::ThreadManager;
90 using webrtc::AudioSourceInterface; 109 using webrtc::AudioSourceInterface;
91 using webrtc::AudioTrackInterface; 110 using webrtc::AudioTrackInterface;
92 using webrtc::AudioTrackVector; 111 using webrtc::AudioTrackVector;
93 using webrtc::CreateSessionDescriptionObserver; 112 using webrtc::CreateSessionDescriptionObserver;
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 jni()->SetObjectArrayElement(planes, 2, v_buffer); 932 jni()->SetObjectArrayElement(planes, 2, v_buffer);
914 return jni()->NewObject( 933 return jni()->NewObject(
915 *j_frame_class_, j_i420_frame_ctor_id_, 934 *j_frame_class_, j_i420_frame_ctor_id_,
916 frame->width(), frame->height(), 935 frame->width(), frame->height(),
917 static_cast<int>(frame->rotation()), 936 static_cast<int>(frame->rotation()),
918 strides, planes, javaShallowCopy(frame)); 937 strides, planes, javaShallowCopy(frame));
919 } 938 }
920 939
921 // Return a VideoRenderer.I420Frame referring texture object in |frame|. 940 // Return a VideoRenderer.I420Frame referring texture object in |frame|.
922 jobject CricketToJavaTextureFrame(const webrtc::VideoFrame* frame) { 941 jobject CricketToJavaTextureFrame(const webrtc::VideoFrame* frame) {
942 jfloatArray sampling_matrix;
943 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
923 NativeHandleImpl* handle = reinterpret_cast<NativeHandleImpl*>( 944 NativeHandleImpl* handle = reinterpret_cast<NativeHandleImpl*>(
924 frame->video_frame_buffer()->native_handle()); 945 frame->video_frame_buffer()->native_handle());
925 jfloatArray sampling_matrix = handle->sampling_matrix.ToJava(jni()); 946 sampling_matrix = handle->sampling_matrix.ToJava(jni());
926
927 return jni()->NewObject( 947 return jni()->NewObject(
928 *j_frame_class_, j_texture_frame_ctor_id_, 948 *j_frame_class_, j_texture_frame_ctor_id_, frame->width(),
929 frame->width(), frame->height(), 949 frame->height(), static_cast<int>(frame->rotation()),
930 static_cast<int>(frame->rotation()),
931 handle->oes_texture_id, sampling_matrix, javaShallowCopy(frame)); 950 handle->oes_texture_id, sampling_matrix, javaShallowCopy(frame));
951 #else
952 jint texture_id = 0;
953 sampling_matrix = jni()->NewFloatArray(16);
954 return jni()->NewObject(*j_frame_class_, j_texture_frame_ctor_id_,
955 frame->width(), frame->height(),
956 static_cast<int>(frame->rotation()), texture_id,
957 sampling_matrix, javaShallowCopy(frame));
958 #endif
932 } 959 }
933 960
934 JNIEnv* jni() { 961 JNIEnv* jni() {
935 return AttachCurrentThreadIfNeeded(); 962 return AttachCurrentThreadIfNeeded();
936 } 963 }
937 964
938 ScopedGlobalRef<jobject> j_callbacks_; 965 ScopedGlobalRef<jobject> j_callbacks_;
939 jmethodID j_render_frame_id_; 966 jmethodID j_render_frame_id_;
940 ScopedGlobalRef<jclass> j_frame_class_; 967 ScopedGlobalRef<jclass> j_frame_class_;
941 jmethodID j_i420_frame_ctor_id_; 968 jmethodID j_i420_frame_ctor_id_;
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 WebRtcVideoEncoderFactory* encoder_factory = nullptr; 1373 WebRtcVideoEncoderFactory* encoder_factory = nullptr;
1347 WebRtcVideoDecoderFactory* decoder_factory = nullptr; 1374 WebRtcVideoDecoderFactory* decoder_factory = nullptr;
1348 rtc::NetworkMonitorFactory* network_monitor_factory = nullptr; 1375 rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
1349 1376
1350 PeerConnectionFactoryInterface::Options options; 1377 PeerConnectionFactoryInterface::Options options;
1351 bool has_options = joptions != NULL; 1378 bool has_options = joptions != NULL;
1352 if (has_options) { 1379 if (has_options) {
1353 options = ParseOptionsFromJava(jni, joptions); 1380 options = ParseOptionsFromJava(jni, joptions);
1354 } 1381 }
1355 1382
1383 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
1356 if (video_hw_acceleration_enabled) { 1384 if (video_hw_acceleration_enabled) {
1357 encoder_factory = new MediaCodecVideoEncoderFactory(); 1385 encoder_factory = new MediaCodecVideoEncoderFactory();
1358 decoder_factory = new MediaCodecVideoDecoderFactory(); 1386 decoder_factory = new MediaCodecVideoDecoderFactory();
1359 } 1387 }
1388 #endif
1360 // Do not create network_monitor_factory only if the options are 1389 // Do not create network_monitor_factory only if the options are
1361 // provided and disable_network_monitor therein is set to true. 1390 // provided and disable_network_monitor therein is set to true.
1362 if (!(has_options && options.disable_network_monitor)) { 1391 if (!(has_options && options.disable_network_monitor)) {
1363 network_monitor_factory = new AndroidNetworkMonitorFactory(); 1392 network_monitor_factory = new AndroidNetworkMonitorFactory();
1364 rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory); 1393 rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory);
1365 } 1394 }
1366 1395
1367 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 1396 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
1368 webrtc::CreatePeerConnectionFactory( 1397 webrtc::CreatePeerConnectionFactory(
1369 network_thread.get(), worker_thread.get(), signaling_thread.get(), 1398 network_thread.get(), worker_thread.get(), signaling_thread.get(),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 1438 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
1410 factoryFromJava(native_factory)); 1439 factoryFromJava(native_factory));
1411 rtc::scoped_refptr<MediaStreamInterface> stream( 1440 rtc::scoped_refptr<MediaStreamInterface> stream(
1412 factory->CreateLocalMediaStream(JavaToStdString(jni, label))); 1441 factory->CreateLocalMediaStream(JavaToStdString(jni, label)));
1413 return (jlong)stream.release(); 1442 return (jlong)stream.release();
1414 } 1443 }
1415 1444
1416 JOW(jlong, PeerConnectionFactory_nativeCreateVideoSource) 1445 JOW(jlong, PeerConnectionFactory_nativeCreateVideoSource)
1417 (JNIEnv* jni, jclass, jlong native_factory, jobject j_egl_context, 1446 (JNIEnv* jni, jclass, jlong native_factory, jobject j_egl_context,
1418 jboolean is_screencast) { 1447 jboolean is_screencast) {
1448 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
1419 OwnedFactoryAndThreads* factory = 1449 OwnedFactoryAndThreads* factory =
1420 reinterpret_cast<OwnedFactoryAndThreads*>(native_factory); 1450 reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
1421 1451
1422 rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source( 1452 rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source(
1423 new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>( 1453 new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>(
1424 factory->signaling_thread(), jni, j_egl_context, is_screencast)); 1454 factory->signaling_thread(), jni, j_egl_context, is_screencast));
1425 rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source = 1455 rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source =
1426 webrtc::VideoTrackSourceProxy::Create(factory->signaling_thread(), 1456 webrtc::VideoTrackSourceProxy::Create(factory->signaling_thread(),
1427 factory->worker_thread(), source); 1457 factory->worker_thread(), source);
1428 1458
1429 return (jlong)proxy_source.release(); 1459 return (jlong)proxy_source.release();
1460 #else
1461 return (jlong)0;
1462 #endif
1430 } 1463 }
1431 1464
1432 JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer) 1465 JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer)
1433 (JNIEnv* jni, 1466 (JNIEnv* jni,
1434 jclass, 1467 jclass,
1435 jlong native_factory, 1468 jlong native_factory,
1436 jobject j_video_capturer, 1469 jobject j_video_capturer,
1437 jlong native_source, 1470 jlong native_source,
1438 jobject j_frame_observer) { 1471 jobject j_frame_observer) {
1472 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
1439 LOG(LS_INFO) << "PeerConnectionFactory_nativeInitializeVideoCapturer"; 1473 LOG(LS_INFO) << "PeerConnectionFactory_nativeInitializeVideoCapturer";
1440 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 1474 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
1441 factoryFromJava(native_factory)); 1475 factoryFromJava(native_factory));
1442 auto proxy_source = 1476 auto proxy_source =
1443 reinterpret_cast<webrtc::VideoTrackSourceProxy*>(native_source); 1477 reinterpret_cast<webrtc::VideoTrackSourceProxy*>(native_source);
1444 auto source = reinterpret_cast<webrtc::AndroidVideoTrackSource*>( 1478 auto source = reinterpret_cast<webrtc::AndroidVideoTrackSource*>(
1445 proxy_source->internal()); 1479 proxy_source->internal());
1446 rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper = 1480 rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper =
1447 source->surface_texture_helper(); 1481 source->surface_texture_helper();
1448 jni->CallVoidMethod( 1482 jni->CallVoidMethod(
1449 j_video_capturer, 1483 j_video_capturer,
1450 GetMethodID(jni, FindClass(jni, "org/webrtc/VideoCapturer"), "initialize", 1484 GetMethodID(jni, FindClass(jni, "org/webrtc/VideoCapturer"), "initialize",
1451 "(Lorg/webrtc/SurfaceTextureHelper;Landroid/content/" 1485 "(Lorg/webrtc/SurfaceTextureHelper;Landroid/content/"
1452 "Context;Lorg/webrtc/VideoCapturer$CapturerObserver;)V"), 1486 "Context;Lorg/webrtc/VideoCapturer$CapturerObserver;)V"),
1453 surface_texture_helper 1487 surface_texture_helper
1454 ? surface_texture_helper->GetJavaSurfaceTextureHelper() 1488 ? surface_texture_helper->GetJavaSurfaceTextureHelper()
1455 : nullptr, 1489 : nullptr,
1456 j_application_context, j_frame_observer); 1490 j_application_context, j_frame_observer);
1457 CHECK_EXCEPTION(jni) << "error during VideoCapturer.initialize()"; 1491 CHECK_EXCEPTION(jni) << "error during VideoCapturer.initialize()";
1492 #endif
1458 } 1493 }
1459 1494
1460 JOW(jlong, PeerConnectionFactory_nativeCreateVideoTrack)( 1495 JOW(jlong, PeerConnectionFactory_nativeCreateVideoTrack)(
1461 JNIEnv* jni, jclass, jlong native_factory, jstring id, 1496 JNIEnv* jni, jclass, jlong native_factory, jstring id,
1462 jlong native_source) { 1497 jlong native_source) {
1463 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 1498 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
1464 factoryFromJava(native_factory)); 1499 factoryFromJava(native_factory));
1465 rtc::scoped_refptr<VideoTrackInterface> track(factory->CreateVideoTrack( 1500 rtc::scoped_refptr<VideoTrackInterface> track(factory->CreateVideoTrack(
1466 JavaToStdString(jni, id), 1501 JavaToStdString(jni, id),
1467 reinterpret_cast<VideoTrackSourceInterface*>(native_source))); 1502 reinterpret_cast<VideoTrackSourceInterface*>(native_source)));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 rtc::NetworkMonitorFactory::ReleaseFactory( 1557 rtc::NetworkMonitorFactory::ReleaseFactory(
1523 owner->network_monitor_factory()); 1558 owner->network_monitor_factory());
1524 owner->clear_network_monitor_factory(); 1559 owner->clear_network_monitor_factory();
1525 } 1560 }
1526 } 1561 }
1527 } 1562 }
1528 1563
1529 JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)( 1564 JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)(
1530 JNIEnv* jni, jclass, jlong native_factory, jobject local_egl_context, 1565 JNIEnv* jni, jclass, jlong native_factory, jobject local_egl_context,
1531 jobject remote_egl_context) { 1566 jobject remote_egl_context) {
1567 #if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
1532 OwnedFactoryAndThreads* owned_factory = 1568 OwnedFactoryAndThreads* owned_factory =
1533 reinterpret_cast<OwnedFactoryAndThreads*>(native_factory); 1569 reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
1534 1570
1535 jclass j_eglbase14_context_class = 1571 jclass j_eglbase14_context_class =
1536 FindClass(jni, "org/webrtc/EglBase14$Context"); 1572 FindClass(jni, "org/webrtc/EglBase14$Context");
1537 1573
1538 MediaCodecVideoEncoderFactory* encoder_factory = 1574 MediaCodecVideoEncoderFactory* encoder_factory =
1539 static_cast<MediaCodecVideoEncoderFactory*> 1575 static_cast<MediaCodecVideoEncoderFactory*>
1540 (owned_factory->encoder_factory()); 1576 (owned_factory->encoder_factory());
1541 if (encoder_factory && 1577 if (encoder_factory &&
1542 jni->IsInstanceOf(local_egl_context, j_eglbase14_context_class)) { 1578 jni->IsInstanceOf(local_egl_context, j_eglbase14_context_class)) {
1543 LOG(LS_INFO) << "Set EGL context for HW encoding."; 1579 LOG(LS_INFO) << "Set EGL context for HW encoding.";
1544 encoder_factory->SetEGLContext(jni, local_egl_context); 1580 encoder_factory->SetEGLContext(jni, local_egl_context);
1545 } 1581 }
1546 1582
1547 MediaCodecVideoDecoderFactory* decoder_factory = 1583 MediaCodecVideoDecoderFactory* decoder_factory =
1548 static_cast<MediaCodecVideoDecoderFactory*> 1584 static_cast<MediaCodecVideoDecoderFactory*>
1549 (owned_factory->decoder_factory()); 1585 (owned_factory->decoder_factory());
1550 if (decoder_factory) { 1586 if (decoder_factory) {
1551 LOG(LS_INFO) << "Set EGL context for HW decoding."; 1587 LOG(LS_INFO) << "Set EGL context for HW decoding.";
1552 decoder_factory->SetEGLContext(jni, remote_egl_context); 1588 decoder_factory->SetEGLContext(jni, remote_egl_context);
1553 } 1589 }
1590 #endif
1554 } 1591 }
1555 1592
1556 static PeerConnectionInterface::IceTransportsType 1593 static PeerConnectionInterface::IceTransportsType
1557 JavaIceTransportsTypeToNativeType(JNIEnv* jni, jobject j_ice_transports_type) { 1594 JavaIceTransportsTypeToNativeType(JNIEnv* jni, jobject j_ice_transports_type) {
1558 std::string enum_name = GetJavaEnumName( 1595 std::string enum_name = GetJavaEnumName(
1559 jni, "org/webrtc/PeerConnection$IceTransportsType", 1596 jni, "org/webrtc/PeerConnection$IceTransportsType",
1560 j_ice_transports_type); 1597 j_ice_transports_type);
1561 1598
1562 if (enum_name == "ALL") 1599 if (enum_name == "ALL")
1563 return PeerConnectionInterface::kAll; 1600 return PeerConnectionInterface::kAll;
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after
2741 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer) 2778 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
2742 ->inter_tone_gap(); 2779 ->inter_tone_gap();
2743 } 2780 }
2744 2781
2745 JOW(void, DtmfSender_free) 2782 JOW(void, DtmfSender_free)
2746 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) { 2783 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) {
2747 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release(); 2784 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release();
2748 } 2785 }
2749 2786
2750 } // namespace webrtc_jni 2787 } // namespace webrtc_jni
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698