[FFmpeg-trac] #1834(swresample:new): swr_convert() results in integer division by zero exception
FFmpeg
trac at avcodec.org
Sat Oct 20 00:35:09 CEST 2012
#1834: swr_convert() results in integer division by zero exception
--------------------------------------+------------------------------------
Reporter: mbradshaw | Owner: michael
Type: defect | Status: new
Priority: normal | Component: swresample
Version: git-master | Keywords:
Blocked By: | Blocking:
Reproduced by developer: 0 | Analyzed by developer: 0
--------------------------------------+------------------------------------
'''Summary of the bug:'''
When I call `swr_convert()` I get an integer division by zero exception at
0x707c86ee. The disassembly around 0x707c86ee, should it help, is:
{{{
707C86AB je 707C86E4
707C86AD mov edx,dword ptr [ebx+4E8h]
707C86B3 test edx,edx
707C86B5 jne 707C8743
707C86BB mov dword ptr [esp+0Ch],edi
707C86BF mov dword ptr [esp+8],ebp
707C86C3 mov dword ptr [esp+4],esi
707C86C7 mov dword ptr [esp],eax
707C86CA mov dword ptr [esp+2Ch],ecx
707C86CE call 707C2AF4
707C86D3 mov ecx,dword ptr [esp+2Ch]
707C86D7 mov eax,ecx
707C86D9 add esp,3Ch
707C86DC pop ebx
707C86DD pop esi
707C86DE pop edi
707C86DF pop ebp
707C86E0 ret
707C86E1 lea esi,[esi]
707C86E4 test edi,edi
707C86E6 js 707C873C
707C86E8 mov eax,3FFFFFFFh
707C86ED cdq
707C86EE idiv eax,dword ptr [ebx+1B4h]
707C86F4 cdq
707C86F5 idiv eax,dword ptr [ebx+1B0h]
707C86FB cmp edi,eax
707C86FD jg 707C873C
707C86FF cmp edi,dword ptr [ebx+1B8h]
707C8705 jle 707C8724
707C8707 lea eax,[ebx+12Ch]
707C870D mov edx,edi
707C870F mov dword ptr [esp+2Ch],ecx
707C8713 call 707C77C8
707C8718 test eax,eax
707C871A mov ecx,dword ptr [esp+2Ch]
707C871E jns 707C8724
707C8720 mov ecx,eax
707C8722 jmp 707C86D7
707C8724 mov dword ptr [esp+54h],edi
707C8728 mov dword ptr [esp+50h],ebp
707C872C mov edx,esi
707C872E mov eax,ebx
707C8730 add esp,3Ch
707C8733 pop ebx
707C8734 pop esi
707C8735 pop edi
707C8736 pop ebp
707C8737 jmp 707C80B4
707C873C mov ecx,0FFFFFFEAh
}}}
This happens with more than just the attached sample file, but I've
attached a file just in case. The very first call to `swr_convert()`
results in this division by zero exception.
'''How to reproduce:''' (some lame sample code just to show when it's
happening)
{{{
#include <iostream>
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswresample/swresample.h>
};
int main()
{
av_register_all();
AVFrame* frame = avcodec_alloc_frame();
if (!frame)
{
std::cout << "Error allocating the frame" << std::endl;
return 1;
}
AVFormatContext* formatContext = NULL;
if (avformat_open_input(&formatContext,
"C:/Users/mbradshaw/Desktop/samples/TimeCode.mov", NULL, NULL) != 0)
{
av_free(frame);
std::cout << "Error opening the file" << std::endl;
return 1;
}
if (avformat_find_stream_info(formatContext, NULL) < 0)
{
av_free(frame);
av_close_input_file(formatContext);
std::cout << "Error finding the stream info" << std::endl;
return 1;
}
AVStream* audioStream = NULL;
for (unsigned int i = 0; i < formatContext->nb_streams; ++i)
{
if (formatContext->streams[i]->codec->codec_type ==
AVMEDIA_TYPE_AUDIO)
{
audioStream = formatContext->streams[i];
break;
}
}
if (audioStream == NULL)
{
av_free(frame);
av_close_input_file(formatContext);
std::cout << "Could not find any audio stream in the file" <<
std::endl;
return 1;
}
AVCodecContext* codecContext = audioStream->codec;
codecContext->codec = avcodec_find_decoder(codecContext->codec_id);
if (codecContext->codec == NULL)
{
av_free(frame);
av_close_input_file(formatContext);
std::cout << "Couldn't find a proper decoder" << std::endl;
return 1;
}
else if (avcodec_open2(codecContext, codecContext->codec, NULL) != 0)
{
av_free(frame);
av_close_input_file(formatContext);
std::cout << "Couldn't open the context with the decoder" <<
std::endl;
return 1;
}
SwrContext* swrContext = NULL;
swrContext = swr_alloc_set_opts(swrContext,
codecContext->channel_layout, // out channel layout
codecContext->sample_fmt, // out sample format
codecContext->sample_rate, // out sample rate
codecContext->channel_layout, // in channel layout
codecContext->sample_fmt, // in sample format
codecContext->sample_rate, // in sample rate
0, // log offset
NULL); // log context
if (!swrContext)
{
av_free(frame);
avcodec_close(codecContext);
av_close_input_file(formatContext);
std::cout << "Couldn't allocate and set the resampling context" <<
std::endl;
return 1;
}
int bufSize = av_samples_get_buffer_size(NULL, codecContext->channels,
codecContext->sample_rate, codecContext->sample_fmt, 0);
uint8_t* buf = new uint8_t[bufSize];
AVPacket packet;
av_init_packet(&packet);
int packetCount = 0;
int decodedFrameCount = 0;
while (av_read_frame(formatContext, &packet) == 0)
{
++packetCount;
if (packet.stream_index == audioStream->index)
{
int frameFinished = 0;
avcodec_decode_audio4(codecContext, frame, &frameFinished,
&packet);
if (frameFinished)
{
const uint8_t** in = (const
uint8_t**)frame->extended_data;
uint8_t* out[SWR_CH_MAX] = {buf, NULL};
std::cout << "converted: " << swr_convert(swrContext, out,
codecContext->sample_rate, in, frame->nb_samples) << std::endl;
}
}
av_free_packet(&packet);
}
delete [] buf;
swr_free(&swrContext);
av_free(frame);
avcodec_close(codecContext);
av_close_input_file(formatContext);
}
}}}
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/1834>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list