[Libav-user] swr_convert crashed when convert format S16P to FLTP

hemiao hemiao_1990 at 126.com
Sat Jan 11 03:38:18 CET 2014


I have checked ffmpeg and doc/examples/resampling.c, both of them works 
fine.  I have reviewed my code many times, but unfortunatlly get no result.

int AudioDecoder::doDecode()
{
     AVPacket * packet = &mPacket;
     int decoded_size = 0;
     int got_frame = 0;
     int ret;

     if (!mFrame) {
         mFrame = av_frame_alloc();
     }

     avcodec_get_frame_defaults(mFrame);
     while (1) {
         if (mPacketSize > 0) {
             ret = avcodec_decode_audio4(mCodecCtx, mFrame, &got_frame, 
packet);
             if (ret < 0) {
                 fprintf(stderr, "decode audio failed: %s.\n", 
av_err2str(ret));
                 continue;
             }

             if (!got_frame) {
                 mPacketSize = 0;
                 continue;
             }

             mPacketSize -= ret;
             decoded_size = av_samples_get_buffer_size(NULL, 
mCodecCtx->channels,
                     mFrame->nb_samples, (enum 
AVSampleFormat)mFrame->format, 1);
             if (mChannelLayout != mOutChannelLayout ||
                     mSampleFmt != mOutSampleFmt ||
                     mSampleRate != mOutSampleRate)
             {
                 if (!mSwrCtx) {
                     mSwrCtx = swr_alloc_set_opts(mSwrCtx, 
mOutChannelLayout /* 3 */, mOutSampleFmt /* fltp */,
                             mOutSampleRate /* 44100 */, mChannelLayout 
/* 3 */, mSampleFmt /*s16p */, mSampleRate /* 44100 */, 0, NULL);
                     int err = swr_init(mSwrCtx);
                     if (err < 0) {
                         av_log(NULL, AV_LOG_ERROR, "swr init failed: 
%s.\n", av_err2str(err));
                         exit(1);
                     }
                 }

                 uint8_t * out[] = { mData };
                 int out_count = sizeof(mData) / 
av_get_channel_layout_nb_channels(mOutChannelLayout) /
av_get_bytes_per_sample(mSampleFmt);
                 ret = swr_convert(mSwrCtx, out, out_count, (const 
uint8_t **)mFrame->extended_data,
                                 mFrame->nb_samples);
                 if (ret < 0) {
                     av_log(NULL, AV_LOG_ERROR, "swr convert failed: 
%s.\n", av_err2str(ret));
                     exit(1);
                 }
                 decoded_size = ret * 
av_get_channel_layout_nb_channels(mOutChannelLayout) *
                         av_get_bytes_per_sample(mOutSampleFmt);
                 mAudioBuffer = mData;
                 if (ret == out_count) {
                     av_log(NULL, AV_LOG_INFO, "audio buffer too small.\n");
                 }
             } else {
                 mAudioBuffer = mFrame->data[0];
             }

             return decoded_size;
         }

         if (packet->data) {
             av_free_packet(packet);
         }

         ret = av_read_frame(mFmtCtx, packet);
         if (ret < 0) {
             fprintf(stdout, "read packet failed: %s.\n", av_err2str(ret));
         }
         if (packet->stream_index != mStreamIndex) {
             continue;
         }
         mPacketSize += packet->size;
     }

     return -1;     //shouldn't be here
}


> On date Thursday 2014-01-09 23:05:43 +0800, hemiao encoded:
>> hi,everyone
>>
>> my audio source file's format is s16p. when i use swr_convert function
>> to convert it to fltp or dblp, the function crashed, without return
>> value or error message.
>> but when i convert it to flt or dbl, it works fine. so why?
> Please open a ticket if you're able to consistently reproduce the
> error. Are you able to reproduce the issue with ffmpeg or with
> doc/examples/resampling.c?




More information about the Libav-user mailing list