diff options
author | buildbot@webrtc.org <buildbot@webrtc.org> | 2014-09-19 02:01:09 +0000 |
---|---|---|
committer | buildbot@webrtc.org <buildbot@webrtc.org> | 2014-09-19 02:01:09 +0000 |
commit | 7aa6baa9a213c4ca2d51a8d2d3b4bbc46a695ca7 (patch) | |
tree | 675b43bd6a10d4b976997d58fb1fbbb2f714d796 | |
parent | 10fc3fc968451899a055b36f0ea00e9469bff514 (diff) | |
download | talk-7aa6baa9a213c4ca2d51a8d2d3b4bbc46a695ca7.tar.gz |
(Auto)update libjingle 75854833-> 75865376
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@7233 4adac7df-926f-26a2-2b94-8c16560cd09d
-rw-r--r-- | media/webrtc/webrtcvideoengine.cc | 78 | ||||
-rw-r--r-- | media/webrtc/webrtcvideoengine.h | 13 |
2 files changed, 67 insertions, 24 deletions
diff --git a/media/webrtc/webrtcvideoengine.cc b/media/webrtc/webrtcvideoengine.cc index 6b21d65..b0c6a4d 100644 --- a/media/webrtc/webrtcvideoengine.cc +++ b/media/webrtc/webrtcvideoengine.cc @@ -1890,18 +1890,9 @@ bool WebRtcVideoMediaChannel::AddSendStream(const StreamParams& sp) { } WebRtcVideoChannelSendInfo* send_channel = GetSendChannelBySsrcKey(ssrc_key); - // Set the send (local) SSRC. // If there are multiple send SSRCs, we can only set the first one here, and // the rest of the SSRC(s) need to be set after SetSendCodec has been called - // (with a codec requires multiple SSRC(s)). - if (engine()->vie()->rtp()->SetLocalSSRC(channel_id, - sp.first_ssrc()) != 0) { - LOG_RTCERR2(SetLocalSSRC, channel_id, sp.first_ssrc()); - return false; - } - - // Set the corresponding RTX SSRC. - if (!SetLocalRtxSsrc(channel_id, sp, sp.first_ssrc(), 0)) { + if (!SetLimitedNumberOfSendSsrcs(channel_id, sp, 1)) { return false; } @@ -3673,6 +3664,7 @@ bool WebRtcVideoMediaChannel::SetSendCodec( LOG(LS_INFO) << "0x0 resolution selected. Captured frames will be dropped " << "for ssrc: " << ssrc << "."; } else { + StreamParams* send_params = send_channel->stream_params(); MaybeChangeBitrates(channel_id, &target_codec); webrtc::VideoCodec current_codec; if (!engine()->vie()->codec()->GetSendCodec(channel_id, current_codec)) { @@ -3688,6 +3680,11 @@ bool WebRtcVideoMediaChannel::SetSendCodec( return false; } + if (send_params) { + if (!SetSendSsrcs(channel_id, *send_params, target_codec)) { + return false; + } + } // NOTE: SetRtxSendPayloadType must be called after all simulcast SSRCs // are configured. Otherwise ssrc's configured after this point will use // the primary PT for RTX. @@ -3976,6 +3973,13 @@ bool WebRtcVideoMediaChannel::MaybeResetVieSendCodec( engine()->vie()->rtp()->SetTransmissionSmoothingStatus(channel_id, leaky_bucket); } + // TODO(sriniv): SetSendCodec already sets ssrc's like below. + // Consider removing. + if (send_params) { + if (!SetSendSsrcs(channel_id, *send_params, target_codec)) { + return false; + } + } if (reset) { *reset = true; } @@ -4131,21 +4135,55 @@ bool WebRtcVideoMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, return SetHeaderExtension(setter, channel_id, extension); } -bool WebRtcVideoMediaChannel::SetLocalRtxSsrc(int channel_id, - const StreamParams& send_params, - uint32 primary_ssrc, - int stream_idx) { - uint32 rtx_ssrc = 0; - bool has_rtx = send_params.GetFidSsrc(primary_ssrc, &rtx_ssrc); - if (has_rtx && engine()->vie()->rtp()->SetLocalSSRC( - channel_id, rtx_ssrc, webrtc::kViEStreamTypeRtx, stream_idx) != 0) { - LOG_RTCERR4(SetLocalSSRC, channel_id, rtx_ssrc, - webrtc::kViEStreamTypeRtx, stream_idx); +bool WebRtcVideoMediaChannel::SetPrimaryAndRtxSsrcs( + int channel_id, int idx, uint32 primary_ssrc, + const StreamParams& send_params) { + LOG(LS_INFO) << "Set primary ssrc " << primary_ssrc + << " on channel " << channel_id << " idx " << idx; + if (engine()->vie()->rtp()->SetLocalSSRC( + channel_id, primary_ssrc, webrtc::kViEStreamTypeNormal, idx) != 0) { + LOG_RTCERR4(SetLocalSSRC, + channel_id, primary_ssrc, webrtc::kViEStreamTypeNormal, idx); return false; } + + uint32 rtx_ssrc = 0; + if (send_params.GetFidSsrc(primary_ssrc, &rtx_ssrc)) { + LOG(LS_INFO) << "Set rtx ssrc " << rtx_ssrc + << " on channel " << channel_id << " idx " << idx; + if (engine()->vie()->rtp()->SetLocalSSRC( + channel_id, rtx_ssrc, webrtc::kViEStreamTypeRtx, idx) != 0) { + LOG_RTCERR4(SetLocalSSRC, + channel_id, rtx_ssrc, webrtc::kViEStreamTypeRtx, idx); + return false; + } + } return true; } +bool WebRtcVideoMediaChannel::SetLimitedNumberOfSendSsrcs( + int channel_id, const StreamParams& sp, size_t limit) { + const SsrcGroup* sim_group = sp.get_ssrc_group(kSimSsrcGroupSemantics); + if (!sim_group || limit == 1) { + return SetPrimaryAndRtxSsrcs(channel_id, 0, sp.first_ssrc(), sp); + } + + std::vector<uint32> ssrcs = sim_group->ssrcs; + for (size_t i = 0; i < ssrcs.size() && i < limit; ++i) { + if (!SetPrimaryAndRtxSsrcs(channel_id, i, ssrcs[i], sp)) { + return false; + } + } + return true; +} + +bool WebRtcVideoMediaChannel::SetSendSsrcs( + int channel_id, const StreamParams& sp, + const webrtc::VideoCodec& codec) { + // TODO(pthatcher): Support more than one primary SSRC per stream. + return SetLimitedNumberOfSendSsrcs(channel_id, sp, 1); +} + void WebRtcVideoMediaChannel::MaybeConnectCapturer(VideoCapturer* capturer) { if (capturer && GetSendChannelNum(capturer) == 1) { capturer->SignalVideoFrame.connect(this, diff --git a/media/webrtc/webrtcvideoengine.h b/media/webrtc/webrtcvideoengine.h index 141035c..bd8f1f8 100644 --- a/media/webrtc/webrtcvideoengine.h +++ b/media/webrtc/webrtcvideoengine.h @@ -310,6 +310,15 @@ class WebRtcVideoMediaChannel : public rtc::MessageHandler, virtual int SendPacket(int channel, const void* data, int len); virtual int SendRTCPPacket(int channel, const void* data, int len); + bool SetPrimaryAndRtxSsrcs( + int channel_id, int idx, uint32 primary_ssrc, + const StreamParams& send_params); + bool SetLimitedNumberOfSendSsrcs( + int channel_id, const StreamParams& send_params, size_t limit); + virtual bool SetSendSsrcs( + int channel_id, const StreamParams& send_params, + const webrtc::VideoCodec& codec); + private: typedef std::map<uint32, WebRtcVideoChannelRecvInfo*> RecvChannelMap; typedef std::map<uint32, WebRtcVideoChannelSendInfo*> SendChannelMap; @@ -413,10 +422,6 @@ class WebRtcVideoMediaChannel : public rtc::MessageHandler, // Signal when cpu adaptation has no further scope to adapt. void OnCpuAdaptationUnable(); - // Set the local (send-side) RTX SSRC corresponding to primary_ssrc. - bool SetLocalRtxSsrc(int channel_id, const StreamParams& send_params, - uint32 primary_ssrc, int stream_idx); - // Connect |capturer| to WebRtcVideoMediaChannel if it is only registered // to one send channel, i.e. the first send channel. void MaybeConnectCapturer(VideoCapturer* capturer); |