summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-10-16 18:52:57 +0300
committerSebastian Dröge <sebastian@centricular.com>2015-10-16 18:55:56 +0300
commitbf5a041b86b19dfefb36471b2c54640ddadeacde (patch)
treefca0820123ffcc750ddd9ea6898a001308c7d9a5
parent7ba58ea5be0484324f7fdee640c07201b2b8e218 (diff)
downloadgst-libav-bf5a041b86b19dfefb36471b2c54640ddadeacde.tar.gz
avviddec: Fix bufferpool config double free by taking a copy as needed
Also free the config in two code paths where we leaked it before.
-rw-r--r--ext/libav/gstavviddec.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
index f139aee..027515e 100644
--- a/ext/libav/gstavviddec.c
+++ b/ext/libav/gstavviddec.c
@@ -1835,10 +1835,13 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
/* If we have videometa, we never have to copy */
if (have_videometa && have_pool && have_alignment &&
gst_ffmpegviddec_can_direct_render (ffmpegdec)) {
- gst_ffmpegvideodec_prepare_dr_pool (ffmpegdec, pool, &state->info, config);
+ GstStructure *config_copy = gst_structure_copy (config);
+
+ gst_ffmpegvideodec_prepare_dr_pool (ffmpegdec, pool, &state->info,
+ config_copy);
/* FIXME validate and retry */
- if (gst_buffer_pool_set_config (pool, config)) {
+ if (gst_buffer_pool_set_config (pool, gst_structure_copy (config_copy))) {
GstFlowReturn ret;
GstBuffer *tmp;
@@ -1863,6 +1866,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
gst_object_unref (ffmpegdec->internal_pool);
ffmpegdec->internal_pool = gst_object_ref (pool);
ffmpegdec->pool_info = state->info;
+ gst_structure_free (config);
goto done;
}
}
@@ -1873,6 +1877,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
update_pool = TRUE;
gst_object_unref (pool);
pool = gst_object_ref (ffmpegdec->internal_pool);
+ gst_structure_free (config);
goto done;
}