Commit 111d79aa authored by Michael Niedermayer's avatar Michael Niedermayer

avformat/dss: implement seeking

This assumes CBR (which is true for all samples i have)

Previous version reviewed by: Oleksij Rempel <linux@rempel-privat.de>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 626904b7
...@@ -256,6 +256,11 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -256,6 +256,11 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt)
dss_sp_byte_swap(ctx, pkt->data, ctx->dss_sp_buf); dss_sp_byte_swap(ctx, pkt->data, ctx->dss_sp_buf);
if (ctx->dss_sp_swap_byte < 0) {
ret = AVERROR(EAGAIN);
goto error_eof;
}
if (pkt->data[0] == 0xff) if (pkt->data[0] == 0xff)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -340,6 +345,45 @@ static int dss_read_close(AVFormatContext *s) ...@@ -340,6 +345,45 @@ static int dss_read_close(AVFormatContext *s)
return 0; return 0;
} }
static int dss_read_seek(AVFormatContext *s, int stream_index,
int64_t timestamp, int flags)
{
DSSDemuxContext *ctx = s->priv_data;
int64_t ret, seekto;
uint8_t header[DSS_AUDIO_BLOCK_HEADER_SIZE];
int offset;
if (ctx->audio_codec == DSS_ACODEC_DSS_SP)
seekto = timestamp / 264 * 41 / 506 * 512;
else
seekto = timestamp / 240 * ctx->packet_size / 506 * 512;
if (seekto < 0)
seekto = 0;
seekto += DSS_HEADER_SIZE;
ret = avio_seek(s->pb, seekto, SEEK_SET);
if (ret < 0)
return ret;
avio_read(s->pb, header, DSS_AUDIO_BLOCK_HEADER_SIZE);
ctx->swap = !!(header[0] & 0x80);
offset = 2*header[1] + 2*ctx->swap;
if (offset < DSS_AUDIO_BLOCK_HEADER_SIZE)
return AVERROR_INVALIDDATA;
if (offset == DSS_AUDIO_BLOCK_HEADER_SIZE) {
ctx->counter = 0;
offset = avio_skip(s->pb, -DSS_AUDIO_BLOCK_HEADER_SIZE);
} else {
ctx->counter = DSS_BLOCK_SIZE - offset;
offset = avio_skip(s->pb, offset - DSS_AUDIO_BLOCK_HEADER_SIZE);
}
ctx->dss_sp_swap_byte = -1;
return 0;
}
AVInputFormat ff_dss_demuxer = { AVInputFormat ff_dss_demuxer = {
.name = "dss", .name = "dss",
.long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard (DSS)"), .long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard (DSS)"),
...@@ -348,5 +392,6 @@ AVInputFormat ff_dss_demuxer = { ...@@ -348,5 +392,6 @@ AVInputFormat ff_dss_demuxer = {
.read_header = dss_read_header, .read_header = dss_read_header,
.read_packet = dss_read_packet, .read_packet = dss_read_packet,
.read_close = dss_read_close, .read_close = dss_read_close,
.read_seek = dss_read_seek,
.extensions = "dss" .extensions = "dss"
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment