[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