Fix dangling pointer _encoder in video_sender.cc.

When _codecDataBase.SetSendCodec() fails, the encoder may be deleted.
This is however not reflected in _encoder, which then becomes a dangling
pointer to the deleted object.

BUG=2384
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/2229004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4765 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pbos@webrtc.org 2013-09-17 09:38:41 +00:00
parent be63fd644f
commit da2c4cede0
2 changed files with 7 additions and 6 deletions

View File

@ -107,7 +107,6 @@ class VideoSender {
VCMEncodedFrameCallback _encodedFrameCallback;
std::vector<FrameType> _nextFrameTypes;
media_optimization::VCMMediaOptimization _mediaOpt;
VideoCodecType _sendCodecType;
VCMSendStatisticsCallback* _sendStatsCallback;
FILE* _encoderInputFile;
VCMCodecDataBase _codecDataBase;

View File

@ -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,