Enabling and testing RTCP CNAME in new API.
BUG=2232
R=holmer@google.com, stefan@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/2076004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@4592 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video_engine/internal/video_send_stream.cc b/webrtc/video_engine/internal/video_send_stream.cc
index da72877..5001cc7 100644
--- a/webrtc/video_engine/internal/video_send_stream.cc
+++ b/webrtc/video_engine/internal/video_send_stream.cc
@@ -10,6 +10,8 @@
#include "webrtc/video_engine/internal/video_send_stream.h"
+#include <string.h>
+
#include <vector>
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
@@ -105,6 +107,13 @@
rtp_rtcp_->SetTransmissionSmoothingStatus(channel_, config_.pacing);
rtp_rtcp_->SetSendTimestampOffsetStatus(channel_, true, 1);
+ char rtcp_cname[ViERTP_RTCP::KMaxRTCPCNameLength];
+ assert(config_.rtp.c_name.length() < ViERTP_RTCP::KMaxRTCPCNameLength);
+ strncpy(rtcp_cname, config_.rtp.c_name.c_str(), sizeof(rtcp_cname) - 1);
+ rtcp_cname[sizeof(rtcp_cname) - 1] = '\0';
+
+ rtp_rtcp_->SetRTCPCName(channel_, rtcp_cname);
+
capture_ = ViECapture::GetInterface(video_engine);
capture_->AllocateExternalCaptureDevice(capture_id_, external_capture_);
capture_->ConnectCaptureDevice(capture_id_, channel_);
diff --git a/webrtc/video_engine/test/send_stream_tests.cc b/webrtc/video_engine/test/send_stream_tests.cc
index 611e71f..789bd21 100644
--- a/webrtc/video_engine/test/send_stream_tests.cc
+++ b/webrtc/video_engine/test/send_stream_tests.cc
@@ -9,6 +9,7 @@
*/
#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
+#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
#include "webrtc/system_wrappers/interface/event_wrapper.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/video_engine/test/common/frame_generator.h"
@@ -19,7 +20,6 @@
namespace webrtc {
-class VideoSendStreamTest : public ::testing::Test {};
class SendTransportObserver : public test::NullTransport {
public:
explicit SendTransportObserver(unsigned long timeout_ms)
@@ -39,8 +39,32 @@
unsigned long timeout_ms_;
};
+class VideoSendStreamTest : public ::testing::Test {
+ protected:
+ static const uint32_t kSendSsrc;
+ void RunSendTest(newapi::VideoCall* call,
+ const newapi::VideoSendStream::Config& config,
+ SendTransportObserver* observer) {
+ newapi::VideoSendStream* send_stream = call->CreateSendStream(config);
+ scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer(
+ test::FrameGeneratorCapturer::Create(
+ send_stream->Input(),
+ test::FrameGenerator::Create(320, 240, Clock::GetRealTimeClock()),
+ 30));
+ send_stream->StartSend();
+ frame_generator_capturer->Start();
+
+ EXPECT_EQ(kEventSignaled, observer->Wait());
+
+ frame_generator_capturer->Stop();
+ send_stream->StopSend();
+ call->DestroySendStream(send_stream);
+ }
+};
+
+const uint32_t VideoSendStreamTest::kSendSsrc = 0xC0FFEE;
+
TEST_F(VideoSendStreamTest, SendsSetSsrc) {
- static const uint32_t kSendSsrc = 0xC0FFEE;
class SendSsrcObserver : public SendTransportObserver {
public:
SendSsrcObserver() : SendTransportObserver(30 * 1000) {}
@@ -62,20 +86,42 @@
newapi::VideoSendStream::Config send_config = call->GetDefaultSendConfig();
send_config.rtp.ssrcs.push_back(kSendSsrc);
- newapi::VideoSendStream* send_stream = call->CreateSendStream(send_config);
- scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer(
- test::FrameGeneratorCapturer::Create(
- send_stream->Input(),
- test::FrameGenerator::Create(320, 240, Clock::GetRealTimeClock()),
- 30));
- send_stream->StartSend();
- frame_generator_capturer->Start();
- EXPECT_EQ(kEventSignaled, observer.Wait());
+ RunSendTest(call.get(), send_config, &observer);
+}
- frame_generator_capturer->Stop();
- send_stream->StopSend();
- call->DestroySendStream(send_stream);
+TEST_F(VideoSendStreamTest, SupportsCName) {
+ static std::string kCName = "PjQatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
+ class CNameObserver : public SendTransportObserver {
+ public:
+ CNameObserver() : SendTransportObserver(30 * 1000) {}
+
+ virtual bool SendRTCP(const uint8_t* packet, size_t length) OVERRIDE {
+ RTCPUtility::RTCPParserV2 parser(packet, length, true);
+ EXPECT_TRUE(parser.IsValid());
+
+ RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
+ while (packet_type != RTCPUtility::kRtcpNotValidCode) {
+ if (packet_type == RTCPUtility::kRtcpSdesChunkCode) {
+ EXPECT_EQ(parser.Packet().CName.CName, kCName);
+ send_test_complete_->Set();
+ }
+
+ packet_type = parser.Iterate();
+ }
+
+ return true;
+ }
+ } observer;
+
+ newapi::VideoCall::Config call_config(&observer);
+ scoped_ptr<newapi::VideoCall> call(newapi::VideoCall::Create(call_config));
+
+ newapi::VideoSendStream::Config send_config = call->GetDefaultSendConfig();
+ send_config.rtp.ssrcs.push_back(kSendSsrc);
+ send_config.rtp.c_name = kCName;
+
+ RunSendTest(call.get(), send_config, &observer);
}
} // namespace webrtc