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.
This commit is contained in:
Sebastian Dröge 2015-10-16 18:52:57 +03:00
parent 5d52dcf5ef
commit dc4b9ef7e6

View file

@ -1835,10 +1835,13 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
/* If we have videometa, we never have to copy */ /* If we have videometa, we never have to copy */
if (have_videometa && have_pool && have_alignment && if (have_videometa && have_pool && have_alignment &&
gst_ffmpegviddec_can_direct_render (ffmpegdec)) { 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 */ /* 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; GstFlowReturn ret;
GstBuffer *tmp; GstBuffer *tmp;
@ -1863,6 +1866,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
gst_object_unref (ffmpegdec->internal_pool); gst_object_unref (ffmpegdec->internal_pool);
ffmpegdec->internal_pool = gst_object_ref (pool); ffmpegdec->internal_pool = gst_object_ref (pool);
ffmpegdec->pool_info = state->info; ffmpegdec->pool_info = state->info;
gst_structure_free (config);
goto done; goto done;
} }
} }
@ -1873,6 +1877,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
update_pool = TRUE; update_pool = TRUE;
gst_object_unref (pool); gst_object_unref (pool);
pool = gst_object_ref (ffmpegdec->internal_pool); pool = gst_object_ref (ffmpegdec->internal_pool);
gst_structure_free (config);
goto done; goto done;
} }