mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
Revert "avviddec: Remove usage of deprecated EDGE APIs"
This reverts commit 4284d791bc
.
It causes crashes on various h264 and DNXHD/VC3 streams, where the
decoders write to arbitrary memory far after what we've allocated.
This commit is contained in:
parent
b55c5a2437
commit
5b22802b35
1 changed files with 17 additions and 6 deletions
|
@ -614,6 +614,7 @@ gst_ffmpegvideodec_prepare_dr_pool (GstFFMpegVidDec * ffmpegdec,
|
|||
gint width, height;
|
||||
gint linesize_align[4];
|
||||
gint i;
|
||||
guint edge;
|
||||
gsize max_align;
|
||||
|
||||
width = GST_VIDEO_INFO_WIDTH (info);
|
||||
|
@ -623,10 +624,22 @@ gst_ffmpegvideodec_prepare_dr_pool (GstFFMpegVidDec * ffmpegdec,
|
|||
avcodec_align_dimensions2 (ffmpegdec->context, &width, &height,
|
||||
linesize_align);
|
||||
|
||||
align.padding_top = 0;
|
||||
align.padding_left = 0;
|
||||
align.padding_right = width - GST_VIDEO_INFO_WIDTH (info);
|
||||
align.padding_bottom = height - GST_VIDEO_INFO_HEIGHT (info);
|
||||
if (ffmpegdec->context->flags & CODEC_FLAG_EMU_EDGE)
|
||||
edge = 0;
|
||||
else
|
||||
edge = avcodec_get_edge_width ();
|
||||
|
||||
/* increase the size for the padding */
|
||||
width += edge << 1;
|
||||
height += edge << 1;
|
||||
|
||||
align.padding_top = edge;
|
||||
align.padding_left = edge;
|
||||
align.padding_right = width - GST_VIDEO_INFO_WIDTH (info) - edge;
|
||||
align.padding_bottom = height - GST_VIDEO_INFO_HEIGHT (info) - edge;
|
||||
|
||||
/* add extra padding to match libav buffer allocation sizes */
|
||||
align.padding_bottom++;
|
||||
|
||||
gst_buffer_pool_config_get_allocator (config, &allocator, ¶ms);
|
||||
|
||||
|
@ -2064,7 +2077,6 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
|
|||
gst_buffer_unref (tmp);
|
||||
|
||||
if (same_stride) {
|
||||
GST_DEBUG_OBJECT (ffmpegdec, "Using downstream pool.");
|
||||
if (ffmpegdec->internal_pool)
|
||||
gst_object_unref (ffmpegdec->internal_pool);
|
||||
ffmpegdec->internal_pool = gst_object_ref (pool);
|
||||
|
@ -2079,7 +2091,6 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
|
|||
if (have_videometa && ffmpegdec->internal_pool
|
||||
&& ffmpegdec->pool_width == state->info.width
|
||||
&& ffmpegdec->pool_height == state->info.height) {
|
||||
GST_DEBUG_OBJECT (ffmpegdec, "Pushing from internal pool");
|
||||
update_pool = TRUE;
|
||||
gst_object_unref (pool);
|
||||
pool = gst_object_ref (ffmpegdec->internal_pool);
|
||||
|
|
Loading…
Reference in a new issue