movdec: Adjust keyframe flagging in fragmented files
For video, mark the first sample in a trun which doesn't have the sample-is-non-sync-sample flag set as a keyframe. In particular, the "sample does not depend on other samples" flag isn't enough to make it a keyframe, since later frames still can reference frames prior to that one (the flag only says that that particular frame doesn't depend on other frames). This fixes bug 215. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
3ab9a2a557
commit
a5c50913a8
@ -2218,7 +2218,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
int64_t dts;
|
int64_t dts;
|
||||||
int data_offset = 0;
|
int data_offset = 0;
|
||||||
unsigned entries, first_sample_flags = frag->flags;
|
unsigned entries, first_sample_flags = frag->flags;
|
||||||
int flags, distance, i;
|
int flags, distance, i, found_keyframe = 0;
|
||||||
|
|
||||||
for (i = 0; i < c->fc->nb_streams; i++) {
|
for (i = 0; i < c->fc->nb_streams; i++) {
|
||||||
if (c->fc->streams[i]->id == frag->track_id) {
|
if (c->fc->streams[i]->id == frag->track_id) {
|
||||||
@ -2272,7 +2272,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
unsigned sample_size = frag->size;
|
unsigned sample_size = frag->size;
|
||||||
int sample_flags = i ? frag->flags : first_sample_flags;
|
int sample_flags = i ? frag->flags : first_sample_flags;
|
||||||
unsigned sample_duration = frag->duration;
|
unsigned sample_duration = frag->duration;
|
||||||
int keyframe;
|
int keyframe = 0;
|
||||||
|
|
||||||
if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);
|
if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);
|
||||||
if (flags & MOV_TRUN_SAMPLE_SIZE) sample_size = avio_rb32(pb);
|
if (flags & MOV_TRUN_SAMPLE_SIZE) sample_size = avio_rb32(pb);
|
||||||
@ -2281,8 +2281,13 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
|
sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
|
||||||
avio_rb32(pb) : 0;
|
avio_rb32(pb) : 0;
|
||||||
sc->ctts_count++;
|
sc->ctts_count++;
|
||||||
if ((keyframe = st->codec->codec_type == AVMEDIA_TYPE_AUDIO ||
|
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||||
(flags & MOV_TRUN_FIRST_SAMPLE_FLAGS && !i && !(sample_flags & ~MOV_FRAG_SAMPLE_FLAG_DEGRADATION_PRIORITY_MASK)) || sample_flags & MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO))
|
keyframe = 1;
|
||||||
|
else if (!found_keyframe)
|
||||||
|
keyframe = found_keyframe =
|
||||||
|
!(sample_flags & (MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC |
|
||||||
|
MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
|
||||||
|
if (keyframe)
|
||||||
distance = 0;
|
distance = 0;
|
||||||
av_add_index_entry(st, offset, dts, sample_size, distance,
|
av_add_index_entry(st, offset, dts, sample_size, distance,
|
||||||
keyframe ? AVINDEX_KEYFRAME : 0);
|
keyframe ? AVINDEX_KEYFRAME : 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user