diff mbox

[FFmpeg-devel] lavf/mov.c: Correct keyframe search in edit list to return the very first keyframe/frame with matching timestamp. Fixes ticket#5904

Message ID 20170215200755.24048-1-isasi@google.com
State Accepted
Commit 7e538c947547b04267f0b307b0e7d96a84d558e0
Headers show

Commit Message

Sasi Inguva Feb. 15, 2017, 8:07 p.m. UTC
Signed-off-by: Sasi Inguva <isasi@google.com>
---
 libavformat/mov.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Michael Niedermayer Feb. 20, 2017, 4:13 p.m. UTC | #1
On Wed, Feb 15, 2017 at 12:07:55PM -0800, Sasi Inguva wrote:
> Signed-off-by: Sasi Inguva <isasi@google.com>
> ---
>  libavformat/mov.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)

applied

thx

[...]
diff mbox

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index b5181775e7..2a7cbfe142 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2847,11 +2847,23 @@  static int64_t find_prev_closest_index(AVStream *st,
     AVIndexEntry *e_keep = st->index_entries;
     int nb_keep = st->nb_index_entries;
     int64_t found = -1;
+    int64_t i = 0;
 
     st->index_entries = e_old;
     st->nb_index_entries = nb_old;
     found = av_index_search_timestamp(st, timestamp, flag | AVSEEK_FLAG_BACKWARD);
 
+    // Keep going backwards in the index entries until the timestamp is the same.
+    if (found >= 0) {
+        for (i = found; i > 0 && e_old[i].timestamp == e_old[i - 1].timestamp;
+             i--) {
+            if ((flag & AVSEEK_FLAG_ANY) ||
+                (e_old[i - 1].flags & AVINDEX_KEYFRAME)) {
+                found = i - 1;
+            }
+        }
+    }
+
     /* restore AVStream state*/
     st->index_entries = e_keep;
     st->nb_index_entries = nb_keep;