diff --git a/webrtc/modules/video_coding/main/source/video_coding_impl.h b/webrtc/modules/video_coding/main/source/video_coding_impl.h index 21f5c32d91..1ead48d628 100644 --- a/webrtc/modules/video_coding/main/source/video_coding_impl.h +++ b/webrtc/modules/video_coding/main/source/video_coding_impl.h @@ -107,7 +107,6 @@ class VideoSender { VCMEncodedFrameCallback _encodedFrameCallback; std::vector _nextFrameTypes; media_optimization::VCMMediaOptimization _mediaOpt; - VideoCodecType _sendCodecType; VCMSendStatisticsCallback* _sendStatsCallback; FILE* _encoderInputFile; VCMCodecDataBase _codecDataBase; diff --git a/webrtc/modules/video_coding/main/source/video_sender.cc b/webrtc/modules/video_coding/main/source/video_sender.cc index 73ee856230..eb06133526 100644 --- a/webrtc/modules/video_coding/main/source/video_sender.cc +++ b/webrtc/modules/video_coding/main/source/video_sender.cc @@ -27,7 +27,6 @@ VideoSender::VideoSender(const int32_t id, Clock* clock) _encodedFrameCallback(), _nextFrameTypes(1, kVideoFrameDelta), _mediaOpt(id, clock_), - _sendCodecType(kVideoCodecUnknown), _sendStatsCallback(NULL), _encoderInputFile(NULL), _codecDataBase(id), @@ -88,6 +87,11 @@ int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec, bool ret = _codecDataBase.SetSendCodec( sendCodec, numberOfCores, maxPayloadSize, &_encodedFrameCallback); + + // Update encoder regardless of result to make sure that we're not holding on + // to a deleted instance. + _encoder = _codecDataBase.GetEncoder(); + if (!ret) { WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCoding, @@ -96,9 +100,7 @@ int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec, return VCM_CODEC_ERROR; } - _encoder = _codecDataBase.GetEncoder(); - _sendCodecType = sendCodec->codecType; - int numLayers = (_sendCodecType != kVideoCodecVP8) + int numLayers = (sendCodec->codecType != kVideoCodecVP8) ? 1 : sendCodec->codecSpecific.VP8.numberOfTemporalLayers; // If we have screensharing and we have layers, we disable frame dropper. @@ -113,7 +115,7 @@ int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec, _nextFrameTypes.resize(VCM_MAX(sendCodec->numberOfSimulcastStreams, 1), kVideoFrameDelta); - _mediaOpt.SetEncodingData(_sendCodecType, + _mediaOpt.SetEncodingData(sendCodec->CodecType, sendCodec->maxBitrate * 1000, sendCodec->maxFramerate * 1000, sendCodec->startBitrate * 1000,