From f39678b3a99eb8f1503aed9fa26f3ef117d174e7 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 10 Mar 2019 20:33:19 +0100 Subject: [PATCH] avformat/bink: properly mark packets that are key frames --- libavformat/bink.c | 11 ++++++++--- 1 file 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;