summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-10-09 19:33:21 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-10-09 19:33:21 +0000
commit59e9ed33feafa516f0f65953cd14597ff40166ae (patch)
tree137565ad159e6c7e9ca0479202c10e4ee7d8f377
parent72d5f4625d3d2c00cfbba4221b807fa0316c1591 (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.
-rw-r--r--ChangeLog8
-rw-r--r--gst/avi/gstavidemux.c107
2 files changed, 64 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 182893c3..b6f94dbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * 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.
+
+2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
* gst/playback/gstplaybasebin.c: (setup_source),
(gst_play_base_bin_change_state):
Actually clean up streaminfo if output fails. This would trigger
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++;
+ }
}
}
}