I think i got the reason. I converts the audio to planar format, but frame->data[1] is NULL.

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?


_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user


_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to