summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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++;
+ }
}
}
}