encoder: fix possible memory leak of coded buffer pools.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 10 Jan 2014 10:30:25 +0000 (11:30 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Mon, 13 Jan 2014 16:31:55 +0000 (17:31 +0100)
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
gst-libs/gst/vaapi/gstvaapicodedbufferpool.h
gst-libs/gst/vaapi/gstvaapiencoder.c

index c5a8acd..44b2e3d 100644 (file)
@@ -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;
+}
index 3480d48..0185ee3 100644 (file)
@@ -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 */
index 555eaf0..7d19458 100644 (file)
@@ -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;