From 349b71fd02354a3d1288bccbb2d984d5f9a7e605 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 19 Apr 2013 17:23:08 +0000 Subject: Bring back support of FFmpeg >= 0.7 After planar codecs support minimal FFmpeg was bumped to 0.10 which was not so much nice because it was only released only later last year. Didn't find a way to make compatibility code local in ffmpeg_compat, so there're some ifdefs in audaspace and writeffmpeg. Not entirely happy, but having a bit of ifdefs in code better than lots of real PITA for platform maintainers. --- intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp') diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index 408a4e56f1c..3d830df83e8 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -43,6 +43,7 @@ extern "C" { int AUD_FFMPEGReader::decode(AVPacket& packet, AUD_Buffer& buffer) { +#ifdef FFMPEG_HAVE_DECODE_AUDIO4 AVFrame* frame = NULL; int got_frame; int read_length; @@ -101,6 +102,54 @@ int AUD_FFMPEGReader::decode(AVPacket& packet, AUD_Buffer& buffer) av_free(frame); return buf_pos; +#else + // save packet parameters + uint8_t *audio_pkg_data = packet.data; + int audio_pkg_size = packet.size; + + int buf_size = buffer.getSize(); + int buf_pos = 0; + + int read_length, data_size; + + AVPacket tmp_pkt; + + av_init_packet(&tmp_pkt); + + // as long as there is still data in the package + while(audio_pkg_size > 0) + { + // resize buffer if needed + if(buf_size - buf_pos < AVCODEC_MAX_AUDIO_FRAME_SIZE) + { + buffer.resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true); + buf_size += AVCODEC_MAX_AUDIO_FRAME_SIZE; + } + + // read samples from the packet + data_size = buf_size - buf_pos; + + tmp_pkt.data = audio_pkg_data; + tmp_pkt.size = audio_pkg_size; + + read_length = avcodec_decode_audio3( + m_codecCtx, + (int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos), + &data_size, &tmp_pkt); + + // read error, next packet! + if(read_length < 0) + break; + + buf_pos += data_size; + + // move packet parameters + audio_pkg_data += read_length; + audio_pkg_size -= read_length; + } + + return buf_pos; +#endif } static const char* streaminfo_error = "AUD_FFMPEGReader: Stream info couldn't " -- cgit v1.2.3