avidemux: fix some buffer ref handling

This commit is contained in:
Mark Nauwelaerts 2009-08-04 11:39:39 +02:00
parent 5b0f7f04e7
commit 7750173244

View file

@ -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,