@ -33,6 +33,7 @@ typedef struct DCAParseContext {
uint32_t lastmarker ;
int size ;
int framesize ;
unsigned int startpos ;
DCAExssParser exss ;
unsigned int sr_code ;
} DCAParseContext ;
@ -75,20 +76,27 @@ static int dca_find_frame_end(DCAParseContext *pc1, const uint8_t *buf,
i = 0 ;
if ( ! start_found ) {
for ( i = 0 ; i < buf_size ; i + + ) {
for ( ; i < buf_size ; i + + ) {
size + + ;
state = ( state < < 8 ) | buf [ i ] ;
if ( IS_MARKER ( state ) ) {
if ( ! pc1 - > lastmarker | |
pc1 - > lastmarker = = CORE_MARKER ( state ) | |
pc1 - > lastmarker = = DCA_SYNCWORD_SUBSTREAM ) {
start_found = 1 ;
if ( IS_EXSS_MARKER ( state ) )
pc1 - > lastmarker = EXSS_MARKER ( state ) ;
else
pc1 - > lastmarker = CORE_MARKER ( state ) ;
i + + ;
break ;
}
if ( IS_MARKER ( state ) & &
( ! pc1 - > lastmarker | |
pc1 - > lastmarker = = CORE_MARKER ( state ) | |
pc1 - > lastmarker = = DCA_SYNCWORD_SUBSTREAM ) ) {
if ( ! pc1 - > lastmarker )
pc1 - > startpos = IS_EXSS_MARKER ( state ) ? size - 4 : size - 6 ;
if ( IS_EXSS_MARKER ( state ) )
pc1 - > lastmarker = EXSS_MARKER ( state ) ;
else
pc1 - > lastmarker = CORE_MARKER ( state ) ;
start_found = 1 ;
size = 0 ;
i + + ;
break ;
}
}
}
@ -284,6 +292,13 @@ static int dca_parse(AVCodecParserContext *s, AVCodecContext *avctx,
* poutbuf_size = 0 ;
return buf_size ;
}
/* skip initial padding */
if ( buf_size > pc1 - > startpos ) {
buf + = pc1 - > startpos ;
buf_size - = pc1 - > startpos ;
}
pc1 - > startpos = 0 ;
}
/* read the duration and sample rate from the frame header */