mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
avidemux: add workaround for buggy list size
Fixes truncated extra-data in hdrl/strl/strf due to buggy containing list size not accounting for padding in contained chunks.
This commit is contained in:
parent
46c91476eb
commit
e09e80eb2f
1 changed files with 24 additions and 0 deletions
|
@ -1869,6 +1869,24 @@ gst_avi_demux_expose_streams (GstAviDemux * avi, gboolean force)
|
|||
}
|
||||
}
|
||||
|
||||
/* buf contains LIST chunk data, and will be padded to even size,
|
||||
* since some buggy files do not account for the padding of chunks
|
||||
* within a LIST in the size of the LIST */
|
||||
static inline void
|
||||
gst_avi_demux_roundup_list (GstAviDemux * avi, GstBuffer ** buf)
|
||||
{
|
||||
if (G_UNLIKELY (GST_BUFFER_SIZE (*buf) & 1)) {
|
||||
GstBuffer *obuf;
|
||||
|
||||
GST_DEBUG_OBJECT (avi, "rounding up dubious list size %d",
|
||||
GST_BUFFER_SIZE (*buf));
|
||||
obuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (*buf) + 1);
|
||||
memcpy (GST_BUFFER_DATA (obuf), GST_BUFFER_DATA (*buf),
|
||||
GST_BUFFER_SIZE (*buf));
|
||||
gst_buffer_replace (buf, obuf);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gst_avi_demux_parse_stream:
|
||||
* @avi: calling element (used for debugging/errors).
|
||||
|
@ -1903,6 +1921,8 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
|||
|
||||
GST_DEBUG_OBJECT (avi, "Parsing stream");
|
||||
|
||||
gst_avi_demux_roundup_list (avi, &buf);
|
||||
|
||||
if (avi->num_streams >= GST_AVI_DEMUX_MAX_STREAMS) {
|
||||
GST_WARNING_OBJECT (avi,
|
||||
"maximum no of streams (%d) exceeded, ignoring stream",
|
||||
|
@ -3140,6 +3160,8 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
|
|||
|
||||
GST_DEBUG ("'hdrl' LIST tag found. Parsing next chunk");
|
||||
|
||||
gst_avi_demux_roundup_list (avi, &buf);
|
||||
|
||||
/* the hdrl starts with a 'avih' header */
|
||||
if (!gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag,
|
||||
&sub))
|
||||
|
@ -3581,6 +3603,8 @@ gst_avi_demux_stream_header_pull (GstAviDemux * avi)
|
|||
|
||||
GST_DEBUG_OBJECT (avi, "hdrl LIST tag found");
|
||||
|
||||
gst_avi_demux_roundup_list (avi, &buf);
|
||||
|
||||
/* the hdrl starts with a 'avih' header */
|
||||
if (!gst_riff_parse_chunk (element, buf, &offset, &tag, &sub))
|
||||
goto no_avih;
|
||||
|
|
Loading…
Reference in a new issue