diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-03-10 20:33:19 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-03-20 14:24:34 +0100 |
commit | f39678b3a99eb8f1503aed9fa26f3ef117d174e7 (patch) | |
tree | 00a396a53e0eeff5ec33749be50b216206ab259e | |
parent | 6eae7e564482c70c785ceb33c8ad476c49f24e53 (diff) | |
download | ffmpeg-f39678b3a99eb8f1503aed9fa26f3ef117d174e7.tar.gz |
avformat/bink: properly mark packets that are key frames
-rw-r--r-- | libavformat/bink.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/libavformat/bink.c b/libavformat/bink.c index a1422e3f35..08125ba8f1 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -56,6 +56,7 @@ typedef struct BinkDemuxContext { int64_t audio_pts[BINK_MAX_AUDIO_TRACKS]; uint32_t remain_packet_size; + int flags; int smush_size; } BinkDemuxContext; @@ -90,6 +91,7 @@ static int read_header(AVFormatContext *s) unsigned int i; uint32_t pos, next_pos; uint16_t flags; + int next_keyframe = 1; int keyframe; int ret; uint32_t signature; @@ -203,12 +205,13 @@ static int read_header(AVFormatContext *s) next_pos = avio_rl32(pb); for (i = 0; i < vst->duration; i++) { pos = next_pos; + keyframe = next_keyframe; if (i == vst->duration - 1) { next_pos = bink->file_size; - keyframe = 0; + next_keyframe = 0; } else { next_pos = avio_rl32(pb); - keyframe = pos & 1; + next_keyframe = next_pos & 1; } pos &= ~1; next_pos &= ~1; @@ -254,6 +257,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) } bink->remain_packet_size = st->index_entries[index_entry].size; + bink->flags = st->index_entries[index_entry].flags; bink->current_track = 0; } @@ -290,7 +294,8 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) return ret; pkt->stream_index = 0; pkt->pts = bink->video_pts++; - pkt->flags |= AV_PKT_FLAG_KEY; + if (bink->flags & AVINDEX_KEYFRAME) + pkt->flags |= AV_PKT_FLAG_KEY; /* -1 instructs the next call to read_packet() to read the next frame */ bink->current_track = -1; |