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; | ||||
| } | } | ||||