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 VP8DecoderImpl::Release() {
int ret_val = WEBRTC_VIDEO_CODEC_OK;
if (decoder_ != NULL) { if (decoder_ != NULL) {
if (vpx_codec_destroy(decoder_)) { if (vpx_codec_destroy(decoder_)) {
return WEBRTC_VIDEO_CODEC_MEMORY; ret_val = WEBRTC_VIDEO_CODEC_MEMORY;
} }
delete decoder_; delete decoder_;
decoder_ = NULL; decoder_ = NULL;
} }
buffer_pool_.Release(); buffer_pool_.Release();
inited_ = false; inited_ = false;
return WEBRTC_VIDEO_CODEC_OK; return ret_val;
} }
const char* VP8DecoderImpl::ImplementationName() const { const char* VP8DecoderImpl::ImplementationName() const {

View File

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