videodecoder: parse any source data that is still available.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 20 Jun 2014 16:02:31 +0000 (18:02 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Thu, 3 Jul 2014 07:47:20 +0000 (09:47 +0200)
commitfb44ec9615489f8baa388f658a86991635697697
tree713b369ac14243a7913924b6f71a70be97953c4d
parent9a25e59e121c84e5d79ca17ca5d2268a299334cc
videodecoder: parse any source data that is still available.

Fix gst_video_decoder_parse_available() to really parse any pending
source data that is still available in the adapter. This is a memory
optimization to avoid expansion of video packed added to the adapter,
but also a fix to EOS condition when the subclass parse() function
ultimately only needed to call into gvd_have_frame() and no additional
source bytes were consumed, i.e. gvd_add_to_frame() is not called.

This situation can occur when decoding H.264 streams in byte-stream/nal
mode for instance. A decoder always requires the next NAL unit to be
parsed so that to determine picture boundaries. When a new picture is
found, no byte is consumed (i.e. gvd_add_to_frame() is not called)
but gvd_have_frame() is called (i.e. priv->current_frame is gone).

Also make sure to avoid infinite loops caused by incorrect subclass
parse() implementations. This can occur when no byte gets consumed
and no appropriate indication (GST_VIDEO_DECODER_FLOW_NEED_DATA) is
returned.

https://bugzilla.gnome.org/show_bug.cgi?id=731974

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
gst-libs/gst/video/gstvideodecoder.c