diff options
author | buildbot@webrtc.org <buildbot@webrtc.org> | 2014-10-22 15:45:17 +0000 |
---|---|---|
committer | buildbot@webrtc.org <buildbot@webrtc.org> | 2014-10-22 15:45:17 +0000 |
commit | bf7ac9386dce587c5dc7d7cb5794cd4a78570cd9 (patch) | |
tree | 24b9fde9fae64124b853712c7cf77683a4271b10 | |
parent | 81275c62a0e8cdbb2ff6f8fc8968027607661ddf (diff) | |
download | talk-bf7ac9386dce587c5dc7d7cb5794cd4a78570cd9.tar.gz |
(Auto)update libjingle 78262388-> 78262615
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@7496 4adac7df-926f-26a2-2b94-8c16560cd09d
-rw-r--r-- | media/webrtc/webrtcvideoengine.cc | 115 | ||||
-rw-r--r-- | media/webrtc/webrtcvideoengine.h | 10 | ||||
-rw-r--r-- | media/webrtc/webrtcvideoengine_unittest.cc | 2 |
3 files changed, 64 insertions, 63 deletions
diff --git a/media/webrtc/webrtcvideoengine.cc b/media/webrtc/webrtcvideoengine.cc index 4a4e29a..fc64a9b 100644 --- a/media/webrtc/webrtcvideoengine.cc +++ b/media/webrtc/webrtcvideoengine.cc @@ -66,6 +66,18 @@ namespace { +cricket::VideoFormat CreateVideoFormat(int width, int height, int framerate) { + return cricket::VideoFormat( + width, + height, + cricket::VideoFormat::FpsToInterval(framerate), + cricket::FOURCC_ANY); +} + +cricket::VideoFormat VideoFormatFromCodec(const cricket::VideoCodec& codec) { + return CreateVideoFormat(codec.width, codec.height, codec.framerate); +} + template <class T> bool Changed(cricket::Settable<T> proposed, cricket::Settable<T> original) { @@ -172,10 +184,12 @@ static bool IsRembEnabled(const VideoCodec& codec) { } struct FlushBlackFrameData : public rtc::MessageData { - FlushBlackFrameData(uint32 s, int64 t) : ssrc(s), timestamp(t) { + FlushBlackFrameData(uint32 s, int64 t, int i) + : ssrc(s), timestamp(t), interval(i) { } uint32 ssrc; int64 timestamp; + int interval; }; class WebRtcRenderAdapter : public webrtc::ExternalRenderer { @@ -602,7 +616,6 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { video_capturer_(NULL), encoder_observer_(channel_id), external_capture_(external_capture), - interval_(0), cpu_monitor_(cpu_monitor), old_adaptation_changes_(0) { } @@ -625,20 +638,11 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { } void set_video_format(const VideoFormat& video_format) { video_format_ = video_format; - if (video_format_ != cricket::VideoFormat()) { - interval_ = video_format_.interval; - } CoordinatedVideoAdapter* adapter = video_adapter(); if (adapter) { adapter->OnOutputFormatRequest(video_format_); } } - void set_interval(int64 interval) { - if (video_format() == cricket::VideoFormat()) { - interval_ = interval; - } - } - int64 interval() { return interval_; } int CurrentAdaptReason() const { if (!video_adapter()) { @@ -657,11 +661,8 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { void set_stream_params(const StreamParams& sp) { stream_params_.reset(new StreamParams(sp)); } - void ClearStreamParams() { stream_params_.reset(); } - bool has_ssrc(uint32 local_ssrc) const { - return !stream_params_ ? false : - stream_params_->has_ssrc(local_ssrc); - } + bool IsActive() { return stream_params() != NULL; } + void Deactivate() { stream_params_.reset(); } WebRtcLocalStreamInfo* local_stream_info() { return &local_stream_info_; } @@ -839,8 +840,6 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { WebRtcLocalStreamInfo local_stream_info_; - int64 interval_; - rtc::CpuMonitor* cpu_monitor_; rtc::scoped_ptr<WebRtcOveruseObserver> overuse_observer_; @@ -1103,11 +1102,8 @@ bool WebRtcVideoEngine::SetDefaultCodec(const VideoCodec& codec) { } ASSERT(!video_codecs_.empty()); - default_codec_format_ = VideoFormat( - video_codecs_[0].width, - video_codecs_[0].height, - VideoFormat::FpsToInterval(video_codecs_[0].framerate), - FOURCC_ANY); + default_codec_format_ = VideoFormatFromCodec(video_codecs_[0]); + return true; } @@ -1774,15 +1770,15 @@ bool WebRtcVideoMediaChannel::MaybeRegisterExternalEncoder( const webrtc::VideoCodec& codec) { // Codec type not supported or encoder already registered, so // nothing to do. - if (!engine()->IsExternalEncoderCodecType(codec.codecType) - || send_channel->IsEncoderRegistered(codec.plType)) { + if (!engine()->IsExternalEncoderCodecType(codec.codecType) || + send_channel->IsEncoderRegistered(codec.plType)) { return true; } webrtc::VideoEncoder* encoder = engine()->CreateExternalEncoder(codec.codecType); if (!encoder) { - // No encoder factor, so nothing to do. + // No external encoder created, so nothing to do. return true; } @@ -1897,7 +1893,7 @@ bool WebRtcVideoMediaChannel::AddSendStream(const StreamParams& sp) { // If the default channel is already used for sending create a new channel // otherwise use the default channel for sending. int channel_id = kChannelIdUnset; - if (!DefaultSendChannelInUse()) { + if (!DefaultSendChannelIsActive()) { channel_id = default_channel_id_; } else { if (!CreateChannel(ssrc_key, MD_SEND, &channel_id)) { @@ -1955,9 +1951,9 @@ bool WebRtcVideoMediaChannel::RemoveSendStream(uint32 ssrc) { } WebRtcVideoChannelSendInfo* send_channel = GetSendChannelBySsrcKey(ssrc_key); int channel_id = send_channel->channel_id(); - if (IsDefaultChannelId(channel_id) && !send_channel->stream_params()) { - // Default channel will still exist. However, if stream_params() is NULL - // there is no stream to remove. + if (IsDefaultChannelId(channel_id) && !send_channel->IsActive()) { + // Default channel will still exist. However, there is no stream + // to remove. return false; } if (sending_) { @@ -1979,7 +1975,7 @@ bool WebRtcVideoMediaChannel::RemoveSendStream(uint32 ssrc) { // The receive channels depend on the default channel, recycle it instead. if (IsDefaultChannelId(channel_id)) { SetCapturer(GetDefaultSendChannelSsrc(), NULL); - send_channel->ClearStreamParams(); + send_channel->Deactivate(); } else { return DeleteSendChannel(ssrc_key); } @@ -1995,7 +1991,7 @@ bool WebRtcVideoMediaChannel::AddRecvStream(const StreamParams& sp) { // TODO(zhurunz) Remove this once BWE works properly across different send // and receive channels. // Reuse default channel for recv stream in 1:1 call. - if (!InConferenceMode() && first_receive_ssrc_ == kSsrcUnset) { + if (!ConferenceModeIsEnabled() && first_receive_ssrc_ == kSsrcUnset) { LOG(LS_INFO) << "Recv stream " << sp.first_ssrc() << " reuse default channel #" << default_channel_id_; @@ -2211,11 +2207,11 @@ bool WebRtcVideoMediaChannel::SendIntraFrame() { bool WebRtcVideoMediaChannel::HasReadySendChannels() { return !send_channels_.empty() && - ((send_channels_.size() > 1) || DefaultSendChannelInUse()); + ((send_channels_.size() > 1) || DefaultSendChannelIsActive()); } -bool WebRtcVideoMediaChannel::DefaultSendChannelInUse() { - return GetDefaultSendChannel() && GetDefaultSendChannel()->stream_params(); +bool WebRtcVideoMediaChannel::DefaultSendChannelIsActive() { + return GetDefaultSendChannel() && GetDefaultSendChannel()->IsActive(); } bool WebRtcVideoMediaChannel::GetSendChannelSsrcKey(uint32 local_ssrc, @@ -2240,7 +2236,8 @@ bool WebRtcVideoMediaChannel::GetSendChannelSsrcKey(uint32 local_ssrc, for (SendChannelMap::iterator iter = send_channels_.begin(); iter != send_channels_.end(); ++iter) { WebRtcVideoChannelSendInfo* send_channel = iter->second; - if (send_channel->has_ssrc(local_ssrc)) { + if (send_channel->stream_params() != NULL && + send_channel->stream_params()->has_ssrc(local_ssrc)) { *ssrc_key = iter->first; return true; } @@ -2284,7 +2281,7 @@ bool WebRtcVideoMediaChannel::CreateSendChannelSsrcKey(uint32 local_ssrc, // this point a duplicate SSRC has been detected. return false; } - if (!DefaultSendChannelInUse()) { + if (!DefaultSendChannelIsActive()) { // |ssrc_key| should be kDefaultChannelSsrcKey here as the default // channel should be re-used whenever it is not used. *ssrc_key = kDefaultChannelSsrcKey; @@ -2310,7 +2307,7 @@ int WebRtcVideoMediaChannel::GetSendChannelNum(VideoCapturer* capturer) { } uint32 WebRtcVideoMediaChannel::GetDefaultSendChannelSsrc() { - if (!DefaultSendChannelInUse()) { + if (!DefaultSendChannelIsActive()) { return 0; } return GetDefaultSendChannel()->stream_params()->first_ssrc(); @@ -2377,7 +2374,8 @@ bool WebRtcVideoMediaChannel::RemoveCapturer(uint32 ssrc) { send_channel->set_video_capturer(NULL, engine()->vie()); const int64 timestamp = send_channel->local_stream_info()->time_stamp(); if (send_codec_) { - QueueBlackFrame(ssrc, timestamp, send_codec_->maxFramerate); + QueueBlackFrame(ssrc, timestamp, + VideoFormat::FpsToInterval(send_codec_->maxFramerate)); } return true; } @@ -2418,8 +2416,7 @@ bool WebRtcVideoMediaChannel::GetStats(const StatsOptions& options, WebRtcVideoChannelSendInfo* send_channel = iter->second; const int channel_id = send_channel->channel_id(); VideoSenderInfo sinfo; - const StreamParams* send_params = send_channel->stream_params(); - if (!send_params) { + if (!send_channel->IsActive()) { // This should only happen if the default vie channel is not in use. // This can happen if no streams have ever been added or the stream // corresponding to the default channel has been removed. Note that @@ -2439,6 +2436,7 @@ bool WebRtcVideoMediaChannel::GetStats(const StatsOptions& options, WebRtcLocalStreamInfo* channel_stream_info = send_channel->local_stream_info(); + const StreamParams* send_params = send_channel->stream_params(); for (size_t i = 0; i < send_params->ssrcs.size(); ++i) { sinfo.add_ssrc(send_params->ssrcs[i]); } @@ -2723,7 +2721,8 @@ bool WebRtcVideoMediaChannel::SetCapturer(uint32 ssrc, } const int64 timestamp = send_channel->local_stream_info()->time_stamp(); if (send_codec_) { - QueueBlackFrame(ssrc, timestamp, send_codec_->maxFramerate); + QueueBlackFrame(ssrc, timestamp, + VideoFormat::FpsToInterval(send_codec_->maxFramerate)); } return true; } @@ -2745,7 +2744,7 @@ void WebRtcVideoMediaChannel::OnPacketReceived( int processing_channel_id = GetRecvChannelId(ssrc); if (processing_channel_id == kChannelIdUnset) { // Allocate an unsignalled recv channel for processing in conference mode. - if (!InConferenceMode()) { + if (!ConferenceModeIsEnabled()) { // If we can't find or allocate one, use the default. processing_channel_id = default_channel_id_; } else if (!CreateUnsignalledRecvChannel(ssrc, &processing_channel_id)) { @@ -3458,6 +3457,8 @@ bool WebRtcVideoMediaChannel::ConfigureSending(int channel_id, LOG_RTCERR2(ConnectCaptureDevice, vie_capture, channel_id); return false; } + + // Set up a new send channel. rtc::scoped_ptr<WebRtcVideoChannelSendInfo> send_channel( new WebRtcVideoChannelSendInfo(channel_id, vie_capture, external_capture, @@ -3549,7 +3550,7 @@ bool WebRtcVideoMediaChannel::SetNackFec(int channel_id, int fec_payload_type, bool nack_enabled) { bool enable = (red_payload_type != -1 && fec_payload_type != -1 && - !InConferenceMode()); + !ConferenceModeIsEnabled()); if (enable) { if (engine_->vie()->rtp()->SetHybridNACKFECStatus( channel_id, nack_enabled, red_payload_type, fec_payload_type) != 0) { @@ -3659,8 +3660,6 @@ bool WebRtcVideoMediaChannel::SetSendCodec( return false; } } - send_channel->set_interval( - cricket::VideoFormat::FpsToInterval(target_codec.maxFramerate)); return true; } @@ -3987,10 +3986,9 @@ void WebRtcVideoMediaChannel::SanitizeBitrates( } void WebRtcVideoMediaChannel::OnMessage(rtc::Message* msg) { - FlushBlackFrameData* black_frame_data = - static_cast<FlushBlackFrameData*>(msg->pdata); - FlushBlackFrame(black_frame_data->ssrc, black_frame_data->timestamp); - delete black_frame_data; + FlushBlackFrameData* data = static_cast<FlushBlackFrameData*>(msg->pdata); + FlushBlackFrame(data->ssrc, data->timestamp, data->interval); + delete data; } int WebRtcVideoMediaChannel::SendPacket(int channel, const void* data, @@ -4007,19 +4005,18 @@ int WebRtcVideoMediaChannel::SendRTCPPacket(int channel, } void WebRtcVideoMediaChannel::QueueBlackFrame(uint32 ssrc, int64 timestamp, - int framerate) { + int interval) { if (timestamp) { FlushBlackFrameData* black_frame_data = new FlushBlackFrameData( - ssrc, - timestamp); + ssrc, timestamp, interval); const int delay_ms = static_cast<int>( - 2 * cricket::VideoFormat::FpsToInterval(framerate) * - rtc::kNumMillisecsPerSec / rtc::kNumNanosecsPerSec); + 2 * interval * rtc::kNumMillisecsPerSec / rtc::kNumNanosecsPerSec); worker_thread()->PostDelayed(delay_ms, this, 0, black_frame_data); } } -void WebRtcVideoMediaChannel::FlushBlackFrame(uint32 ssrc, int64 timestamp) { +void WebRtcVideoMediaChannel::FlushBlackFrame( + uint32 ssrc, int64 timestamp, int interval) { WebRtcVideoChannelSendInfo* send_channel = GetSendChannelBySsrc(ssrc); if (!send_channel) { return; @@ -4041,7 +4038,7 @@ void WebRtcVideoMediaChannel::FlushBlackFrame(uint32 ssrc, int64 timestamp) { WebRtcVideoFrame black_frame; // Black frame is not screencast. const bool screencasting = false; - const int64 timestamp_delta = send_channel->interval(); + const int64 timestamp_delta = interval; if (!black_frame.InitToBlack(send_codec_->width, send_codec_->height, 1, 1, last_frame_elapsed_time + timestamp_delta, last_frame_time_stamp + timestamp_delta) || @@ -4094,7 +4091,7 @@ bool WebRtcVideoMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, bool WebRtcVideoMediaChannel::SetPrimaryAndRtxSsrcs( int channel_id, int idx, uint32 primary_ssrc, - const StreamParams& send_params) { + const StreamParams& sp) { LOG(LS_INFO) << "Set primary ssrc " << primary_ssrc << " on channel " << channel_id << " idx " << idx; if (engine()->vie()->rtp()->SetLocalSSRC( @@ -4105,7 +4102,7 @@ bool WebRtcVideoMediaChannel::SetPrimaryAndRtxSsrcs( } uint32 rtx_ssrc = 0; - if (send_params.GetFidSsrc(primary_ssrc, &rtx_ssrc)) { + if (sp.GetFidSsrc(primary_ssrc, &rtx_ssrc)) { LOG(LS_INFO) << "Set rtx ssrc " << rtx_ssrc << " on channel " << channel_id << " idx " << idx; if (engine()->vie()->rtp()->SetLocalSSRC( diff --git a/media/webrtc/webrtcvideoengine.h b/media/webrtc/webrtcvideoengine.h index 72ba9df..55a3f0f 100644 --- a/media/webrtc/webrtcvideoengine.h +++ b/media/webrtc/webrtcvideoengine.h @@ -316,6 +316,10 @@ class WebRtcVideoMediaChannel : public rtc::MessageHandler, virtual int SendPacket(int channel, const void* data, int len) OVERRIDE; virtual int SendRTCPPacket(int channel, const void* data, int len) OVERRIDE; + bool ConferenceModeIsEnabled() const { + return options_.conference_mode.GetWithDefaultIfUnset(false); + } + // Checks the current bitrate estimate and modifies the bitrates // accordingly, including converting kAutoBandwidth to the correct defaults. virtual void SanitizeBitrates( @@ -387,7 +391,7 @@ class WebRtcVideoMediaChannel : public rtc::MessageHandler, bool SendIntraFrame(int channel_id); bool HasReadySendChannels(); - bool DefaultSendChannelInUse(); + bool DefaultSendChannelIsActive(); // Returns the ssrc key corresponding to the provided local SSRC in // |ssrc_key|. The return value is true upon success. If the local @@ -420,8 +424,8 @@ class WebRtcVideoMediaChannel : public rtc::MessageHandler, bool RemoveCapturer(uint32 ssrc); rtc::MessageQueue* worker_thread() { return engine_->worker_thread(); } - void QueueBlackFrame(uint32 ssrc, int64 timestamp, int framerate); - void FlushBlackFrame(uint32 ssrc, int64 timestamp); + void QueueBlackFrame(uint32 ssrc, int64 timestamp, int interval); + void FlushBlackFrame(uint32 ssrc, int64 timestamp, int interval); void SetNetworkTransmissionState(bool is_transmitting); diff --git a/media/webrtc/webrtcvideoengine_unittest.cc b/media/webrtc/webrtcvideoengine_unittest.cc index 4060493..00d6e4b 100644 --- a/media/webrtc/webrtcvideoengine_unittest.cc +++ b/media/webrtc/webrtcvideoengine_unittest.cc @@ -1475,7 +1475,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetStartBandwidthOption) { kMaxBandwidthKbps, kMinBandwidthKbps, kStartBandwidthKbps); // Set the start bitrate option. - int kBoostedStartBandwidthKbps = 1000; + unsigned int kBoostedStartBandwidthKbps = 1000; ASSERT_NE(kStartBandwidthKbps, kBoostedStartBandwidthKbps); cricket::VideoOptions options; options.video_start_bitrate.Set(kBoostedStartBandwidthKbps); |