diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc index 4351815a9..874db7c4c 100644 --- a/webrtc/video_engine/vie_channel.cc +++ b/webrtc/video_engine/vie_channel.cc @@ -1665,10 +1665,6 @@ CallStatsObserver* ViEChannel::GetStatsObserver() { return stats_observer_.get(); } -// Do not acquire the lock of |vcm_| in this function. Decode callback won't -// necessarily be called from the decoding thread. The decoding thread may have -// held the lock when calling VideoDecoder::Decode, Reset, or Release. Acquiring -// the same lock in the path of decode callback can deadlock. int32_t ViEChannel::FrameToRender( I420VideoFrame& video_frame) { // NOLINT CriticalSectionScoped cs(callback_cs_.get()); @@ -1676,11 +1672,20 @@ int32_t ViEChannel::FrameToRender( if (decoder_reset_) { // Trigger a callback to the user if the incoming codec has changed. if (codec_observer_) { - // VCM::ReceiveCodec returns the codec set by RegisterReceiveCodec, which - // might not be the size we're actually decoding. - receive_codec_.width = static_cast(video_frame.width()); - receive_codec_.height = static_cast(video_frame.height()); - codec_observer_->IncomingCodecChanged(channel_id_, receive_codec_); + VideoCodec decoder; + memset(&decoder, 0, sizeof(decoder)); + if (vcm_.ReceiveCodec(&decoder) == VCM_OK) { + // VCM::ReceiveCodec returns the codec set by + // RegisterReceiveCodec, which might not be the size we're + // actually decoding. + decoder.width = static_cast(video_frame.width()); + decoder.height = static_cast(video_frame.height()); + codec_observer_->IncomingCodecChanged(channel_id_, decoder); + } else { + assert(false); + WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_), + "%s: Could not get receive codec", __FUNCTION__); + } } decoder_reset_ = false; } @@ -1944,17 +1949,9 @@ int32_t ViEChannel::OnInitializeDecoder( payload_type, payload_name); vcm_.ResetDecoder(); - VideoCodec receive_codec; - memset(&receive_codec, 0, sizeof(receive_codec)); - if (vcm_.ReceiveCodec(&receive_codec) == VCM_OK) { - CriticalSectionScoped cs(callback_cs_.get()); - decoder_reset_ = true; - receive_codec_ = receive_codec; - } else { - assert(false); - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_), - "%s: Could not get receive codec", __FUNCTION__); - } + callback_cs_->Enter(); + decoder_reset_ = true; + callback_cs_->Leave(); return 0; } diff --git a/webrtc/video_engine/vie_channel.h b/webrtc/video_engine/vie_channel.h index 6f1a639ff..090582b9c 100644 --- a/webrtc/video_engine/vie_channel.h +++ b/webrtc/video_engine/vie_channel.h @@ -383,7 +383,6 @@ class ViEChannel Transport* external_transport_; bool decoder_reset_; - VideoCodec receive_codec_; bool wait_for_key_frame_; ThreadWrapper* decode_thread_;