mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
avidemux: fix some buffer ref handling
This commit is contained in:
parent
5b0f7f04e7
commit
7750173244
1 changed files with 31 additions and 5 deletions
|
@ -1500,6 +1500,11 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
|
|
||||||
while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) {
|
while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) {
|
||||||
/* sub can be NULL if the chunk is empty */
|
/* sub can be NULL if the chunk is empty */
|
||||||
|
if (sub == NULL) {
|
||||||
|
GST_DEBUG_OBJECT (avi, "ignoring empty chunk %" GST_FOURCC_FORMAT,
|
||||||
|
GST_FOURCC_ARGS (tag));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case GST_RIFF_TAG_strh:
|
case GST_RIFF_TAG_strh:
|
||||||
{
|
{
|
||||||
|
@ -1510,9 +1515,12 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!gst_riff_parse_strh (element, sub, &stream->strh)) {
|
if (!gst_riff_parse_strh (element, sub, &stream->strh)) {
|
||||||
|
/* ownership given away */
|
||||||
|
sub = NULL;
|
||||||
GST_WARNING_OBJECT (avi, "Failed to parse strh chunk");
|
GST_WARNING_OBJECT (avi, "Failed to parse strh chunk");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
sub = NULL;
|
||||||
strh = stream->strh;
|
strh = stream->strh;
|
||||||
/* sanity check; stream header frame rate matches global header
|
/* sanity check; stream header frame rate matches global header
|
||||||
* frame duration */
|
* frame duration */
|
||||||
|
@ -1559,6 +1567,7 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
stream->is_vbr = TRUE;
|
stream->is_vbr = TRUE;
|
||||||
res = gst_riff_parse_strf_vids (element, sub,
|
res = gst_riff_parse_strf_vids (element, sub,
|
||||||
&stream->strf.vids, &stream->extradata);
|
&stream->strf.vids, &stream->extradata);
|
||||||
|
sub = NULL;
|
||||||
GST_DEBUG_OBJECT (element, "marking video as VBR, res %d", res);
|
GST_DEBUG_OBJECT (element, "marking video as VBR, res %d", res);
|
||||||
break;
|
break;
|
||||||
case GST_RIFF_FCC_auds:
|
case GST_RIFF_FCC_auds:
|
||||||
|
@ -1567,6 +1576,7 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
res =
|
res =
|
||||||
gst_riff_parse_strf_auds (element, sub, &stream->strf.auds,
|
gst_riff_parse_strf_auds (element, sub, &stream->strf.auds,
|
||||||
&stream->extradata);
|
&stream->extradata);
|
||||||
|
sub = NULL;
|
||||||
GST_DEBUG_OBJECT (element, "marking audio as VBR:%d, res %d",
|
GST_DEBUG_OBJECT (element, "marking audio as VBR:%d, res %d",
|
||||||
stream->is_vbr, res);
|
stream->is_vbr, res);
|
||||||
break;
|
break;
|
||||||
|
@ -1574,6 +1584,7 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
stream->is_vbr = TRUE;
|
stream->is_vbr = TRUE;
|
||||||
res = gst_riff_parse_strf_iavs (element, sub,
|
res = gst_riff_parse_strf_iavs (element, sub,
|
||||||
&stream->strf.iavs, &stream->extradata);
|
&stream->strf.iavs, &stream->extradata);
|
||||||
|
sub = NULL;
|
||||||
GST_DEBUG_OBJECT (element, "marking iavs as VBR, res %d", res);
|
GST_DEBUG_OBJECT (element, "marking iavs as VBR, res %d", res);
|
||||||
break;
|
break;
|
||||||
case GST_RIFF_FCC_txts:
|
case GST_RIFF_FCC_txts:
|
||||||
|
@ -1588,6 +1599,10 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
GST_FOURCC_ARGS (stream->strh->type));
|
GST_FOURCC_ARGS (stream->strh->type));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (sub) {
|
||||||
|
gst_buffer_unref (sub);
|
||||||
|
sub = NULL;
|
||||||
|
}
|
||||||
if (!res)
|
if (!res)
|
||||||
goto fail;
|
goto fail;
|
||||||
got_strf = TRUE;
|
got_strf = TRUE;
|
||||||
|
@ -1615,12 +1630,14 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
vprp = NULL;
|
vprp = NULL;
|
||||||
} else
|
} else
|
||||||
got_vprp = TRUE;
|
got_vprp = TRUE;
|
||||||
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_RIFF_TAG_strd:
|
case GST_RIFF_TAG_strd:
|
||||||
if (stream->initdata)
|
if (stream->initdata)
|
||||||
gst_buffer_unref (stream->initdata);
|
gst_buffer_unref (stream->initdata);
|
||||||
stream->initdata = sub;
|
stream->initdata = sub;
|
||||||
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
case GST_RIFF_TAG_strn:
|
case GST_RIFF_TAG_strn:
|
||||||
g_free (stream->name);
|
g_free (stream->name);
|
||||||
|
@ -1642,6 +1659,7 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
g_free (stream->indexes);
|
g_free (stream->indexes);
|
||||||
gst_avi_demux_parse_superindex (avi, sub, &stream->indexes);
|
gst_avi_demux_parse_superindex (avi, sub, &stream->indexes);
|
||||||
stream->superindex = TRUE;
|
stream->superindex = TRUE;
|
||||||
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
GST_WARNING_OBJECT (avi,
|
GST_WARNING_OBJECT (avi,
|
||||||
|
@ -1649,12 +1667,12 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
GST_FOURCC_ARGS (tag));
|
GST_FOURCC_ARGS (tag));
|
||||||
/* fall-through */
|
/* fall-through */
|
||||||
case GST_RIFF_TAG_JUNK:
|
case GST_RIFF_TAG_JUNK:
|
||||||
if (sub != NULL) {
|
|
||||||
gst_buffer_unref (sub);
|
|
||||||
sub = NULL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (sub != NULL) {
|
||||||
|
gst_buffer_unref (sub);
|
||||||
|
sub = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!got_strh) {
|
if (!got_strh) {
|
||||||
|
@ -1809,6 +1827,8 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
g_free (codec_name);
|
g_free (codec_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
|
@ -2961,13 +2981,16 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
|
||||||
switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) {
|
switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) {
|
||||||
case GST_RIFF_LIST_strl:
|
case GST_RIFF_LIST_strl:
|
||||||
if (!(gst_avi_demux_parse_stream (avi, sub))) {
|
if (!(gst_avi_demux_parse_stream (avi, sub))) {
|
||||||
|
sub = NULL;
|
||||||
GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL),
|
GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL),
|
||||||
("failed to parse stream, ignoring"));
|
("failed to parse stream, ignoring"));
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
sub = NULL;
|
||||||
goto next;
|
goto next;
|
||||||
case GST_RIFF_LIST_odml:
|
case GST_RIFF_LIST_odml:
|
||||||
gst_avi_demux_parse_odml (avi, sub);
|
gst_avi_demux_parse_odml (avi, sub);
|
||||||
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
GST_WARNING_OBJECT (avi,
|
GST_WARNING_OBJECT (avi,
|
||||||
|
@ -2987,7 +3010,8 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
|
||||||
case GST_RIFF_TAG_JUNK:
|
case GST_RIFF_TAG_JUNK:
|
||||||
next:
|
next:
|
||||||
/* move to next chunk */
|
/* move to next chunk */
|
||||||
gst_buffer_unref (sub);
|
if (sub)
|
||||||
|
gst_buffer_unref (sub);
|
||||||
sub = NULL;
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3249,9 +3273,11 @@ gst_avi_demux_stream_header_pull (GstAviDemux * avi)
|
||||||
("faile to parse stream, ignoring"));
|
("faile to parse stream, ignoring"));
|
||||||
sub = NULL;
|
sub = NULL;
|
||||||
}
|
}
|
||||||
|
sub = NULL;
|
||||||
goto next;
|
goto next;
|
||||||
case GST_RIFF_LIST_odml:
|
case GST_RIFF_LIST_odml:
|
||||||
gst_avi_demux_parse_odml (avi, sub);
|
gst_avi_demux_parse_odml (avi, sub);
|
||||||
|
sub = NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
GST_WARNING_OBJECT (avi,
|
GST_WARNING_OBJECT (avi,
|
||||||
|
|
Loading…
Reference in a new issue