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:
parent
be63fd644f
commit
da2c4cede0
@ -107,7 +107,6 @@ class VideoSender {
|
|||||||
VCMEncodedFrameCallback _encodedFrameCallback;
|
VCMEncodedFrameCallback _encodedFrameCallback;
|
||||||
std::vector<FrameType> _nextFrameTypes;
|
std::vector<FrameType> _nextFrameTypes;
|
||||||
media_optimization::VCMMediaOptimization _mediaOpt;
|
media_optimization::VCMMediaOptimization _mediaOpt;
|
||||||
VideoCodecType _sendCodecType;
|
|
||||||
VCMSendStatisticsCallback* _sendStatsCallback;
|
VCMSendStatisticsCallback* _sendStatsCallback;
|
||||||
FILE* _encoderInputFile;
|
FILE* _encoderInputFile;
|
||||||
VCMCodecDataBase _codecDataBase;
|
VCMCodecDataBase _codecDataBase;
|
||||||
|
@ -27,7 +27,6 @@ VideoSender::VideoSender(const int32_t id, Clock* clock)
|
|||||||
_encodedFrameCallback(),
|
_encodedFrameCallback(),
|
||||||
_nextFrameTypes(1, kVideoFrameDelta),
|
_nextFrameTypes(1, kVideoFrameDelta),
|
||||||
_mediaOpt(id, clock_),
|
_mediaOpt(id, clock_),
|
||||||
_sendCodecType(kVideoCodecUnknown),
|
|
||||||
_sendStatsCallback(NULL),
|
_sendStatsCallback(NULL),
|
||||||
_encoderInputFile(NULL),
|
_encoderInputFile(NULL),
|
||||||
_codecDataBase(id),
|
_codecDataBase(id),
|
||||||
@ -88,6 +87,11 @@ int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec,
|
|||||||
|
|
||||||
bool ret = _codecDataBase.SetSendCodec(
|
bool ret = _codecDataBase.SetSendCodec(
|
||||||
sendCodec, numberOfCores, maxPayloadSize, &_encodedFrameCallback);
|
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) {
|
if (!ret) {
|
||||||
WEBRTC_TRACE(webrtc::kTraceError,
|
WEBRTC_TRACE(webrtc::kTraceError,
|
||||||
webrtc::kTraceVideoCoding,
|
webrtc::kTraceVideoCoding,
|
||||||
@ -96,9 +100,7 @@ int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec,
|
|||||||
return VCM_CODEC_ERROR;
|
return VCM_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
_encoder = _codecDataBase.GetEncoder();
|
int numLayers = (sendCodec->codecType != kVideoCodecVP8)
|
||||||
_sendCodecType = sendCodec->codecType;
|
|
||||||
int numLayers = (_sendCodecType != kVideoCodecVP8)
|
|
||||||
? 1
|
? 1
|
||||||
: sendCodec->codecSpecific.VP8.numberOfTemporalLayers;
|
: sendCodec->codecSpecific.VP8.numberOfTemporalLayers;
|
||||||
// If we have screensharing and we have layers, we disable frame dropper.
|
// 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),
|
_nextFrameTypes.resize(VCM_MAX(sendCodec->numberOfSimulcastStreams, 1),
|
||||||
kVideoFrameDelta);
|
kVideoFrameDelta);
|
||||||
|
|
||||||
_mediaOpt.SetEncodingData(_sendCodecType,
|
_mediaOpt.SetEncodingData(sendCodec->CodecType,
|
||||||
sendCodec->maxBitrate * 1000,
|
sendCodec->maxBitrate * 1000,
|
||||||
sendCodec->maxFramerate * 1000,
|
sendCodec->maxFramerate * 1000,
|
||||||
sendCodec->startBitrate * 1000,
|
sendCodec->startBitrate * 1000,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user