diff options
author | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2004-10-09 19:33:21 +0000 |
---|---|---|
committer | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2004-10-09 19:33:21 +0000 |
commit | 59e9ed33feafa516f0f65953cd14597ff40166ae (patch) | |
tree | 137565ad159e6c7e9ca0479202c10e4ee7d8f377 /gst/avi/gstavidemux.c | |
parent | 72d5f4625d3d2c00cfbba4221b807fa0316c1591 (diff) |
gst/avi/gstavidemux.c: OK, so the original code was too strict. It makes random AVI files hang for seconds upon openi...
Original commit message from CVS:
* gst/avi/gstavidemux.c: (gst_avi_demux_massage_index):
OK, so the original code was too strict. It makes random AVI files
hang for seconds upon opening, which is unacceptable and is far
beyond the original goal of getting multiple chunks for one-chunk
sounc stream files. So now do just that.
Diffstat (limited to 'gst/avi/gstavidemux.c')
-rw-r--r-- | gst/avi/gstavidemux.c | 107 |
1 files changed, 56 insertions, 51 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 6ea3c7c9..6367186b 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -1380,65 +1380,70 @@ gst_avi_demux_massage_index (GstAviDemux * avi, GST_LOG ("I'm now going to cut large chunks into smaller pieces"); /* cut chunks in small (seekable) pieces */ - for (one = list; one != NULL; one = one->next) { - entry = one->data; - - if (entry->stream_nr >= avi->num_streams) + for (i = 0; i < avi->num_streams; i++) { + if (avi->stream[i].total_frames != 1) continue; -#define MAX_DURATION (GST_SECOND / 2) + for (one = list; one != NULL; one = one->next) { + entry = one->data; - /* check for max duration of a single buffer. I suppose that - * the allocation of index entries could be improved. */ - stream = &avi->stream[entry->stream_nr]; - if (entry->dur > MAX_DURATION && stream->strh->type == GST_RIFF_FCC_auds) { - guint32 ideal_size = stream->bitrate / 10; - gst_avi_index_entry *entries; - gint old_size, num_added; - GList *one2; - - /* copy index */ - old_size = entry->size; - num_added = (entry->size - 1) / ideal_size; - avi->index_size += num_added; - entries = g_malloc (sizeof (gst_avi_index_entry) * num_added); - alloc_list = g_list_prepend (alloc_list, entries); - for (one2 = one->next; one2 != NULL; one2 = one2->next) { - gst_avi_index_entry *entry2 = one2->data; - - entry2->index_nr += num_added; - if (entry2->stream_nr == entry->stream_nr) - entry2->frames_before += num_added; - } + if (entry->stream_nr != i) + continue; - /* new sized index chunks */ - for (i = 0; i < num_added + 1; i++) { - gst_avi_index_entry *entry2; +#define MAX_DURATION (GST_SECOND / 2) - if (i == 0) { - entry2 = entry; - } else { - entry2 = &entries[i - 1]; - list = g_list_insert_before (list, one->next, entry2); - entry = one->data; - one = one->next; - memcpy (entry2, entry, sizeof (gst_avi_index_entry)); + /* check for max duration of a single buffer. I suppose that + * the allocation of index entries could be improved. */ + stream = &avi->stream[entry->stream_nr]; + if (entry->dur > MAX_DURATION && stream->strh->type == GST_RIFF_FCC_auds) { + guint32 ideal_size = stream->bitrate / 10; + gst_avi_index_entry *entries; + gint old_size, num_added; + GList *one2; + + /* copy index */ + old_size = entry->size; + num_added = (entry->size - 1) / ideal_size; + avi->index_size += num_added; + entries = g_malloc (sizeof (gst_avi_index_entry) * num_added); + alloc_list = g_list_prepend (alloc_list, entries); + for (one2 = one->next; one2 != NULL; one2 = one2->next) { + gst_avi_index_entry *entry2 = one2->data; + + entry2->index_nr += num_added; + if (entry2->stream_nr == entry->stream_nr) + entry2->frames_before += num_added; } - if (old_size >= ideal_size) { - entry2->size = ideal_size; - old_size -= ideal_size; - } else { - entry2->size = old_size; - } + /* new sized index chunks */ + for (i = 0; i < num_added + 1; i++) { + gst_avi_index_entry *entry2; + + if (i == 0) { + entry2 = entry; + } else { + entry2 = &entries[i - 1]; + list = g_list_insert_before (list, one->next, entry2); + entry = one->data; + one = one->next; + memcpy (entry2, entry, sizeof (gst_avi_index_entry)); + } - entry2->dur = GST_SECOND * entry2->size / stream->bitrate; - if (i != 0) { - entry2->index_nr++; - entry2->ts += entry->dur; - entry2->offset += entry->size; - entry2->bytes_before += entry->size; - entry2->frames_before++; + if (old_size >= ideal_size) { + entry2->size = ideal_size; + old_size -= ideal_size; + } else { + entry2->size = old_size; + } + + entry2->dur = GST_SECOND * entry2->size / stream->bitrate; + if (i != 0) { + entry2->index_nr++; + entry2->ts += entry->dur; + entry2->offset += entry->size; + entry2->bytes_before += entry->size; + entry2->frames_before++; + } } } } |