mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-16 13:04:18 +00:00
avviddec: Make sure to use a buffer pool with the correct width/height configured on it for pushing buffers downstream
If downstream does not provide a (usable) pool, we would use our internal pool. But the internal pool might be configured with a different width/height because of padding, which then will cause problems if we push buffers from it directly downstream. Instead create a new pool if the width/height is different. This prevents crashes with vaapisink and d3dvideosink for example. Based on the debugging results and discussions with Nicolas Dufresne <nicolas.dufresne@collabora.com> https://bugzilla.gnome.org/show_bug.cgi?id=758344
This commit is contained in:
parent
839a72f92c
commit
5df8cc5e38
1 changed files with 13 additions and 1 deletions
|
@ -1416,6 +1416,16 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec,
|
|||
*ret = get_output_buffer (ffmpegdec, out_frame);
|
||||
gst_buffer_unref (tmp);
|
||||
}
|
||||
#ifndef G_DISABLE_ASSERT
|
||||
else {
|
||||
GstVideoMeta *vmeta = gst_buffer_get_video_meta (out_frame->output_buffer);
|
||||
if (vmeta) {
|
||||
GstVideoInfo *info = &ffmpegdec->output_state->info;
|
||||
g_assert (vmeta->width == GST_VIDEO_INFO_WIDTH (info));
|
||||
g_assert (vmeta->height == GST_VIDEO_INFO_HEIGHT (info));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
gst_object_unref (pool);
|
||||
|
||||
if (G_UNLIKELY (*ret != GST_FLOW_OK))
|
||||
|
@ -1886,7 +1896,9 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
|
|||
}
|
||||
}
|
||||
|
||||
if (have_videometa && ffmpegdec->internal_pool) {
|
||||
if (have_videometa && ffmpegdec->internal_pool
|
||||
&& ffmpegdec->pool_width == state->info.width
|
||||
&& ffmpegdec->pool_height == state->info.height) {
|
||||
update_pool = TRUE;
|
||||
gst_object_unref (pool);
|
||||
pool = gst_object_ref (ffmpegdec->internal_pool);
|
||||
|
|
Loading…
Reference in a new issue