aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2019-03-10 20:33:19 +0100
committerPaul B Mahol <onemda@gmail.com>2020-03-20 14:24:34 +0100
commitf39678b3a99eb8f1503aed9fa26f3ef117d174e7 (patch)
tree00a396a53e0eeff5ec33749be50b216206ab259e
parent6eae7e564482c70c785ceb33c8ad476c49f24e53 (diff)
downloadffmpeg-f39678b3a99eb8f1503aed9fa26f3ef117d174e7.tar.gz
avformat/bink: properly mark packets that are key frames
-rw-r--r--libavformat/bink.c11
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;