From efe4edb6da601b2e1f038ca4938432df3026e5c0 Mon Sep 17 00:00:00 2001 From: "mikhal@webrtc.org" Date: Wed, 6 Mar 2013 23:29:33 +0000 Subject: [PATCH] Enabling bufffering mode with no sync module or VoE BUG= 1454 Review URL: https://webrtc-codereview.appspot.com/1149006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3625 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../auto_test/source/vie_autotest_rtp_rtcp.cc | 30 ++++++++++++------- webrtc/video_engine/vie_channel.cc | 3 +- webrtc/video_engine/vie_sync_module.cc | 9 ++++-- webrtc/video_engine/vie_sync_module.h | 2 +- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/webrtc/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc b/webrtc/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc index e944c0c59f..a95eab3125 100644 --- a/webrtc/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc +++ b/webrtc/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc @@ -686,6 +686,24 @@ void ViEAutoTest::ViERtpRtcpAPITest() tbChannel.videoChannel, false)); // Buffering mode - sender side. + EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( + invalid_channel_id, 0)); + int invalid_delay = -1; + EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( + tbChannel.videoChannel, invalid_delay)); + invalid_delay = 15000; + EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( + tbChannel.videoChannel, invalid_delay)); + EXPECT_EQ(0, ViE.rtp_rtcp->SetSenderBufferingMode( + tbChannel.videoChannel, 5000)); + + // Buffering mode - receiver side. + // Run without VoE to verify it that does not crash, but return an error. + EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode( + tbChannel.videoChannel, 0)); + EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode( + tbChannel.videoChannel, 2000)); + // Set VoE (required to set up stream-sync). webrtc::VoiceEngine* voice_engine = webrtc::VoiceEngine::Create(); EXPECT_TRUE(NULL != voice_engine); @@ -698,17 +716,6 @@ void ViEAutoTest::ViERtpRtcpAPITest() EXPECT_EQ(0, ViE.base->ConnectAudioChannel(tbChannel.videoChannel, audio_channel)); - EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( - invalid_channel_id, 0)); - int invalid_delay = -1; - EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( - tbChannel.videoChannel, invalid_delay)); - invalid_delay = 15000; - EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode( - tbChannel.videoChannel, invalid_delay)); - EXPECT_EQ(0, ViE.rtp_rtcp->SetSenderBufferingMode( - tbChannel.videoChannel, 5000)); - // Buffering mode - receiver side. EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode( invalid_channel_id, 0)); EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode( @@ -718,6 +725,7 @@ void ViEAutoTest::ViERtpRtcpAPITest() tbChannel.videoChannel, invalid_delay)); EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiverBufferingMode( tbChannel.videoChannel, 5000)); + // Real-time mode - sender side. EXPECT_EQ(0, ViE.rtp_rtcp->SetSenderBufferingMode( tbChannel.videoChannel, 0)); diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc index 70d1a373d5..9b505a239f 100644 --- a/webrtc/video_engine/vie_channel.cc +++ b/webrtc/video_engine/vie_channel.cc @@ -799,7 +799,8 @@ int ViEChannel::SetReceiverBufferingMode(int target_delay_ms) { } vcm_.SetNackSettings(max_nack_list_size, max_nack_reordering_threshold_); vcm_.SetMinReceiverDelay(target_delay_ms); - vie_sync_.SetTargetBufferingDelay(target_delay_ms); + if (vie_sync_.SetTargetBufferingDelay(target_delay_ms) < 0) + return -1; return 0; } diff --git a/webrtc/video_engine/vie_sync_module.cc b/webrtc/video_engine/vie_sync_module.cc index e01b0e2719..e973898681 100644 --- a/webrtc/video_engine/vie_sync_module.cc +++ b/webrtc/video_engine/vie_sync_module.cc @@ -172,14 +172,19 @@ WebRtc_Word32 ViESyncModule::Process() { return 0; } -void ViESyncModule::SetTargetBufferingDelay(int target_delay_ms) { +int ViESyncModule::SetTargetBufferingDelay(int target_delay_ms) { CriticalSectionScoped cs(data_cs_.get()); + if (!voe_sync_interface_) { + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideo, vie_channel_->Id(), + "voe_sync_interface_ NULL, can't set playout delay."); + return -1; + } sync_->SetTargetBufferingDelay(target_delay_ms); // Setting initial playout delay to voice engine (video engine is updated via // the VCM interface). - assert(voe_sync_interface_ != NULL); voe_sync_interface_->SetInitialPlayoutDelay(voe_channel_id_, target_delay_ms); + return 0; } } // namespace webrtc diff --git a/webrtc/video_engine/vie_sync_module.h b/webrtc/video_engine/vie_sync_module.h index 8f10c61124..94dae57f2f 100644 --- a/webrtc/video_engine/vie_sync_module.h +++ b/webrtc/video_engine/vie_sync_module.h @@ -41,7 +41,7 @@ class ViESyncModule : public Module { int VoiceChannel(); // Set target delay for buffering mode (0 = real-time mode). - void SetTargetBufferingDelay(int target_delay_ms); + int SetTargetBufferingDelay(int target_delay_ms); // Implements Module. virtual WebRtc_Word32 TimeUntilNextProcess();