aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2015-06-20 05:01:21 -0500
committerPaul B Mahol <onemda@gmail.com>2015-06-21 10:32:12 +0000
commit9c9cf3956cd630035ea5b76c3f4fa6a82916e6ef (patch)
treee973522288aa6c139076393f1108a5d2fe9c1ce3
parent70a39bcf1c95471a79ba1f3a2ccedb4471df5b32 (diff)
downloadffmpeg-9c9cf3956cd630035ea5b76c3f4fa6a82916e6ef.tar.gz
lavf/brstm: add support for seeking
-rw-r--r--libavformat/brstm.c23
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",
};