diff options
Diffstat (limited to 'intern')
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 13 | ||||
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp | 15 | ||||
-rw-r--r-- | intern/ffmpeg/ffmpeg_compat.h | 57 |
3 files changed, 70 insertions, 15 deletions
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index 0a3d0f8e85a..831e1998182 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -107,7 +107,7 @@ void AUD_FFMPEGReader::init() m_position = 0; m_pkgbuf_left = 0; - if(av_find_stream_info(m_formatCtx)<0) + if(avformat_find_stream_info(m_formatCtx, NULL) < 0) AUD_THROW(AUD_ERROR_FFMPEG, streaminfo_error); // find audio stream and codec @@ -133,7 +133,7 @@ void AUD_FFMPEGReader::init() if(!aCodec) AUD_THROW(AUD_ERROR_FFMPEG, nodecoder_error); - if(avcodec_open(m_codecCtx, aCodec)<0) + if(avcodec_open2(m_codecCtx, aCodec, NULL) < 0) AUD_THROW(AUD_ERROR_FFMPEG, codecopen_error); // XXX this prints file information to stdout: @@ -236,14 +236,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(boost::shared_ptr<AUD_Buffer> buffer) : AUD_FFMPEGReader::~AUD_FFMPEGReader() { avcodec_close(m_codecCtx); - - if(m_aviocontext) - { - avformat_close_input(&m_formatCtx); - av_free(m_aviocontext); - } - else - av_close_input_file(m_formatCtx); + avformat_close_input(&m_formatCtx); } int AUD_FFMPEGReader::read_packet(void* opaque, uint8_t* buf, int buf_size) diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp index 2b34348da81..55040e4db8e 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp @@ -55,10 +55,15 @@ AUD_FFMPEGWriter::AUD_FFMPEGWriter(std::string filename, AUD_DeviceSpecs specs, { static const char* formats[] = { NULL, "ac3", "flac", "matroska", "mp2", "mp3", "ogg", "wav" }; - if(avformat_alloc_output_context2(&m_formatCtx, NULL, formats[format], filename.c_str())) - AUD_THROW(AUD_ERROR_FFMPEG, context_error); + m_formatCtx = avformat_alloc_context(); + if (!m_formatCtx) AUD_THROW(AUD_ERROR_FFMPEG, context_error); - m_outputFmt = m_formatCtx->oformat; + strcpy(m_formatCtx->filename, filename.c_str()); + m_outputFmt = m_formatCtx->oformat = av_guess_format(formats[format], filename.c_str(), NULL); + if (!m_outputFmt) { + avformat_free_context(m_formatCtx); + AUD_THROW(AUD_ERROR_FFMPEG, context_error); + } switch(codec) { @@ -116,7 +121,7 @@ AUD_FFMPEGWriter::AUD_FFMPEGWriter(std::string filename, AUD_DeviceSpecs specs, if(m_outputFmt->audio_codec == CODEC_ID_NONE) AUD_THROW(AUD_ERROR_SPECS, codec_error); - m_stream = av_new_stream(m_formatCtx, 0); + m_stream = avformat_new_stream(m_formatCtx, NULL); if(!m_stream) AUD_THROW(AUD_ERROR_FFMPEG, stream_error); @@ -164,7 +169,7 @@ AUD_FFMPEGWriter::AUD_FFMPEGWriter(std::string filename, AUD_DeviceSpecs specs, if(!codec) AUD_THROW(AUD_ERROR_FFMPEG, codec_error); - if(avcodec_open(m_codecCtx, codec)) + if(avcodec_open2(m_codecCtx, codec, NULL)) AUD_THROW(AUD_ERROR_FFMPEG, codec_error); m_output_buffer.resize(FF_MIN_BUFFER_SIZE); diff --git a/intern/ffmpeg/ffmpeg_compat.h b/intern/ffmpeg/ffmpeg_compat.h index 37cde2c2837..5492a7ba88a 100644 --- a/intern/ffmpeg/ffmpeg_compat.h +++ b/intern/ffmpeg/ffmpeg_compat.h @@ -33,6 +33,7 @@ #include <libavcodec/avcodec.h> #include <libavutil/rational.h> #include <libavutil/opt.h> +#include <libavutil/mathematics.h> #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) #define FFMPEG_HAVE_PARSE_UTILS 1 @@ -73,12 +74,68 @@ #if ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 32)) #define FFMPEG_FFV1_ALPHA_SUPPORTED +#else +static inline +int av_opt_set(void *obj, const char *name, const char *val, int search_flags) +{ + const AVOption *rv = NULL; + av_set_string3(obj, name, val, 1, &rv); + return rv != NULL; +} + +static inline +int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags) +{ + const AVOption *rv = NULL; + rv = av_set_int(obj, name, val); + return rv != NULL; +} + +static inline +int av_opt_set_double(void *obj, const char *name, double val, int search_flags) +{ + const AVOption *rv = NULL; + rv = av_set_double(obj, name, val); + return rv != NULL; +} + +#define AV_OPT_TYPE_INT FF_OPT_TYPE_INT +#define AV_OPT_TYPE_INT64 FF_OPT_TYPE_INT64 +#define AV_OPT_TYPE_STRING FF_OPT_TYPE_STRING +#define AV_OPT_TYPE_CONST FF_OPT_TYPE_CONST +#define AV_OPT_TYPE_DOUBLE FF_OPT_TYPE_DOUBLE +#define AV_OPT_TYPE_FLOAT FF_OPT_TYPE_FLOAT #endif #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR < 24)) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR < 24) && (LIBAVFORMAT_VERSION_MICRO < 2))) #define avformat_close_input(x) av_close_input_file(*(x)) #endif +#if ((LIBAVCODEC_VERSION_MAJOR < 53) || (LIBAVCODEC_VERSION_MAJOR == 53 && LIBAVCODEC_VERSION_MINOR < 42)) +static inline +int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) +{ + /* TODO: no options are taking into account */ + return avcodec_open(avctx, codec); +} +#endif + +#if ((LIBAVFORMAT_VERSION_MAJOR < 53) || (LIBAVFORMAT_VERSION_MAJOR == 53 && LIBAVFORMAT_VERSION_MINOR < 24)) +static inline +AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) +{ + /* TODO: no codec is taking into account */ + return av_new_stream(s, 0); +} + +static inline +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) +{ + /* TODO: no options are taking into account */ + return av_find_stream_info(ic); +} +#endif + #if ((LIBAVFORMAT_VERSION_MAJOR > 53) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR > 32)) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR == 24) && (LIBAVFORMAT_VERSION_MICRO >= 100))) static inline void my_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp) |