avcodec_decode_audio 2の戻り値は-1ですか?


ffmpeg 4を使います.0バージョンが旧バージョン3.2に代わる場合、復号時にavcodec_が発見されるdecode_audio 2の戻り値は合計-1で、私のプログラムのコードは以下の通りです.
         int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
	uint8_t * inbuf = (uint8_t *)malloc(out_size);
	FILE* pFileWav;
	int fileSize; 
	pFileWav= fopen("b.pcm","wb+");
	while(av_read_frame(pFormatCtx, &packet)>=0)
	{
		if(packet.stream_index==audioStream) {
			pktdata = packet.data;
			pktsize = packet.size;
			while(pktsize>0)
			{
				// 
				int len=avcodec_decode_audio2(pCodecCtx,(int16_t *)inbuf,&out_size,pktdata,pktsize);
//				int len=avcodec_decode_audio3(pCodecCtx,(int16_t *)inbuf,&out_size,&packet);
				if (len<0)
				{
					printf("Error while decoding.
"); break; } if(out_size>0) { fwrite(inbuf,1,out_size,pFileWav);//pcm fflush(pFileWav); fileSize += out_size; } pktsize -= len; pktdata += len; } } av_free_packet(&packet); }

 
後でffmpeg 3を調べた.2ソースコード、検出:
int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
                         int *frame_size_ptr,
                         const uint8_t *buf, int buf_size)
{
    int ret;

    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
        //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
        if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
            av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE
"); return -1; }
if(*frame_size_ptr < FF_MIN_BUFFER_SIZE || *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){ av_log(avctx, AV_LOG_ERROR, "buffer %d too small
", *frame_size_ptr); return -1; } ret = avctx->codec->decode(avctx, samples, frame_size_ptr, buf, buf_size); avctx->frame_number++; }else{ ret= 0; *frame_size_ptr=0; } return ret; } #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, const uint8_t *buf, int buf_size){ *frame_size_ptr= AVCODEC_MAX_AUDIO_FRAME_SIZE; return avcodec_decode_audio2(avctx, samples, frame_size_ptr, buf, buf_size); } #endif

 
ffmpeg4.0のコードは次のとおりです.
int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
                         int *frame_size_ptr,
                         const uint8_t *buf, int buf_size)
{
    AVPacket avpkt;
    av_init_packet(&avpkt);
    avpkt.data = buf;
    avpkt.size = buf_size;

    return avcodec_decode_audio3(avctx, samples, frame_size_ptr, &avpkt);
}
#endif

int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
                         int *frame_size_ptr,
                         AVPacket *avpkt)
{
    int ret;

    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
        //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
        if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
            av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE
"); return -1; }
if(*frame_size_ptr < FF_MIN_BUFFER_SIZE || *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){ av_log(avctx, AV_LOG_ERROR, "buffer %d too small
", *frame_size_ptr); return -1; } ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt); avctx->frame_number++; }else{ ret= 0; *frame_size_ptr=0; } return ret; }

 
すなわちavcodec_が呼び出されるたびにdecode_audio 2の場合、(*frame_size_ptr問題を見つけて、自然に解決するのは簡単で、ffmpegソースコードで、クライアントで、私は後者を選んで、主に便利です:
int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
	uint8_t * inbuf = (uint8_t *)malloc(out_size);

	FILE* pFileWav;
	int fileSize; 
	pFileWav= fopen("b.pcm","wb+");
	while(av_read_frame(pFormatCtx, &packet)>=0)
	{
		if(packet.stream_index==audioStream) {
			pktdata = packet.data;
			pktsize = packet.size;
			out_size=AVCODEC_MAX_AUDIO_FRAME_SIZE;// ok 
			while(pktsize>0)
			{
				// 
				int len=avcodec_decode_audio2(pCodecCtx,(int16_t *)inbuf,&out_size,pktdata,pktsize);
//				int len=avcodec_decode_audio3(pCodecCtx,(int16_t *)inbuf,&out_size,&packet);
				if (len<0)
				{
					printf("Error while decoding.
"); break; } if(out_size>0) { fwrite(inbuf,1,out_size,pFileWav);//pcm fflush(pFileWav); fileSize += out_size; } pktsize -= len; pktdata += len; } } av_free_packet(&packet); } avcodec_close(pCodecCtx); av_close_input_file(pFormatCtx); return TRUE; }