@ -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 ) ;
if ( ctx - > dss_sp_swap_byte < 0 ) {
ret = AVERROR ( EAGAIN ) ;
goto error_eof ;
}
if ( pkt - > data [ 0 ] = = 0xff )
return AVERROR_INVALIDDATA ;
@ -340,6 +345,45 @@ static int dss_read_close(AVFormatContext *s)
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 = {
. name = " dss " ,
. long_name = NULL_IF_CONFIG_SMALL ( " Digital Speech Standard (DSS) " ) ,
@ -348,5 +392,6 @@ AVInputFormat ff_dss_demuxer = {
. read_header = dss_read_header ,
. read_packet = dss_read_packet ,
. read_close = dss_read_close ,
. read_seek = dss_read_seek ,
. extensions = " dss "
} ;