Single exit point in VPx wrapper Release().

This fixes potential memory leak caused by early exit in Release() methods.

Bug: webrtc:8967
Change-Id: I932ec4a451d30b3145a6133a9562e73248a8c203
Reviewed-on: https://webrtc-review.googlesource.com/59380
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22268}
This commit is contained in:
Sergey Silkin
2018-03-02 13:11:04 +01:00
committed by Commit Bot
parent a944732dac
commit 3e871ea047
2 changed files with 12 additions and 6 deletions

View File

@ -1291,16 +1291,18 @@ int VP8DecoderImpl::RegisterDecodeCompleteCallback(
}
int VP8DecoderImpl::Release() {
int ret_val = WEBRTC_VIDEO_CODEC_OK;
if (decoder_ != NULL) {
if (vpx_codec_destroy(decoder_)) {
return WEBRTC_VIDEO_CODEC_MEMORY;
ret_val = WEBRTC_VIDEO_CODEC_MEMORY;
}
delete decoder_;
decoder_ = NULL;
}
buffer_pool_.Release();
inited_ = false;
return WEBRTC_VIDEO_CODEC_OK;
return ret_val;
}
const char* VP8DecoderImpl::ImplementationName() const {

View File

@ -94,13 +94,15 @@ VP9EncoderImpl::~VP9EncoderImpl() {
}
int VP9EncoderImpl::Release() {
int ret_val = WEBRTC_VIDEO_CODEC_OK;
if (encoded_image_._buffer != nullptr) {
delete[] encoded_image_._buffer;
encoded_image_._buffer = nullptr;
}
if (encoder_ != nullptr) {
if (vpx_codec_destroy(encoder_)) {
return WEBRTC_VIDEO_CODEC_MEMORY;
ret_val = WEBRTC_VIDEO_CODEC_MEMORY;
}
delete encoder_;
encoder_ = nullptr;
@ -114,7 +116,7 @@ int VP9EncoderImpl::Release() {
raw_ = nullptr;
}
inited_ = false;
return WEBRTC_VIDEO_CODEC_OK;
return ret_val;
}
bool VP9EncoderImpl::ExplicitlyConfiguredSpatialLayers() const {
@ -1003,11 +1005,13 @@ int VP9DecoderImpl::RegisterDecodeCompleteCallback(
}
int VP9DecoderImpl::Release() {
int ret_val = WEBRTC_VIDEO_CODEC_OK;
if (decoder_ != nullptr) {
// When a codec is destroyed libvpx will release any buffers of
// |frame_buffer_pool_| it is currently using.
if (vpx_codec_destroy(decoder_)) {
return WEBRTC_VIDEO_CODEC_MEMORY;
ret_val = WEBRTC_VIDEO_CODEC_MEMORY;
}
delete decoder_;
decoder_ = nullptr;
@ -1017,7 +1021,7 @@ int VP9DecoderImpl::Release() {
// to the pool.
frame_buffer_pool_.ClearPool();
inited_ = false;
return WEBRTC_VIDEO_CODEC_OK;
return ret_val;
}
const char* VP9DecoderImpl::ImplementationName() const {