From 9c9cf3956cd630035ea5b76c3f4fa6a82916e6ef Mon Sep 17 00:00:00 2001 From: Rodger Combs Date: Sat, 20 Jun 2015 05:01:21 -0500 Subject: lavf/brstm: add support for seeking --- libavformat/brstm.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libavformat/brstm.c') diff --git a/libavformat/brstm.c b/libavformat/brstm.c index e3c6142511..0014b48b31 100644 --- a/libavformat/brstm.c +++ b/libavformat/brstm.c @@ -32,6 +32,7 @@ typedef struct BRSTMDemuxContext { uint32_t last_block_used_bytes; uint32_t last_block_size; uint32_t last_block_samples; + uint32_t data_start; uint8_t *table; uint8_t *adpc; int little_endian; @@ -312,6 +313,8 @@ static int read_header(AVFormatContext *s) codec == AV_CODEC_ID_ADPCM_THP_LE)) avio_skip(s->pb, 24); + b->data_start = avio_tell(s->pb); + if ((major != 1 || minor) && !bfstm) avpriv_request_sample(s, "Version %d.%d", major, minor); @@ -391,6 +394,24 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) return ret; } +static int read_seek(AVFormatContext *s, int stream_index, + int64_t timestamp, int flags) +{ + AVStream *st = s->streams[stream_index]; + BRSTMDemuxContext *b = s->priv_data; + int64_t ret = 0; + + timestamp /= b->samples_per_block; + ret = avio_seek(s->pb, b->data_start + timestamp * b->block_size * + st->codec->channels, SEEK_SET); + if (ret < 0) + return ret; + + b->current_block = timestamp; + ff_update_cur_dts(s, st, timestamp * b->samples_per_block); + return 0; +} + AVInputFormat ff_brstm_demuxer = { .name = "brstm", .long_name = NULL_IF_CONFIG_SMALL("BRSTM (Binary Revolution Stream)"), @@ -399,6 +420,7 @@ AVInputFormat ff_brstm_demuxer = { .read_header = read_header, .read_packet = read_packet, .read_close = read_close, + .read_seek = read_seek, .extensions = "brstm", }; @@ -410,5 +432,6 @@ AVInputFormat ff_bfstm_demuxer = { .read_header = read_header, .read_packet = read_packet, .read_close = read_close, + .read_seek = read_seek, .extensions = "bfstm,bcstm", }; -- cgit v1.2.3