From 3b1d86d9deb979e3ee4712e9bb5cecfb3e4b777c Mon Sep 17 00:00:00 2001 From: Benjamin Wolsey Date: Tue, 26 Apr 2011 14:31:48 +0200 Subject: [PATCH] Update FFmpeg usage to work with Debian Wheezy Current FFmpeg drops various deprecated functions. This commit introduces more copying for obvious correctness. This may be avoided after some testing. --- libmedia/ffmpeg/AudioDecoderFfmpeg.cpp | 79 ++++++++++++++---------------- libmedia/ffmpeg/AudioResamplerFfmpeg.cpp | 36 ++++++------- libmedia/ffmpeg/MediaParserFfmpeg.cpp | 15 +----- libmedia/ffmpeg/VideoDecoderFfmpeg.cpp | 7 ++- 4 files changed, 61 insertions(+), 76 deletions(-) diff --git a/libmedia/ffmpeg/AudioDecoderFfmpeg.cpp b/libmedia/ffmpeg/AudioDecoderFfmpeg.cpp index 1421aa6..1f185bb 100644 --- a/libmedia/ffmpeg/AudioDecoderFfmpeg.cpp +++ b/libmedia/ffmpeg/AudioDecoderFfmpeg.cpp @@ -29,8 +29,6 @@ //#define GNASH_DEBUG_AUDIO_DECODING -#define AVCODEC_DECODE_AUDIO avcodec_decode_audio2 - namespace gnash { namespace media { namespace ffmpeg { @@ -520,16 +518,18 @@ boost::uint8_t* AudioDecoderFfmpeg::decodeFrame(const boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize) { - //GNASH_REPORT_FUNCTION; - assert(inputSize); + AVPacket packet; + av_new_packet(&packet, inputSize); + std::copy(input, input + inputSize, packet.data); + const size_t bufsize = AVCODEC_MAX_AUDIO_FRAME_SIZE; // TODO: make this a private member, to reuse (see NetStreamFfmpeg in 0.8.3) boost::uint8_t* output; - output = reinterpret_cast(av_malloc(bufsize)); + output = static_cast(av_malloc(bufsize)); if (!output) { log_error(_("failed to allocate audio buffer.")); outputSize = 0; @@ -548,9 +548,8 @@ AudioDecoderFfmpeg::decodeFrame(const boost::uint8_t* input, inputSize, _audioCodecCtx->channels, _audioCodecCtx->frame_size); #endif - // older ffmpeg versions didn't accept a const input.. - int tmp = AVCODEC_DECODE_AUDIO(_audioCodecCtx, outPtr, &outSize, - input, inputSize); + const int tmp = avcodec_decode_audio3(_audioCodecCtx, outPtr, &outSize, + &packet); #ifdef GNASH_DEBUG_AUDIO_DECODING log_debug(" avcodec_decode_audio[2](ctx, bufptr, %d, input, %d) " @@ -656,47 +655,43 @@ AudioDecoderFfmpeg::parseInput(const boost::uint8_t* input, boost::uint32_t inputSize, boost::uint8_t const ** outFrame, int* outFrameSize) { - if ( _needsParsing ) - { - return av_parser_parse(_parser, _audioCodecCtx, + if (_needsParsing) { + return av_parser_parse2(_parser, _audioCodecCtx, // as of 2008-10-28 SVN, ffmpeg doesn't // accept a pointer to pointer to const.. const_cast(outFrame), outFrameSize, input, inputSize, - 0, 0); // pts & dts + 0, 0, AV_NOPTS_VALUE); } - else - { - // democratic value for a chunk to decode... - // @todo this might be constrained by codec id, check that ! - - // NOTE: AVCODEC_MAX_AUDIO_FRAME_SIZE resulted bigger - // than avcodec_decode_audio could handle, resulting - // in eventSoundTest1.swf regression. - //static const unsigned int maxFrameSize = AVCODEC_MAX_AUDIO_FRAME_SIZE; - - // NOTE: 1024 resulted too few - // to properly decode (or resample?) raw audio - // thus resulting noisy (bugs #21177 and #22284) - //static const unsigned int maxFrameSize = 1024; - - // NOTE: 96000 was found to be the max returned - // by avcodec_decode_audio when passed anything - // bigger than that. Works fine with all of - // eventSoundTest1.swf, bug #21177 and bug #22284 - // - static const unsigned int maxFrameSize = 96000; - int frameSize = inputSize < maxFrameSize ? inputSize : maxFrameSize; - - // we assume the input is just a set of frames - // and we'll consume all - *outFrame = input; // frame always start on input - *outFrameSize = frameSize; - int parsed = frameSize; - return parsed; - } + // democratic value for a chunk to decode... + // @todo this might be constrained by codec id, check that ! + + // NOTE: AVCODEC_MAX_AUDIO_FRAME_SIZE resulted bigger + // than avcodec_decode_audio could handle, resulting + // in eventSoundTest1.swf regression. + //static const unsigned int maxFrameSize = AVCODEC_MAX_AUDIO_FRAME_SIZE; + + // NOTE: 1024 resulted too few + // to properly decode (or resample?) raw audio + // thus resulting noisy (bugs #21177 and #22284) + //static const unsigned int maxFrameSize = 1024; + + // NOTE: 96000 was found to be the max returned + // by avcodec_decode_audio when passed anything + // bigger than that. Works fine with all of + // eventSoundTest1.swf, bug #21177 and bug #22284 + // + static const unsigned int maxFrameSize = 96000; + + int frameSize = inputSize < maxFrameSize ? inputSize : maxFrameSize; + + // we assume the input is just a set of frames + // and we'll consume all + *outFrame = input; // frame always start on input + *outFrameSize = frameSize; + return frameSize; } diff --git a/libmedia/ffmpeg/AudioResamplerFfmpeg.cpp b/libmedia/ffmpeg/AudioResamplerFfmpeg.cpp index 3a43655..34e06b6 100644 --- a/libmedia/ffmpeg/AudioResamplerFfmpeg.cpp +++ b/libmedia/ffmpeg/AudioResamplerFfmpeg.cpp @@ -30,41 +30,39 @@ namespace media { namespace ffmpeg { AudioResamplerFfmpeg::AudioResamplerFfmpeg() - :_context(NULL) + : + _context(0) { } AudioResamplerFfmpeg::~AudioResamplerFfmpeg() { - if ( _context ) { - audio_resample_close( _context ); - } + if (_context) { + audio_resample_close(_context); + } } bool AudioResamplerFfmpeg::init( AVCodecContext* ctx ) { - if ( (ctx->sample_rate != 44100) || (ctx->channels != 2) ) { - if ( ! _context ) { - _context = audio_resample_init( - 2, ctx->channels, 44100, ctx->sample_rate - ); + if ((ctx->sample_rate != 44100) || (ctx->channels != 2)) { + if (!_context) { + _context = av_audio_resample_init( + 2, ctx->channels, 44100, ctx->sample_rate, + AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16, 16, + 10, 0, 0.8); + } + return true; } - return true; - } - - return false; + return false; } int -AudioResamplerFfmpeg::resample( - boost::int16_t* input, - boost::int16_t* output, - int samples - ) +AudioResamplerFfmpeg::resample(boost::int16_t* input, boost::int16_t* output, + int samples) { - return audio_resample( _context, output, input, samples ); + return audio_resample(_context, output, input, samples); } diff --git a/libmedia/ffmpeg/MediaParserFfmpeg.cpp b/libmedia/ffmpeg/MediaParserFfmpeg.cpp index 19c8136..06e2f25 100644 --- a/libmedia/ffmpeg/MediaParserFfmpeg.cpp +++ b/libmedia/ffmpeg/MediaParserFfmpeg.cpp @@ -396,17 +396,6 @@ MediaParserFfmpeg::initializeParser() log_debug("Parsing FFMPEG media file: format:%s; nstreams:%d", _inputFmt->name, _formatCtx->nb_streams); - if ( _formatCtx->title[0] ) - log_debug(_(" Title:'%s'"), _formatCtx->title); - if ( _formatCtx->author[0] ) - log_debug(_(" Author:'%s'"), _formatCtx->author); - if ( _formatCtx->copyright[0] ) - log_debug(_(" Copyright:'%s'"), _formatCtx->copyright); - if ( _formatCtx->comment[0] ) - log_debug(_(" Comment:'%s'"), _formatCtx->comment); - if ( _formatCtx->album[0] ) - log_debug(_(" Album:'%s'"), _formatCtx->album); - // Find first audio and video stream for (unsigned int i = 0; i < static_cast(_formatCtx->nb_streams); i++) { @@ -423,7 +412,7 @@ MediaParserFfmpeg::initializeParser() } switch (enc->codec_type) { - case CODEC_TYPE_AUDIO: + case AVMEDIA_TYPE_AUDIO: if (_audioStreamIndex < 0) { _audioStreamIndex = i; _audioStream = _formatCtx->streams[i]; @@ -433,7 +422,7 @@ MediaParserFfmpeg::initializeParser() } break; - case CODEC_TYPE_VIDEO: + case AVMEDIA_TYPE_VIDEO: if (_videoStreamIndex < 0) { _videoStreamIndex = i; _videoStream = _formatCtx->streams[i]; diff --git a/libmedia/ffmpeg/VideoDecoderFfmpeg.cpp b/libmedia/ffmpeg/VideoDecoderFfmpeg.cpp index 79a42a0..05e0f69 100644 --- a/libmedia/ffmpeg/VideoDecoderFfmpeg.cpp +++ b/libmedia/ffmpeg/VideoDecoderFfmpeg.cpp @@ -354,10 +354,13 @@ VideoDecoderFfmpeg::decode(const boost::uint8_t* input, return ret; } + AVPacket packet; + av_new_packet(&packet, input_size); + std::copy(input, input + input_size, packet.data); + int bytes = 0; // no idea why avcodec_decode_video wants a non-const input... - avcodec_decode_video(_videoCodecCtx->getContext(), frame, &bytes, - input, input_size); + avcodec_decode_video2(_videoCodecCtx->getContext(), frame, &bytes, &packet); if (!bytes) { log_error("Decoding of a video frame failed"); -- 1.7.4.4