From accea4d9d8ef4a51a02653568118eb2862bf79cc Mon Sep 17 00:00:00 2001
From: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
Date: Fri, 13 Apr 2012 18:59:14 +0900
Subject: [PATCH] mov: Fix detecting there is no sync sample.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Stss atom without entries doesn't mean every sample is a sync sample.

Signed-off-by: Martin Storsjö <martin@martin.st>
---
 libavformat/isom.h | 1 +
 libavformat/mov.c  | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavformat/isom.h b/libavformat/isom.h
index 214af589a54..f716d9323fe 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -106,6 +106,7 @@ typedef struct MOVStreamContext {
     unsigned int sample_size;
     unsigned int sample_count;
     int *sample_sizes;
+    int keyframe_absent;
     unsigned int keyframe_count;
     int *keyframes;
     int time_scale;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 1492486dcc8..046c030bcfd 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1534,7 +1534,10 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     av_dlog(c->fc, "keyframe_count = %d\n", entries);
 
     if (!entries)
+    {
+        sc->keyframe_absent = 1;
         return 0;
+    }
     if (entries >= UINT_MAX / sizeof(int))
         return AVERROR_INVALIDDATA;
     sc->keyframes = av_malloc(entries * sizeof(int));
@@ -1776,7 +1779,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
                     return;
                 }
 
-                if (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index]) {
+                if (!sc->keyframe_absent && (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index])) {
                     keyframe = 1;
                     if (stss_index + 1 < sc->keyframe_count)
                         stss_index++;
-- 
GitLab