mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavc: introduce avcodec_open2() as a replacement for avcodec_open().
Adds support for decoder-private options and makes setting other options simpler.
This commit is contained in:
parent
7f7dc4fb55
commit
0b950fe240
@ -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))) {
|
||||
fprintf(stderr, "Unsupported codec with id %d for input stream %d\n",
|
||||
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",
|
||||
stream->index);
|
||||
}
|
||||
|
@ -2117,7 +2117,7 @@ static void open_parser(AVFormatContext *s, int i)
|
||||
codec = avcodec_find_decoder(st->codec->codec_id);
|
||||
if (codec && (codec->capabilities & CODEC_CAP_PARSE_ONLY)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "libavutil/avutil.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/dict.h"
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/pixfmt.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);
|
||||
//FIXME func typedef
|
||||
|
||||
#if FF_API_AVCODEC_OPEN
|
||||
/**
|
||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
||||
* 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.
|
||||
* @return zero on success, a negative value on error
|
||||
* @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);
|
||||
#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.
|
||||
|
@ -973,7 +973,7 @@ static int estimate_best_b_count(MpegEncContext *s){
|
||||
c->time_base= s->avctx->time_base;
|
||||
c->max_b_frames= s->max_b_frames;
|
||||
|
||||
if (avcodec_open(c, codec) < 0)
|
||||
if (avcodec_open2(c, codec, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
for(i=0; i<s->max_b_frames+2; i++){
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "libavutil/audioconvert.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "libavutil/dict.h"
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "libavutil/opt.h"
|
||||
@ -467,9 +468,20 @@ AVFrame *avcodec_alloc_frame(void){
|
||||
return pic;
|
||||
}
|
||||
|
||||
#if FF_API_AVCODEC_OPEN
|
||||
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;
|
||||
AVDictionary *tmp = NULL;
|
||||
|
||||
if (options)
|
||||
av_dict_copy(&tmp, *options, 0);
|
||||
|
||||
/* If there is a user-supplied mutex locking routine, call it. */
|
||||
if (ff_lockmgr_cb) {
|
||||
@ -496,14 +508,18 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||
ret = AVERROR(ENOMEM);
|
||||
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;
|
||||
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 {
|
||||
avctx->priv_data = NULL;
|
||||
}
|
||||
if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
|
||||
goto free_and_end;
|
||||
|
||||
if(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) {
|
||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
||||
}
|
||||
if (options) {
|
||||
av_dict_free(options);
|
||||
*options = tmp;
|
||||
}
|
||||
|
||||
return ret;
|
||||
free_and_end:
|
||||
av_dict_free(&tmp);
|
||||
av_freep(&avctx->priv_data);
|
||||
avctx->codec= NULL;
|
||||
goto end;
|
||||
|
@ -68,5 +68,8 @@
|
||||
#ifndef FF_API_GET_PIX_FMT_NAME
|
||||
#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||
#endif
|
||||
#ifndef FF_API_AVCODEC_OPEN
|
||||
#define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||
#endif
|
||||
|
||||
#endif /* AVCODEC_VERSION_H */
|
||||
|
@ -139,7 +139,7 @@ static int movie_init(AVFilterContext *ctx)
|
||||
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");
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user