From 20ab910d15b4d748ed747ebbdedfbfa2d5f9bf9f Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 10 Jan 2014 11:30:25 +0100 Subject: [PATCH] encoder: fix possible memory leak of coded buffer pools. Fix gst_vaapi_encoder_reconfigure_internal() to re-/allocate the coded buffer pool only if the coded buffer size actually changed. --- gst-libs/gst/vaapi/gstvaapicodedbufferpool.c | 17 ++++++++++++++++ gst-libs/gst/vaapi/gstvaapicodedbufferpool.h | 3 +++ gst-libs/gst/vaapi/gstvaapiencoder.c | 21 +++++++++++++------- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c index c5a8acdefc..44b2e3d7b6 100644 --- a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c +++ b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c @@ -111,3 +111,20 @@ gst_vaapi_coded_buffer_pool_new (GstVaapiEncoder * encoder, gsize buf_size) context, buf_size); return pool; } + +/** + * gst_vaapi_coded_buffer_pool_get_buffer_size: + * @pool: a #GstVaapiCodedBufferPool + * + * Determines the maximum size of each #GstVaapiCodedBuffer held in + * the @pool. + * + * Return value: size of a #GstVaapiCodedBuffer in @pool + */ +gsize +gst_vaapi_coded_buffer_pool_get_buffer_size (GstVaapiCodedBufferPool * pool) +{ + g_return_val_if_fail (pool != NULL, 0); + + return pool->buf_size; +} diff --git a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.h b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.h index 3480d48677..0185ee3806 100644 --- a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.h +++ b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.h @@ -37,6 +37,9 @@ GstVaapiVideoPool * gst_vaapi_coded_buffer_pool_new (struct _GstVaapiEncoder * encoder, gsize buf_size); +gsize +gst_vaapi_coded_buffer_pool_get_buffer_size (GstVaapiCodedBufferPool * pool); + G_END_DECLS #endif /* GST_VAAPI_CODED_BUFFER_POOL_H */ diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c index 555eaf0b03..7d194580ac 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder.c @@ -481,6 +481,8 @@ gst_vaapi_encoder_reconfigure_internal (GstVaapiEncoder * encoder) { GstVaapiEncoderClass *const klass = GST_VAAPI_ENCODER_GET_CLASS (encoder); GstVaapiEncoderStatus status; + GstVaapiVideoPool *pool; + guint codedbuf_size; status = klass->reconfigure (encoder); if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS) @@ -489,16 +491,21 @@ gst_vaapi_encoder_reconfigure_internal (GstVaapiEncoder * encoder) if (!gst_vaapi_encoder_ensure_context (encoder)) goto error_reset_context; - encoder->codedbuf_pool = gst_vaapi_coded_buffer_pool_new (encoder, - encoder->codedbuf_size); - if (!encoder->codedbuf_pool) - goto error_codedbuf_pool_allocation_failed; - - gst_vaapi_video_pool_set_capacity (encoder->codedbuf_pool, 5); + codedbuf_size = encoder->codedbuf_pool ? + gst_vaapi_coded_buffer_pool_get_buffer_size (GST_VAAPI_CODED_BUFFER_POOL + (encoder)) : 0; + if (codedbuf_size != encoder->codedbuf_size) { + pool = gst_vaapi_coded_buffer_pool_new (encoder, encoder->codedbuf_size); + if (!pool) + goto error_alloc_codedbuf_pool; + gst_vaapi_video_pool_set_capacity (pool, 5); + gst_vaapi_video_pool_replace (&encoder->codedbuf_pool, pool); + gst_vaapi_video_pool_unref (pool); + } return GST_VAAPI_ENCODER_STATUS_SUCCESS; /* ERRORS */ -error_codedbuf_pool_allocation_failed: +error_alloc_codedbuf_pool: { GST_ERROR ("failed to initialize coded buffer pool"); return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED;