Adds support for decoder-private options and makes setting other options simpler.tags/n0.9
@@ -291,7 +291,7 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename) | |||||
if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { | if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { | ||||
fprintf(stderr, "Unsupported codec with id %d for input stream %d\n", | fprintf(stderr, "Unsupported codec with id %d for input stream %d\n", | ||||
stream->codec->codec_id, stream->index); | stream->codec->codec_id, stream->index); | ||||
} else if (avcodec_open(stream->codec, codec) < 0) { | |||||
} else if (avcodec_open2(stream->codec, codec, NULL) < 0) { | |||||
fprintf(stderr, "Error while opening codec for input stream %d\n", | fprintf(stderr, "Error while opening codec for input stream %d\n", | ||||
stream->index); | stream->index); | ||||
} | } | ||||
@@ -2117,7 +2117,7 @@ static void open_parser(AVFormatContext *s, int i) | |||||
codec = avcodec_find_decoder(st->codec->codec_id); | codec = avcodec_find_decoder(st->codec->codec_id); | ||||
if (codec && (codec->capabilities & CODEC_CAP_PARSE_ONLY)) { | if (codec && (codec->capabilities & CODEC_CAP_PARSE_ONLY)) { | ||||
st->codec->parse_only = 1; | st->codec->parse_only = 1; | ||||
if (avcodec_open(st->codec, codec) < 0) | |||||
if (avcodec_open2(st->codec, codec, NULL) < 0) | |||||
st->codec->parse_only = 0; | st->codec->parse_only = 0; | ||||
} | } | ||||
} | } | ||||
@@ -30,6 +30,7 @@ | |||||
#include "libavutil/samplefmt.h" | #include "libavutil/samplefmt.h" | ||||
#include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
#include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
#include "libavutil/dict.h" | |||||
#include "libavutil/log.h" | #include "libavutil/log.h" | ||||
#include "libavutil/pixfmt.h" | #include "libavutil/pixfmt.h" | ||||
#include "libavutil/rational.h" | #include "libavutil/rational.h" | ||||
@@ -3619,6 +3620,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v | |||||
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | ||||
//FIXME func typedef | //FIXME func typedef | ||||
#if FF_API_AVCODEC_OPEN | |||||
/** | /** | ||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this | * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | ||||
* function the context has to be allocated. | * function the context has to be allocated. | ||||
@@ -3645,8 +3647,45 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, | |||||
* @param codec The codec to use within the context. | * @param codec The codec to use within the context. | ||||
* @return zero on success, a negative value on error | * @return zero on success, a negative value on error | ||||
* @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close | * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close | ||||
* | |||||
* @deprecated use avcodec_open2 | |||||
*/ | */ | ||||
attribute_deprecated | |||||
int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | ||||
#endif | |||||
/** | |||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this | |||||
* function the context has to be allocated with avcodec_alloc_context(). | |||||
* | |||||
* The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), | |||||
* avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for | |||||
* retrieving a codec. | |||||
* | |||||
* @warning This function is not thread safe! | |||||
* | |||||
* @code | |||||
* avcodec_register_all(); | |||||
* av_dict_set(&opts, "b", "2.5M", 0); | |||||
* codec = avcodec_find_decoder(CODEC_ID_H264); | |||||
* if (!codec) | |||||
* exit(1); | |||||
* | |||||
* context = avcodec_alloc_context(); | |||||
* | |||||
* if (avcodec_open(context, codec, opts) < 0) | |||||
* exit(1); | |||||
* @endcode | |||||
* | |||||
* @param avctx The context to initialize. | |||||
* @param options A dictionary filled with AVCodecContext and codec-private options. | |||||
* On return this object will be filled with options that were not found. | |||||
* | |||||
* @return zero on success, a negative value on error | |||||
* @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), | |||||
* av_dict_set(), av_opt_find(). | |||||
*/ | |||||
int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options); | |||||
/** | /** | ||||
* Decode the audio frame of size avpkt->size from avpkt->data into samples. | * Decode the audio frame of size avpkt->size from avpkt->data into samples. | ||||
@@ -973,7 +973,7 @@ static int estimate_best_b_count(MpegEncContext *s){ | |||||
c->time_base= s->avctx->time_base; | c->time_base= s->avctx->time_base; | ||||
c->max_b_frames= s->max_b_frames; | c->max_b_frames= s->max_b_frames; | ||||
if (avcodec_open(c, codec) < 0) | |||||
if (avcodec_open2(c, codec, NULL) < 0) | |||||
return -1; | return -1; | ||||
for(i=0; i<s->max_b_frames+2; i++){ | for(i=0; i<s->max_b_frames+2; i++){ | ||||
@@ -32,6 +32,7 @@ | |||||
#include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
#include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
#include "libavutil/samplefmt.h" | #include "libavutil/samplefmt.h" | ||||
#include "libavutil/dict.h" | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "dsputil.h" | #include "dsputil.h" | ||||
#include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
@@ -467,9 +468,20 @@ AVFrame *avcodec_alloc_frame(void){ | |||||
return pic; | return pic; | ||||
} | } | ||||
#if FF_API_AVCODEC_OPEN | |||||
int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | ||||
{ | |||||
return avcodec_open2(avctx, codec, NULL); | |||||
} | |||||
#endif | |||||
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) | |||||
{ | { | ||||
int ret = 0; | int ret = 0; | ||||
AVDictionary *tmp = NULL; | |||||
if (options) | |||||
av_dict_copy(&tmp, *options, 0); | |||||
/* If there is a user-supplied mutex locking routine, call it. */ | /* If there is a user-supplied mutex locking routine, call it. */ | ||||
if (ff_lockmgr_cb) { | if (ff_lockmgr_cb) { | ||||
@@ -496,14 +508,18 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | |||||
ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
goto end; | goto end; | ||||
} | } | ||||
if(codec->priv_class){ //this can be droped once all user apps use avcodec_get_context_defaults3() | |||||
if (codec->priv_class) { | |||||
*(AVClass**)avctx->priv_data= codec->priv_class; | *(AVClass**)avctx->priv_data= codec->priv_class; | ||||
av_opt_set_defaults(avctx->priv_data); | av_opt_set_defaults(avctx->priv_data); | ||||
} | } | ||||
} | } | ||||
if (codec->priv_class && (ret = av_opt_set_dict(avctx->priv_data, &tmp) < 0)) | |||||
goto free_and_end; | |||||
} else { | } else { | ||||
avctx->priv_data = NULL; | avctx->priv_data = NULL; | ||||
} | } | ||||
if ((ret = av_opt_set_dict(avctx, &tmp)) < 0) | |||||
goto free_and_end; | |||||
if(avctx->coded_width && avctx->coded_height) | if(avctx->coded_width && avctx->coded_height) | ||||
avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | ||||
@@ -615,8 +631,14 @@ end: | |||||
if (ff_lockmgr_cb) { | if (ff_lockmgr_cb) { | ||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | ||||
} | } | ||||
if (options) { | |||||
av_dict_free(options); | |||||
*options = tmp; | |||||
} | |||||
return ret; | return ret; | ||||
free_and_end: | free_and_end: | ||||
av_dict_free(&tmp); | |||||
av_freep(&avctx->priv_data); | av_freep(&avctx->priv_data); | ||||
avctx->codec= NULL; | avctx->codec= NULL; | ||||
goto end; | goto end; | ||||
@@ -68,5 +68,8 @@ | |||||
#ifndef FF_API_GET_PIX_FMT_NAME | #ifndef FF_API_GET_PIX_FMT_NAME | ||||
#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54) | #define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54) | ||||
#endif | #endif | ||||
#ifndef FF_API_AVCODEC_OPEN | |||||
#define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
#endif | |||||
#endif /* AVCODEC_VERSION_H */ | #endif /* AVCODEC_VERSION_H */ |
@@ -139,7 +139,7 @@ static int movie_init(AVFilterContext *ctx) | |||||
return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
} | } | ||||
if ((ret = avcodec_open(movie->codec_ctx, codec)) < 0) { | |||||
if ((ret = avcodec_open2(movie->codec_ctx, codec, NULL)) < 0) { | |||||
av_log(ctx, AV_LOG_ERROR, "Failed to open codec\n"); | av_log(ctx, AV_LOG_ERROR, "Failed to open codec\n"); | ||||
return ret; | return ret; | ||||
} | } | ||||