diff options
Diffstat (limited to 'gst/avi/gstavidemux.c')
-rw-r--r-- | gst/avi/gstavidemux.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index dd5aae7f..e2a15045 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -3461,11 +3461,14 @@ gst_avi_demux_process_next_entry (GstAviDemux * avi) /* check for reverse playback */ if (avi->segment.rate < 0 && avi->current_entry > avi->reverse_stop_index) { GST_LOG_OBJECT (avi, "stop_index %d reached", avi->reverse_stop_index); + + /* check if we have pushed enough data for this segment */ + if (avi->reverse_start_index == 0) + goto eos_reverse_zero; + if (avi->index_entries[avi->reverse_start_index].ts < avi->segment.start) + goto eos_reverse_segment; + avi->reverse_stop_index = avi->reverse_start_index; - if (avi->reverse_start_index == 0) { - GST_DEBUG_OBJECT (avi, "start_index was 0, sending eos"); - goto eos; - } entry = gst_avi_demux_index_prev (avi, 0, avi->reverse_stop_index, GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME); @@ -3597,6 +3600,18 @@ eos_stop: res = GST_FLOW_UNEXPECTED; goto beach; } +eos_reverse_zero: + { + GST_DEBUG_OBJECT (avi, "start_index was 0, setting EOS"); + res = GST_FLOW_UNEXPECTED; + goto beach; + } +eos_reverse_segment: + { + GST_DEBUG_OBJECT (avi, "full segment pushed, setting EOS"); + res = GST_FLOW_UNEXPECTED; + goto beach; + } pull_failed: { GST_DEBUG_OBJECT (avi, |