Commit f39678b3 authored by Paul B Mahol's avatar Paul B Mahol

avformat/bink: properly mark packets that are key frames

parent 6eae7e56
...@@ -56,6 +56,7 @@ typedef struct BinkDemuxContext { ...@@ -56,6 +56,7 @@ typedef struct BinkDemuxContext {
int64_t audio_pts[BINK_MAX_AUDIO_TRACKS]; int64_t audio_pts[BINK_MAX_AUDIO_TRACKS];
uint32_t remain_packet_size; uint32_t remain_packet_size;
int flags;
int smush_size; int smush_size;
} BinkDemuxContext; } BinkDemuxContext;
...@@ -90,6 +91,7 @@ static int read_header(AVFormatContext *s) ...@@ -90,6 +91,7 @@ static int read_header(AVFormatContext *s)
unsigned int i; unsigned int i;
uint32_t pos, next_pos; uint32_t pos, next_pos;
uint16_t flags; uint16_t flags;
int next_keyframe = 1;
int keyframe; int keyframe;
int ret; int ret;
uint32_t signature; uint32_t signature;
...@@ -203,12 +205,13 @@ static int read_header(AVFormatContext *s) ...@@ -203,12 +205,13 @@ static int read_header(AVFormatContext *s)
next_pos = avio_rl32(pb); next_pos = avio_rl32(pb);
for (i = 0; i < vst->duration; i++) { for (i = 0; i < vst->duration; i++) {
pos = next_pos; pos = next_pos;
keyframe = next_keyframe;
if (i == vst->duration - 1) { if (i == vst->duration - 1) {
next_pos = bink->file_size; next_pos = bink->file_size;
keyframe = 0; next_keyframe = 0;
} else { } else {
next_pos = avio_rl32(pb); next_pos = avio_rl32(pb);
keyframe = pos & 1; next_keyframe = next_pos & 1;
} }
pos &= ~1; pos &= ~1;
next_pos &= ~1; next_pos &= ~1;
...@@ -254,6 +257,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -254,6 +257,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
} }
bink->remain_packet_size = st->index_entries[index_entry].size; bink->remain_packet_size = st->index_entries[index_entry].size;
bink->flags = st->index_entries[index_entry].flags;
bink->current_track = 0; bink->current_track = 0;
} }
...@@ -290,7 +294,8 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -290,7 +294,8 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
return ret; return ret;
pkt->stream_index = 0; pkt->stream_index = 0;
pkt->pts = bink->video_pts++; 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 */ /* -1 instructs the next call to read_packet() to read the next frame */
bink->current_track = -1; bink->current_track = -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment