diff options
author | Zane van Iperen <zane@zanevaniperen.com> | 2020-09-21 19:36:03 +1000 |
---|---|---|
committer | Zane van Iperen <zane@zanevaniperen.com> | 2020-09-23 10:07:08 +1000 |
commit | 003b5c800fef909fa84dd2fae43d66bd434d3f7e (patch) | |
tree | d87360debcc4ac09c9875619c6c92db33e4fda98 | |
parent | 904ab5365cf4881eae1e5cac980f3c4f252b69cd (diff) | |
download | ffmpeg-003b5c800fef909fa84dd2fae43d66bd434d3f7e.tar.gz |
avformat/argo_asf: implement seeking
Causes some error as the ADPCM predictors aren't known, but
the difference is negligible and not audible.
Signed-off-by: Zane van Iperen <zane@zanevaniperen.com>
-rw-r--r-- | libavformat/argo_asf.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/libavformat/argo_asf.c b/libavformat/argo_asf.c index 6f7d9e93c9..de941caeac 100644 --- a/libavformat/argo_asf.c +++ b/libavformat/argo_asf.c @@ -238,12 +238,34 @@ static int argo_asf_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->stream_index = st->index; pkt->duration = asf->ckhdr.num_samples * (ret / st->codecpar->block_align); + pkt->pts = asf->blocks_read * asf->ckhdr.num_samples; asf->blocks_read += (ret / st->codecpar->block_align); pkt->flags &= ~AV_PKT_FLAG_CORRUPT; return 0; } +static int argo_asf_seek(AVFormatContext *s, int stream_index, + int64_t pts, int flags) +{ + ArgoASFDemuxContext *asf = s->priv_data; + AVStream *st = s->streams[stream_index]; + int64_t offset; + uint32_t block = pts / asf->ckhdr.num_samples; + + if (block >= asf->ckhdr.num_blocks) + return -1; + + offset = asf->fhdr.chunk_offset + ASF_CHUNK_HEADER_SIZE + + (block * st->codecpar->block_align); + + if ((offset = avio_seek(s->pb, offset, SEEK_SET)) < 0) + return offset; + + asf->blocks_read = block; + return 0; +} + /* * Not actually sure what ASF stands for. * - Argonaut Sound File? @@ -255,7 +277,8 @@ AVInputFormat ff_argo_asf_demuxer = { .priv_data_size = sizeof(ArgoASFDemuxContext), .read_probe = argo_asf_probe, .read_header = argo_asf_read_header, - .read_packet = argo_asf_read_packet + .read_packet = argo_asf_read_packet, + .read_seek = argo_asf_seek, }; #endif |