diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-10-16 18:52:57 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-10-16 18:55:56 +0300 |
commit | bf5a041b86b19dfefb36471b2c54640ddadeacde (patch) | |
tree | fca0820123ffcc750ddd9ea6898a001308c7d9a5 | |
parent | 7ba58ea5be0484324f7fdee640c07201b2b8e218 (diff) | |
download | gst-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.c | 9 |
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; } |