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>
This commit is contained in:
Zane van Iperen 2020-09-21 19:36:03 +10:00
parent 904ab5365c
commit 003b5c800f
No known key found for this signature in database
GPG Key ID: 68616B2D8AC4DCC5

View File

@ -238,12 +238,34 @@ static int argo_asf_read_packet(AVFormatContext *s, AVPacket *pkt)
pkt->stream_index = st->index; pkt->stream_index = st->index;
pkt->duration = asf->ckhdr.num_samples * (ret / st->codecpar->block_align); 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); asf->blocks_read += (ret / st->codecpar->block_align);
pkt->flags &= ~AV_PKT_FLAG_CORRUPT; pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
return 0; 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. * Not actually sure what ASF stands for.
* - Argonaut Sound File? * - Argonaut Sound File?
@ -255,7 +277,8 @@ AVInputFormat ff_argo_asf_demuxer = {
.priv_data_size = sizeof(ArgoASFDemuxContext), .priv_data_size = sizeof(ArgoASFDemuxContext),
.read_probe = argo_asf_probe, .read_probe = argo_asf_probe,
.read_header = argo_asf_read_header, .read_header = argo_asf_read_header,
.read_packet = argo_asf_read_packet .read_packet = argo_asf_read_packet,
.read_seek = argo_asf_seek,
}; };
#endif #endif