diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2015-06-20 05:01:21 -0500 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2015-06-21 10:32:12 +0000 |
commit | 9c9cf3956cd630035ea5b76c3f4fa6a82916e6ef (patch) | |
tree | e973522288aa6c139076393f1108a5d2fe9c1ce3 | |
parent | 70a39bcf1c95471a79ba1f3a2ccedb4471df5b32 (diff) | |
download | ffmpeg-9c9cf3956cd630035ea5b76c3f4fa6a82916e6ef.tar.gz |
lavf/brstm: add support for seeking
-rw-r--r-- | libavformat/brstm.c | 23 |
1 files changed, 23 insertions, 0 deletions
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", }; |