int64_t audio_pts[BINK_MAX_AUDIO_TRACKS];
uint32_t remain_packet_size;
+ int flags;
int smush_size;
} BinkDemuxContext;
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
{
const uint8_t *b = p->buf;
int smush = AV_RN32(p->buf) == AV_RN32("SMUS");
unsigned int i;
uint32_t pos, next_pos;
uint16_t flags;
+ int next_keyframe = 1;
int keyframe;
int ret;
uint32_t signature;
vst->codecpar->codec_id = AV_CODEC_ID_NONE;
}
- if (ff_get_extradata(s, vst->codecpar, pb, 4) < 0)
- return AVERROR(ENOMEM);
+ if ((ret = ff_get_extradata(s, vst->codecpar, pb, 4)) < 0)
+ return ret;
bink->num_audio_tracks = avio_rl32(pb);
ast->codecpar->channels = 1;
ast->codecpar->channel_layout = AV_CH_LAYOUT_MONO;
}
- if (ff_alloc_extradata(ast->codecpar, 4))
- return AVERROR(ENOMEM);
+ if ((ret = ff_alloc_extradata(ast->codecpar, 4)) < 0)
+ return ret;
AV_WL32(ast->codecpar->extradata, vst->codecpar->codec_tag);
}
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;
return ret;
}
- if (vst->index_entries)
- avio_seek(pb, vst->index_entries[0].pos + bink->smush_size, SEEK_SET);
+ if (vst->internal->index_entries)
+ avio_seek(pb, vst->internal->index_entries[0].pos + bink->smush_size, SEEK_SET);
else
avio_skip(pb, 4);
return AVERROR(EIO);
}
- bink->remain_packet_size = st->index_entries[index_entry].size;
+ bink->remain_packet_size = st->internal->index_entries[index_entry].size;
+ bink->flags = st->internal->index_entries[index_entry].flags;
bink->current_track = 0;
}
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;
{
BinkDemuxContext *bink = s->priv_data;
AVStream *vst = s->streams[0];
+ int64_t ret;
if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
return -1;
/* seek to the first frame */
- if (avio_seek(s->pb, vst->index_entries[0].pos + bink->smush_size, SEEK_SET) < 0)
- return -1;
+ ret = avio_seek(s->pb, vst->internal->index_entries[0].pos + bink->smush_size, SEEK_SET);
+ if (ret < 0)
+ return ret;
bink->video_pts = 0;
memset(bink->audio_pts, 0, sizeof(bink->audio_pts));