qtdemux: Refactor trun parsing

The allocation of the samples can be placed out of the loop.
Makes the code clearer.

Also avoid relying on traf information as it is placed on the
end of the file and might not be acessible on push mode.
This commit is contained in:
Thiago Santos 2010-09-10 21:32:26 -03:00 committed by Mark Nauwelaerts
parent 400f22bfe3
commit f48817522d

View file

@ -1854,7 +1854,7 @@ extract_initial_length_and_fourcc (const guint8 * data, guint64 * plength,
static gboolean static gboolean
qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun,
QtDemuxStream * stream, guint32 mdat_offset, guint64 start_time, QtDemuxStream * stream, guint32 mdat_offset,
guint32 d_sample_duration, guint32 d_sample_size, guint32 * samples_count) guint32 d_sample_duration, guint32 d_sample_size, guint32 * samples_count)
{ {
guint64 timestamp; guint64 timestamp;
@ -1909,11 +1909,9 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun,
QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample))
goto index_too_big; goto index_too_big;
for (i = 0; i < *samples_count; i++) {
if (i == 0) {
GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u (%u MB)", GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u (%u MB)",
stream->n_samples, stream->n_samples, (stream->n_samples * sizeof (QtDemuxSample)) >> 20);
(stream->n_samples * sizeof (QtDemuxSample)) >> 20);
/* create a new array of samples if it's the first sample parsed */ /* create a new array of samples if it's the first sample parsed */
if (stream->n_samples == 0) if (stream->n_samples == 0)
stream->samples = g_try_new0 (QtDemuxSample, *samples_count); stream->samples = g_try_new0 (QtDemuxSample, *samples_count);
@ -1923,8 +1921,12 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun,
stream->n_samples + *samples_count); stream->n_samples + *samples_count);
if (stream->samples == NULL) if (stream->samples == NULL)
goto out_of_memory; goto out_of_memory;
/* the timestamp of the first sample is provided by the tfra entry */
timestamp = start_time; for (i = 0; i < *samples_count; i++) {
if (G_UNLIKELY (stream->n_samples == 0)) {
/* the timestamp of the first sample is also provided by the tfra entry
* but we shouldn't rely on it as it is at the end of files */
timestamp = 0;
} else { } else {
/* a track run documents a contiguous set of samples */ /* a track run documents a contiguous set of samples */
timestamp = timestamp =
@ -2010,7 +2012,7 @@ invalid_track:
static gboolean static gboolean
qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length, qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
guint32 moof_offset, QtDemuxStream * stream, guint64 start_time) guint32 moof_offset, QtDemuxStream * stream)
{ {
GNode *moof_node, *traf_node, *tfhd_node, *trun_node; GNode *moof_node, *traf_node, *tfhd_node, *trun_node;
GstByteReader trun_data, tfhd_data; GstByteReader trun_data, tfhd_data;
@ -2042,7 +2044,7 @@ qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_trun, qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_trun,
&trun_data); &trun_data);
while (trun_node) { while (trun_node) {
qtdemux_parse_trun (qtdemux, &trun_data, stream, mdat_offset, start_time, qtdemux_parse_trun (qtdemux, &trun_data, stream, mdat_offset,
default_sample_duration, default_sample_size, &samples_count); default_sample_duration, default_sample_size, &samples_count);
/* iterate all siblings */ /* iterate all siblings */
trun_node = qtdemux_tree_get_sibling_by_type (trun_node, FOURCC_trun); trun_node = qtdemux_tree_get_sibling_by_type (trun_node, FOURCC_trun);
@ -2117,7 +2119,7 @@ qtdemux_parse_tfra (GstQTDemux * qtdemux, GNode * tfra_node,
if (ret != GST_FLOW_OK) if (ret != GST_FLOW_OK)
goto corrupt_file; goto corrupt_file;
qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf),
moof_offset, stream, time); moof_offset, stream);
gst_buffer_unref (buf); gst_buffer_unref (buf);
} }