@ -75,6 +75,7 @@ typedef struct FLACParseContext {
FLACHeaderMarker * best_header ; /**< highest scoring header within buffer */
int nb_headers_found ; /**< number of headers found in the last
flac_parse ( ) call */
int nb_headers_buffered ; /**< number of headers that are buffered */
int best_header_valid ; /**< flag set when the parser returns junk;
if set return best_header next time */
AVFifoBuffer * fifo_buf ; /**< buffer to store all data until headers
@ -504,6 +505,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
temp = curr - > next ;
av_freep ( & curr - > link_penalty ) ;
av_free ( curr ) ;
fpc - > nb_headers_buffered - - ;
}
/* Release returned data from ring buffer. */
av_fifo_drain ( fpc - > fifo_buf , best_child - > offset ) ;
@ -512,8 +514,13 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
for ( curr = best_child - > next ; curr ; curr = curr - > next )
curr - > offset - = best_child - > offset ;
fpc - > nb_headers_buffered - - ;
best_child - > offset = 0 ;
fpc - > headers = best_child ;
if ( fpc - > nb_headers_buffered > = FLAC_MIN_HEADERS ) {
fpc - > best_header = best_child ;
return get_best_header ( fpc , poutbuf , poutbuf_size ) ;
}
fpc - > best_header = NULL ;
} else if ( fpc - > best_header ) {
/* No end frame no need to delete the buffer; probably eof */
@ -562,8 +569,15 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
start_offset = FFMAX ( 0 , start_offset ) ;
nb_headers = find_new_headers ( fpc , start_offset ) ;
if ( nb_headers < 0 ) {
av_log ( avctx , AV_LOG_ERROR ,
" find_new_headers couldn't allocate FLAC header \n " ) ;
goto handle_error ;
}
fpc - > nb_headers_buffered = nb_headers ;
/* Wait till FLAC_MIN_HEADERS to output a valid frame. */
if ( ! fpc - > end_padded & & nb_headers < FLAC_MIN_HEADERS )
if ( ! fpc - > end_padded & & fpc - > nb_headers_buffered < FLAC_MIN_HEADERS )
goto handle_error ;
/* If headers found, update the scores since we have longer chains. */