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@6879 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pbos@webrtc.org 2014-08-12 23:17:13 +00:00
parent c891fee7ab
commit afb554f404
2 changed files with 82 additions and 36 deletions

View File

@ -249,6 +249,42 @@ bool WebRtcVideoEncoderFactory2::SupportsCodec(const VideoCodec& codec) {
return _stricmp(codec.name.c_str(), kVp8CodecName) == 0; 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() { WebRtcVideoEngine2::WebRtcVideoEngine2() {
// Construct without a factory or voice engine. // Construct without a factory or voice engine.
Construct(NULL, NULL, new rtc::CpuMonitor(NULL)); Construct(NULL, NULL, new rtc::CpuMonitor(NULL));
@ -641,7 +677,8 @@ WebRtcVideoChannel2::WebRtcVideoChannel2(
WebRtcVideoEngine2* engine, WebRtcVideoEngine2* engine,
VoiceMediaChannel* voice_channel, VoiceMediaChannel* voice_channel,
WebRtcVideoEncoderFactory2* encoder_factory) 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|. // TODO(pbos): Connect the video and audio with |voice_channel|.
webrtc::Call::Config config(this); webrtc::Call::Config config(this);
Construct(webrtc::Call::Create(config), engine); Construct(webrtc::Call::Create(config), engine);
@ -651,7 +688,8 @@ WebRtcVideoChannel2::WebRtcVideoChannel2(
webrtc::Call* call, webrtc::Call* call,
WebRtcVideoEngine2* engine, WebRtcVideoEngine2* engine,
WebRtcVideoEncoderFactory2* encoder_factory) WebRtcVideoEncoderFactory2* encoder_factory)
: encoder_factory_(encoder_factory) { : encoder_factory_(encoder_factory),
unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_) {
Construct(call, engine); Construct(call, engine);
} }
@ -660,9 +698,7 @@ void WebRtcVideoChannel2::Construct(webrtc::Call* call,
rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
sending_ = false; sending_ = false;
call_.reset(call); call_.reset(call);
default_renderer_ = NULL;
default_send_ssrc_ = 0; default_send_ssrc_ = 0;
default_recv_ssrc_ = 0;
SetDefaultOptions(); SetDefaultOptions();
} }
@ -928,9 +964,6 @@ bool WebRtcVideoChannel2::AddRecvStream(const StreamParams& sp) {
uint32 ssrc = sp.first_ssrc(); uint32 ssrc = sp.first_ssrc();
assert(ssrc != 0); // TODO(pbos): Is this ever valid? 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. // TODO(pbos): Check if any of the SSRCs overlap.
if (receive_streams_.find(ssrc) != receive_streams_.end()) { if (receive_streams_.find(ssrc) != receive_streams_.end()) {
@ -987,7 +1020,8 @@ void WebRtcVideoChannel2::ConfigureReceiverRtp(
bool WebRtcVideoChannel2::RemoveRecvStream(uint32 ssrc) { bool WebRtcVideoChannel2::RemoveRecvStream(uint32 ssrc) {
LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
if (ssrc == 0) { 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 = std::map<uint32, WebRtcVideoReceiveStream*>::iterator stream =
@ -999,10 +1033,6 @@ bool WebRtcVideoChannel2::RemoveRecvStream(uint32 ssrc) {
delete stream->second; delete stream->second;
receive_streams_.erase(stream); receive_streams_.erase(stream);
if (ssrc == default_recv_ssrc_) {
default_recv_ssrc_ = 0;
}
return true; return true;
} }
@ -1010,11 +1040,7 @@ bool WebRtcVideoChannel2::SetRenderer(uint32 ssrc, VideoRenderer* renderer) {
LOG(LS_INFO) << "SetRenderer: ssrc:" << ssrc << " " LOG(LS_INFO) << "SetRenderer: ssrc:" << ssrc << " "
<< (renderer ? "(ptr)" : "NULL"); << (renderer ? "(ptr)" : "NULL");
if (ssrc == 0) { if (ssrc == 0) {
if (default_recv_ssrc_!= 0) { default_unsignalled_ssrc_handler_.SetDefaultRenderer(this, renderer);
receive_streams_[default_recv_ssrc_]->SetRenderer(renderer);
}
ssrc = default_recv_ssrc_;
default_renderer_ = renderer;
return true; return true;
} }
@ -1030,11 +1056,8 @@ bool WebRtcVideoChannel2::SetRenderer(uint32 ssrc, VideoRenderer* renderer) {
bool WebRtcVideoChannel2::GetRenderer(uint32 ssrc, VideoRenderer** renderer) { bool WebRtcVideoChannel2::GetRenderer(uint32 ssrc, VideoRenderer** renderer) {
if (ssrc == 0) { if (ssrc == 0) {
if (default_renderer_ == NULL) { *renderer = default_unsignalled_ssrc_handler_.GetDefaultRenderer();
return false; return *renderer != NULL;
}
*renderer = default_renderer_;
return true;
} }
std::map<uint32, WebRtcVideoReceiveStream*>::iterator it = std::map<uint32, WebRtcVideoReceiveStream*>::iterator it =
@ -1117,26 +1140,23 @@ void WebRtcVideoChannel2::OnPacketReceived(
} }
uint32 ssrc = 0; 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)) { if (!GetRtpSsrc(packet->data(), packet->length(), &ssrc)) {
return; return;
} }
StreamParams sp; // TODO(pbos): Make sure that the unsignalled SSRC uses the video payload.
sp.ssrcs.push_back(ssrc); // Also figure out whether RTX needs to be handled.
LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << "."; switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) {
AddRecvStream(sp); case UnsignalledSsrcHandler::kDropPacket:
SetRenderer(0, default_renderer_); return;
case UnsignalledSsrcHandler::kDeliverPacket:
break;
}
if (call_->Receiver()->DeliverPacket( if (call_->Receiver()->DeliverPacket(
reinterpret_cast<const uint8_t*>(packet->data()), packet->length()) != reinterpret_cast<const uint8_t*>(packet->data()), packet->length()) !=
webrtc::PacketReceiver::DELIVERY_OK) { webrtc::PacketReceiver::DELIVERY_OK) {
LOG(LS_WARNING) << "Failed to deliver RTP packet after creating default " LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery.";
"receiver.";
return; return;
} }
} }

View File

@ -82,6 +82,31 @@ class WebRtcVideoEngine2;
class WebRtcVideoChannel2; class WebRtcVideoChannel2;
class WebRtcVideoRenderer; 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 { class WebRtcVideoEncoderFactory2 {
public: public:
virtual ~WebRtcVideoEncoderFactory2(); virtual ~WebRtcVideoEncoderFactory2();
@ -386,8 +411,9 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler,
bool sending_; bool sending_;
rtc::scoped_ptr<webrtc::Call> call_; rtc::scoped_ptr<webrtc::Call> call_;
uint32_t default_send_ssrc_; 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. // Using primary-ssrc (first ssrc) as key.
std::map<uint32, WebRtcVideoSendStream*> send_streams_; std::map<uint32, WebRtcVideoSendStream*> send_streams_;