summaryrefslogtreecommitdiffstats
path: root/gst/avi
diff options
context:
space:
mode:
authorThijs Vermeir <thijsvermeir@gmail.com>2008-06-04 18:03:24 +0000
committerThijs Vermeir <thijsvermeir@gmail.com>2008-06-04 18:03:24 +0000
commitb950285ac7cd434c3a6f1623a8e73530f299e5f9 (patch)
tree2f925d33b782f3bb7617c4ff08bee1e39744ae43 /gst/avi
parent22940c001029de2f55d8b70365bf5eb9c2c368dd (diff)
gst/avi/gstavidemux.c: Because we don't know the frame order we need to push till the next keyframe
Original commit message from CVS: * gst/avi/gstavidemux.c: Because we don't know the frame order we need to push till the next keyframe
Diffstat (limited to 'gst/avi')
-rw-r--r--gst/avi/gstavidemux.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index e2a15045..77c9eba7 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -287,7 +287,6 @@ gst_avi_demux_index_last (GstAviDemux * avi, gint stream_nr)
return result;
}
-#if 0
static gst_avi_index_entry *
gst_avi_demux_index_next (GstAviDemux * avi, gint stream_nr, gint last,
guchar flags)
@@ -308,7 +307,6 @@ gst_avi_demux_index_next (GstAviDemux * avi, gint stream_nr, gint last,
}
return result;
}
-#endif
static gst_avi_index_entry *
gst_avi_demux_index_prev (GstAviDemux * avi, gint stream_nr, gint last,
@@ -3154,9 +3152,21 @@ gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment)
avi->current_entry = kentry->index_nr;
if (segment->rate < 0.0) {
- /* play between the keyframe and the destination entry */
+ gst_avi_index_entry *next_keyframe;
+
+ /* Because we don't know the frame order we need to push from the prev keyframe
+ * to the next keyframe. If there is a smart decoder downstream he will notice
+ * that there are too many decoded frames send and return UNEXPECTED when there
+ * are enough decoded frames to fill the segment.
+ */
+ next_keyframe =
+ gst_avi_demux_index_next (avi, 0, kentry->index_nr,
+ GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
+ if (!next_keyframe)
+ next_keyframe = gst_avi_demux_index_last (avi, 0);
+
avi->reverse_start_index = kentry->index_nr;
- avi->reverse_stop_index = entry->index_nr;
+ avi->reverse_stop_index = next_keyframe->index_nr;
GST_DEBUG_OBJECT (avi, "reverse seek: start idx (%d) and stop idx (%d)",
avi->reverse_start_index, avi->reverse_stop_index);