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:
parent
c891fee7ab
commit
afb554f404
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user