Move default-recv-channels to a separate class.
BUG=1788,3099
R=pthatcher@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/20119004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@6879 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/media/webrtc/webrtcvideoengine2.cc b/media/webrtc/webrtcvideoengine2.cc
index 2cd2229..1edb175 100644
--- a/media/webrtc/webrtcvideoengine2.cc
+++ b/media/webrtc/webrtcvideoengine2.cc
@@ -249,6 +249,42 @@
return _stricmp(codec.name.c_str(), kVp8CodecName) == 0;
}
+DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler()
+ : default_recv_ssrc_(0), default_renderer_(NULL) {}
+
+UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
+ VideoMediaChannel* channel,
+ uint32_t ssrc) {
+ if (default_recv_ssrc_ != 0) { // Already one default stream.
+ LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set.";
+ return kDropPacket;
+ }
+
+ StreamParams sp;
+ sp.ssrcs.push_back(ssrc);
+ LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
+ if (!channel->AddRecvStream(sp)) {
+ LOG(LS_WARNING) << "Could not create default receive stream.";
+ }
+
+ channel->SetRenderer(ssrc, default_renderer_);
+ default_recv_ssrc_ = ssrc;
+ return kDeliverPacket;
+}
+
+VideoRenderer* DefaultUnsignalledSsrcHandler::GetDefaultRenderer() const {
+ return default_renderer_;
+}
+
+void DefaultUnsignalledSsrcHandler::SetDefaultRenderer(
+ VideoMediaChannel* channel,
+ VideoRenderer* renderer) {
+ default_renderer_ = renderer;
+ if (default_recv_ssrc_ != 0) {
+ channel->SetRenderer(default_recv_ssrc_, default_renderer_);
+ }
+}
+
WebRtcVideoEngine2::WebRtcVideoEngine2() {
// Construct without a factory or voice engine.
Construct(NULL, NULL, new rtc::CpuMonitor(NULL));
@@ -641,7 +677,8 @@
WebRtcVideoEngine2* engine,
VoiceMediaChannel* voice_channel,
WebRtcVideoEncoderFactory2* encoder_factory)
- : encoder_factory_(encoder_factory) {
+ : encoder_factory_(encoder_factory),
+ unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_) {
// TODO(pbos): Connect the video and audio with |voice_channel|.
webrtc::Call::Config config(this);
Construct(webrtc::Call::Create(config), engine);
@@ -651,7 +688,8 @@
webrtc::Call* call,
WebRtcVideoEngine2* engine,
WebRtcVideoEncoderFactory2* encoder_factory)
- : encoder_factory_(encoder_factory) {
+ : encoder_factory_(encoder_factory),
+ unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_) {
Construct(call, engine);
}
@@ -660,9 +698,7 @@
rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
sending_ = false;
call_.reset(call);
- default_renderer_ = NULL;
default_send_ssrc_ = 0;
- default_recv_ssrc_ = 0;
SetDefaultOptions();
}
@@ -928,9 +964,6 @@
uint32 ssrc = sp.first_ssrc();
assert(ssrc != 0); // TODO(pbos): Is this ever valid?
- if (default_recv_ssrc_ == 0) {
- default_recv_ssrc_ = ssrc;
- }
// TODO(pbos): Check if any of the SSRCs overlap.
if (receive_streams_.find(ssrc) != receive_streams_.end()) {
@@ -987,7 +1020,8 @@
bool WebRtcVideoChannel2::RemoveRecvStream(uint32 ssrc) {
LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
if (ssrc == 0) {
- ssrc = default_recv_ssrc_;
+ LOG(LS_ERROR) << "RemoveRecvStream with 0 ssrc is not supported.";
+ return false;
}
std::map<uint32, WebRtcVideoReceiveStream*>::iterator stream =
@@ -999,10 +1033,6 @@
delete stream->second;
receive_streams_.erase(stream);
- if (ssrc == default_recv_ssrc_) {
- default_recv_ssrc_ = 0;
- }
-
return true;
}
@@ -1010,11 +1040,7 @@
LOG(LS_INFO) << "SetRenderer: ssrc:" << ssrc << " "
<< (renderer ? "(ptr)" : "NULL");
if (ssrc == 0) {
- if (default_recv_ssrc_!= 0) {
- receive_streams_[default_recv_ssrc_]->SetRenderer(renderer);
- }
- ssrc = default_recv_ssrc_;
- default_renderer_ = renderer;
+ default_unsignalled_ssrc_handler_.SetDefaultRenderer(this, renderer);
return true;
}
@@ -1030,11 +1056,8 @@
bool WebRtcVideoChannel2::GetRenderer(uint32 ssrc, VideoRenderer** renderer) {
if (ssrc == 0) {
- if (default_renderer_ == NULL) {
- return false;
- }
- *renderer = default_renderer_;
- return true;
+ *renderer = default_unsignalled_ssrc_handler_.GetDefaultRenderer();
+ return *renderer != NULL;
}
std::map<uint32, WebRtcVideoReceiveStream*>::iterator it =
@@ -1117,26 +1140,23 @@
}
uint32 ssrc = 0;
- if (default_recv_ssrc_ != 0) { // Already one default stream.
- LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set.";
- return;
- }
-
if (!GetRtpSsrc(packet->data(), packet->length(), &ssrc)) {
return;
}
- StreamParams sp;
- sp.ssrcs.push_back(ssrc);
- LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
- AddRecvStream(sp);
- SetRenderer(0, default_renderer_);
+ // TODO(pbos): Make sure that the unsignalled SSRC uses the video payload.
+ // Also figure out whether RTX needs to be handled.
+ switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) {
+ case UnsignalledSsrcHandler::kDropPacket:
+ return;
+ case UnsignalledSsrcHandler::kDeliverPacket:
+ break;
+ }
if (call_->Receiver()->DeliverPacket(
reinterpret_cast<const uint8_t*>(packet->data()), packet->length()) !=
webrtc::PacketReceiver::DELIVERY_OK) {
- LOG(LS_WARNING) << "Failed to deliver RTP packet after creating default "
- "receiver.";
+ LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery.";
return;
}
}
diff --git a/media/webrtc/webrtcvideoengine2.h b/media/webrtc/webrtcvideoengine2.h
index a718e9c..94e9c61 100644
--- a/media/webrtc/webrtcvideoengine2.h
+++ b/media/webrtc/webrtcvideoengine2.h
@@ -82,6 +82,31 @@
class WebRtcVideoChannel2;
class WebRtcVideoRenderer;
+class UnsignalledSsrcHandler {
+ public:
+ enum Action {
+ kDropPacket,
+ kDeliverPacket,
+ };
+ virtual Action OnUnsignalledSsrc(VideoMediaChannel* engine,
+ uint32_t ssrc) = 0;
+};
+
+// TODO(pbos): Remove, use external handlers only.
+class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
+ public:
+ DefaultUnsignalledSsrcHandler();
+ virtual Action OnUnsignalledSsrc(VideoMediaChannel* engine,
+ uint32_t ssrc) OVERRIDE;
+
+ VideoRenderer* GetDefaultRenderer() const;
+ void SetDefaultRenderer(VideoMediaChannel* channel, VideoRenderer* renderer);
+
+ private:
+ uint32_t default_recv_ssrc_;
+ VideoRenderer* default_renderer_;
+};
+
class WebRtcVideoEncoderFactory2 {
public:
virtual ~WebRtcVideoEncoderFactory2();
@@ -386,8 +411,9 @@
bool sending_;
rtc::scoped_ptr<webrtc::Call> call_;
uint32_t default_send_ssrc_;
- uint32_t default_recv_ssrc_;
- VideoRenderer* default_renderer_;
+
+ DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
+ UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
// Using primary-ssrc (first ssrc) as key.
std::map<uint32, WebRtcVideoSendStream*> send_streams_;