@ -42,29 +42,34 @@
static void decode ( AVCodecContext * dec_ctx , AVPacket * pkt , AVFrame * frame ,
FILE * outfile )
{
int len , got_frame ;
int i , ch ;
int ret , data_size ;
while ( pkt - > size > 0 ) {
len = avcodec_decode_audio4 ( dec_ctx , frame , & got_frame , pkt ) ;
if ( len < 0 ) {
fprintf ( stderr , " Error while decoding \n " ) ;
/* send the packet with the compressed data to the decoder */
ret = avcodec_send_packet ( dec_ctx , pkt ) ;
if ( ret < 0 ) {
fprintf ( stderr , " Error submitting the packet to the decoder \n " ) ;
exit ( 1 ) ;
}
/* read all the output frames (in general there may be any number of them */
while ( ret > = 0 ) {
ret = avcodec_receive_frame ( dec_ctx , frame ) ;
if ( ret = = AVERROR ( EAGAIN ) | | ret = = AVERROR_EOF )
return ;
else if ( ret < 0 ) {
fprintf ( stderr , " Error during decoding \n " ) ;
exit ( 1 ) ;
}
if ( got_frame ) {
int i , ch ;
/* if a frame has been decoded, output it */
int data_size = av_get_bytes_per_sample ( dec_ctx - > sample_fmt ) ;
if ( data_size < 0 ) {
/* This should not occur, checking just for paranoia */
fprintf ( stderr , " Failed to calculate data size \n " ) ;
exit ( 1 ) ;
}
for ( i = 0 ; i < frame - > nb_samples ; i + + )
for ( ch = 0 ; ch < dec_ctx - > channels ; ch + + )
fwrite ( frame - > data [ ch ] + data_size * i , 1 , data_size , outfile ) ;
data_size = av_get_bytes_per_sample ( dec_ctx - > sample_fmt ) ;
if ( data_size < 0 ) {
/* This should not occur, checking just for paranoia */
fprintf ( stderr , " Failed to calculate data size \n " ) ;
exit ( 1 ) ;
}
pkt - > size - = len ;
pkt - > data + = len ;
for ( i = 0 ; i < frame - > nb_samples ; i + + )
for ( ch = 0 ; ch < dec_ctx - > channels ; ch + + )
fwrite ( frame - > data [ ch ] + data_size * i , 1 , data_size , outfile ) ;
}
}