summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2015-09-02 13:05:45 +0300
committerMartin Storsjö <martin@martin.st>2015-09-06 21:24:37 +0300
commit7cad1bf0759ada2a1fc3e80bb232a5377dd4fda4 (patch)
tree80659913815f5c6cb355f52cc2564fe1171b0765 /libavformat/mov.c
parentd0f7e4a57fbffa0efb204d4274c3dd56fbfff946 (diff)
mov: Allow more than one keyframe per trun
The previous restriction was partially designed to fix certain (broken) samples from bug 215. There should be no restriction on the number of keyframes per fragment or trun. The spec suggests that all frames lacking MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC are key frames, but we require the flag MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES to be unset as well. This works for (possibly broken) media that never sets the NON_SYNC flag and should also be correct for any spec-compliant file. For files that never set either of the flags, all samples are marked as keyframes. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 8bf1b90c97..bb99f759c7 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2836,7 +2836,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t dts;
int data_offset = 0;
unsigned entries, first_sample_flags = frag->flags;
- int flags, distance, i, found_keyframe = 0, err;
+ int flags, distance, i, err;
for (i = 0; i < c->fc->nb_streams; i++) {
if (c->fc->streams[i]->id == frag->track_id) {
@@ -2900,8 +2900,8 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc->ctts_count++;
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
keyframe = 1;
- else if (!found_keyframe)
- keyframe = found_keyframe =
+ else
+ keyframe =
!(sample_flags & (MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC |
MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
if (keyframe)