summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/ffmpeg/A05-avi-seek.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A05-avi-seek.patch b/contrib/ffmpeg/A05-avi-seek.patch
new file mode 100644
index 000000000..a1dec93ca
--- /dev/null
+++ b/contrib/ffmpeg/A05-avi-seek.patch
@@ -0,0 +1,45 @@
+Index: libavformat/avidec.c
+===================================================================
+--- ffmpeg.orig/libavformat/avidec.c (revision 22950)
++++ ffmpeg/libavformat/avidec.c (working copy)
+@@ -1072,7 +1072,7 @@
+ AVIContext *avi = s->priv_data;
+ AVStream *st;
+ int i, index;
+- int64_t pos;
++ int64_t pos, min_pos;
+ AVIStream *ast;
+
+ if (!avi->index_loaded) {
+@@ -1109,6 +1109,7 @@
+ return 0;
+ }
+
++ min_pos = pos;
+ for(i = 0; i < s->nb_streams; i++) {
+ AVStream *st2 = s->streams[i];
+ AVIStream *ast2 = st2->priv_data;
+@@ -1129,10 +1130,12 @@
+ index=0;
+
+ if(!avi->non_interleaved){
++ while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
++ index++;
+ while(index>0 && st2->index_entries[index].pos > pos)
+ index--;
+- while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
+- index++;
++ if (st2->index_entries[index].pos < min_pos)
++ min_pos = st2->index_entries[index].pos;
+ }
+
+ // av_log(s, AV_LOG_DEBUG, "%"PRId64" %d %"PRId64"\n", timestamp, index, st2->index_entries[index].timestamp);
+@@ -1141,7 +1144,7 @@
+ }
+
+ /* do the seek */
+- url_fseek(s->pb, pos, SEEK_SET);
++ url_fseek(s->pb, min_pos, SEEK_SET);
+ avi->stream_index= -1;
+ return 0;
+ }