mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
ffdec: ensure buffers have correct interlacedness in caps
Whether a frame is interlaced or not is unknown at the time of buffer allocation, so caps on the buffer in opaque will have a previous frame's interlaced flag set. So if interlacedness changes, we update the buffer (if any) caps with the correct interlaced flag once we know. https://bugzilla.gnome.org/show_bug.cgi?id=656155
This commit is contained in:
parent
8bf3d5a2b7
commit
d4d5e350d0
1 changed files with 22 additions and 0 deletions
|
@ -1809,6 +1809,28 @@ gst_ffmpegdec_video_frame (GstFFMpegDec * ffmpegdec,
|
|||
gst_ffmpegdec_negotiate (ffmpegdec, TRUE);
|
||||
}
|
||||
|
||||
|
||||
/* Whether a frame is interlaced or not is unknown at the time of
|
||||
buffer allocation, so caps on the buffer in opaque will have
|
||||
the previous frame's interlaced flag set. So if interlacedness
|
||||
has changed since allocation, we update the buffer (if any)
|
||||
caps now with the correct interlaced flag. */
|
||||
if (ffmpegdec->picture->opaque != NULL) {
|
||||
GstBuffer *buffer = ffmpegdec->picture->opaque;
|
||||
if (GST_BUFFER_CAPS (buffer) && GST_PAD_CAPS (ffmpegdec->srcpad)) {
|
||||
GstStructure *s = gst_caps_get_structure (GST_BUFFER_CAPS (buffer), 0);
|
||||
gboolean interlaced;
|
||||
gboolean found = gst_structure_get_boolean (s, "interlaced", &interlaced);
|
||||
if (!found || (!!interlaced != !!ffmpegdec->format.video.interlaced)) {
|
||||
GST_DEBUG_OBJECT (ffmpegdec,
|
||||
"Buffer interlacing does not match pad, updating");
|
||||
buffer = gst_buffer_make_metadata_writable (buffer);
|
||||
gst_buffer_set_caps (buffer, GST_PAD_CAPS (ffmpegdec->srcpad));
|
||||
ffmpegdec->picture->opaque = buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* check if we are dealing with a keyframe here, this will also check if we
|
||||
* are dealing with B frames. */
|
||||
iskeyframe = check_keyframe (ffmpegdec);
|
||||
|
|
Loading…
Reference in a new issue