X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fbink.c;h=2488aeae2fef0fc43a035490720562902ec770ca;hb=bc70684e74a185d7b80c8b80bdedda659cb581b8;hp=567a38cd73d6293079b2dc8aa7e5e5d8ef3e818e;hpb=4dc1f06f0c84ebbd8b26cd77679450903244a3e8;p=ffmpeg diff --git a/libavformat/bink.c b/libavformat/bink.c index 567a38cd73d..2488aeae2fe 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -56,10 +56,11 @@ typedef struct BinkDemuxContext { 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"); @@ -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; @@ -150,8 +152,8 @@ static int read_header(AVFormatContext *s) 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); @@ -190,8 +192,8 @@ static int read_header(AVFormatContext *s) 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); } @@ -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; @@ -222,8 +225,8 @@ static int read_header(AVFormatContext *s) 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); @@ -253,7 +256,8 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) 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; } @@ -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; @@ -302,13 +307,15 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in { 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)); @@ -316,7 +323,7 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in return 0; } -AVInputFormat ff_bink_demuxer = { +const AVInputFormat ff_bink_demuxer = { .name = "bink", .long_name = NULL_IF_CONFIG_SMALL("Bink"), .priv_data_size = sizeof(BinkDemuxContext),