while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) {
/* 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) {
case GST_RIFF_TAG_strh:
{
break;
}
if (!gst_riff_parse_strh (element, sub, &stream->strh)) {
+ /* ownership given away */
+ sub = NULL;
GST_WARNING_OBJECT (avi, "Failed to parse strh chunk");
goto fail;
}
+ sub = NULL;
strh = stream->strh;
/* sanity check; stream header frame rate matches global header
* frame duration */
stream->is_vbr = TRUE;
res = gst_riff_parse_strf_vids (element, sub,
&stream->strf.vids, &stream->extradata);
+ sub = NULL;
GST_DEBUG_OBJECT (element, "marking video as VBR, res %d", res);
break;
case GST_RIFF_FCC_auds:
res =
gst_riff_parse_strf_auds (element, sub, &stream->strf.auds,
&stream->extradata);
+ sub = NULL;
GST_DEBUG_OBJECT (element, "marking audio as VBR:%d, res %d",
stream->is_vbr, res);
break;
stream->is_vbr = TRUE;
res = gst_riff_parse_strf_iavs (element, sub,
&stream->strf.iavs, &stream->extradata);
+ sub = NULL;
GST_DEBUG_OBJECT (element, "marking iavs as VBR, res %d", res);
break;
case GST_RIFF_FCC_txts:
GST_FOURCC_ARGS (stream->strh->type));
break;
}
+ if (sub) {
+ gst_buffer_unref (sub);
+ sub = NULL;
+ }
if (!res)
goto fail;
got_strf = TRUE;
vprp = NULL;
} else
got_vprp = TRUE;
+ sub = NULL;
break;
}
case GST_RIFF_TAG_strd:
if (stream->initdata)
gst_buffer_unref (stream->initdata);
stream->initdata = sub;
+ sub = NULL;
break;
case GST_RIFF_TAG_strn:
g_free (stream->name);
g_free (stream->indexes);
gst_avi_demux_parse_superindex (avi, sub, &stream->indexes);
stream->superindex = TRUE;
+ sub = NULL;
break;
}
GST_WARNING_OBJECT (avi,
GST_FOURCC_ARGS (tag));
/* fall-through */
case GST_RIFF_TAG_JUNK:
- if (sub != NULL) {
- gst_buffer_unref (sub);
- sub = NULL;
- }
break;
}
+ if (sub != NULL) {
+ gst_buffer_unref (sub);
+ sub = NULL;
+ }
}
if (!got_strh) {
g_free (codec_name);
}
+ gst_buffer_unref (buf);
+
return TRUE;
/* ERRORS */
switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) {
case GST_RIFF_LIST_strl:
if (!(gst_avi_demux_parse_stream (avi, sub))) {
+ sub = NULL;
GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL),
("failed to parse stream, ignoring"));
goto next;
}
+ sub = NULL;
goto next;
case GST_RIFF_LIST_odml:
gst_avi_demux_parse_odml (avi, sub);
+ sub = NULL;
break;
default:
GST_WARNING_OBJECT (avi,
case GST_RIFF_TAG_JUNK:
next:
/* move to next chunk */
- gst_buffer_unref (sub);
+ if (sub)
+ gst_buffer_unref (sub);
sub = NULL;
break;
}
("faile to parse stream, ignoring"));
sub = NULL;
}
+ sub = NULL;
goto next;
case GST_RIFF_LIST_odml:
gst_avi_demux_parse_odml (avi, sub);
+ sub = NULL;
break;
default:
GST_WARNING_OBJECT (avi,