Chromium Code Reviews| Index: webrtc/video/vie_encoder.cc |
| diff --git a/webrtc/video/vie_encoder.cc b/webrtc/video/vie_encoder.cc |
| index 20cfaffb62bd943f5c04c4054e162e0eb438d0a6..e8fcbb3c154cea4129d1fb720a7b190f1ce55124 100644 |
| --- a/webrtc/video/vie_encoder.cc |
| +++ b/webrtc/video/vie_encoder.cc |
| @@ -105,6 +105,7 @@ class ViEBitrateObserver : public BitrateObserver { |
| }; |
| ViEEncoder::ViEEncoder(uint32_t number_of_cores, |
| + const std::vector<uint32_t>& ssrcs, |
| ProcessThread* module_process_thread, |
| SendStatisticsProxy* stats_proxy, |
| I420FrameCallback* pre_encode_callback, |
| @@ -113,6 +114,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores, |
| PayloadRouter* payload_router, |
| BitrateAllocator* bitrate_allocator) |
| : number_of_cores_(number_of_cores), |
| + ssrcs_(ssrcs), |
| vp_(VideoProcessing::Create()), |
| qm_callback_(new QMVideoSettingsCallback(vp_.get())), |
| vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(), |
| @@ -132,6 +134,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores, |
| network_is_transmitting_(true), |
| encoder_paused_(false), |
| encoder_paused_and_dropped_frame_(false), |
| + time_last_intra_request_ms_(ssrcs.size(), -1), |
| module_process_thread_(module_process_thread), |
| has_received_sli_(false), |
| picture_id_sli_(0), |
| @@ -495,61 +498,26 @@ void ViEEncoder::OnReceivedIntraFrameRequest(uint32_t ssrc) { |
| // Key frame request from remote side, signal to VCM. |
| TRACE_EVENT0("webrtc", "OnKeyFrameRequest"); |
| - int idx = 0; |
| - { |
| - rtc::CritScope lock(&data_cs_); |
| - auto stream_it = ssrc_streams_.find(ssrc); |
| - if (stream_it == ssrc_streams_.end()) { |
| - LOG_F(LS_WARNING) << "ssrc not found: " << ssrc << ", map size " |
| - << ssrc_streams_.size(); |
| - return; |
| - } |
| - std::map<unsigned int, int64_t>::iterator time_it = |
| - time_last_intra_request_ms_.find(ssrc); |
| - if (time_it == time_last_intra_request_ms_.end()) { |
| - time_last_intra_request_ms_[ssrc] = 0; |
| - } |
| - |
| - int64_t now = TickTime::MillisecondTimestamp(); |
| - if (time_last_intra_request_ms_[ssrc] + kMinKeyFrameRequestIntervalMs |
| - > now) { |
| - return; |
| + for (size_t i = 0; i < ssrcs_.size(); ++i) { |
| + if (ssrcs_[i] != ssrc) |
| + continue; |
| + int64_t now_ms = TickTime::MillisecondTimestamp(); |
| + { |
| + rtc::CritScope lock(&data_cs_); |
| + if (time_last_intra_request_ms_[i] + kMinKeyFrameRequestIntervalMs > |
|
danilchap
2016/02/19 19:25:56
no check if time_last_intra_request_ms_[i] is vali
pbos-webrtc
2016/02/19 19:30:07
We're relying on now_ms >= 0 (pretty much everywhe
danilchap
2016/02/19 19:39:36
Just want to be sure being implicit here is intend
|
| + now_ms) { |
| + return; |
| + } |
| + time_last_intra_request_ms_[i] = now_ms; |
| } |
| - time_last_intra_request_ms_[ssrc] = now; |
| - idx = stream_it->second; |
| - } |
| - // Release the critsect before triggering key frame. |
| - vcm_->IntraFrameRequest(idx); |
| -} |
| - |
| -void ViEEncoder::OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) { |
| - rtc::CritScope lock(&data_cs_); |
| - std::map<unsigned int, int>::iterator it = ssrc_streams_.find(old_ssrc); |
| - if (it == ssrc_streams_.end()) { |
| + vcm_->IntraFrameRequest(static_cast<int>(i)); |
| return; |
| } |
| - |
| - ssrc_streams_[new_ssrc] = it->second; |
| - ssrc_streams_.erase(it); |
| - |
| - std::map<unsigned int, int64_t>::iterator time_it = |
| - time_last_intra_request_ms_.find(old_ssrc); |
| - int64_t last_intra_request_ms = 0; |
| - if (time_it != time_last_intra_request_ms_.end()) { |
| - last_intra_request_ms = time_it->second; |
| - time_last_intra_request_ms_.erase(time_it); |
| - } |
| - time_last_intra_request_ms_[new_ssrc] = last_intra_request_ms; |
| + RTC_NOTREACHED() << "Should not receive keyframe requests on unknown SSRCs."; |
| } |
| -void ViEEncoder::SetSsrcs(const std::vector<uint32_t>& ssrcs) { |
| - rtc::CritScope lock(&data_cs_); |
| - ssrc_streams_.clear(); |
| - time_last_intra_request_ms_.clear(); |
| - int idx = 0; |
| - for (uint32_t ssrc : ssrcs) { |
| - ssrc_streams_[ssrc] = idx++; |
| - } |
| +void ViEEncoder::OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) { |
| + RTC_NOTREACHED(); |
| } |
| void ViEEncoder::SetMinTransmitBitrate(int min_transmit_bitrate_kbps) { |
| @@ -570,14 +538,12 @@ void ViEEncoder::OnNetworkChanged(uint32_t bitrate_bps, |
| bool video_is_suspended = vcm_->VideoSuspended(); |
| bool video_suspension_changed; |
| VideoCodec send_codec; |
| - uint32_t first_ssrc; |
| { |
| rtc::CritScope lock(&data_cs_); |
| last_observed_bitrate_bps_ = bitrate_bps; |
| video_suspension_changed = video_suspended_ != video_is_suspended; |
| video_suspended_ = video_is_suspended; |
| send_codec = encoder_config_; |
| - first_ssrc = ssrc_streams_.begin()->first; |
| } |
| SimulcastStream* stream_configs = send_codec.simulcastStream; |
| @@ -590,7 +556,7 @@ void ViEEncoder::OnNetworkChanged(uint32_t bitrate_bps, |
| return; |
| // Video suspend-state changed, inform codec observer. |
| LOG(LS_INFO) << "Video suspend state changed " << video_is_suspended |
| - << " for ssrc " << first_ssrc; |
| + << " for ssrc " << ssrcs_[0]; |
| if (stats_proxy_) |
| stats_proxy_->OnSuspendChange(video_is_suspended); |
| } |