mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavc: set AVCodecContext.codec in avcodec_get_context_defaults3().
This way, if the AVCodecContext is allocated for a specific codec, the caller doesn't need to store this codec separately and then pass it again to avcodec_open2(). It also allows to set codec private options using av_opt_set_* before opening the codec.
This commit is contained in:
parent
0e72ad95f9
commit
bc90199848
@ -3525,6 +3525,11 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
|
||||
* @endcode
|
||||
*
|
||||
* @param avctx The context to initialize.
|
||||
* @param codec The codec to open this context for. If a non-NULL codec has been
|
||||
* previously passed to avcodec_alloc_context3() or
|
||||
* avcodec_get_context_defaults3() for this context, then this
|
||||
* parameter MUST be either NULL or equal to the previously passed
|
||||
* codec.
|
||||
* @param options A dictionary filled with AVCodecContext and codec-private options.
|
||||
* On return this object will be filled with options that were not found.
|
||||
*
|
||||
|
@ -432,6 +432,7 @@ int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec){
|
||||
s->av_class = &av_codec_context_class;
|
||||
|
||||
s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
|
||||
s->codec = codec;
|
||||
av_opt_set_defaults(s);
|
||||
|
||||
s->time_base = (AVRational){0,1};
|
||||
|
@ -630,6 +630,18 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
|
||||
if (avcodec_is_open(avctx))
|
||||
return 0;
|
||||
|
||||
if ((!codec && !avctx->codec)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "No codec provided to avcodec_open2().\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if ((codec && avctx->codec && codec != avctx->codec)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "This AVCodecContext was allocated for %s, "
|
||||
"but %s passed to avcodec_open2().\n", avctx->codec->name, codec->name);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (!codec)
|
||||
codec = avctx->codec;
|
||||
|
||||
if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
@ -649,11 +661,6 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
|
||||
goto end;
|
||||
}
|
||||
|
||||
if(avctx->codec || !codec) {
|
||||
ret = AVERROR(EINVAL);
|
||||
goto end;
|
||||
}
|
||||
|
||||
avctx->internal = av_mallocz(sizeof(AVCodecInternal));
|
||||
if (!avctx->internal) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
|
@ -2009,7 +2009,9 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
|
||||
if (!avcodec_is_open(st->codec)) {
|
||||
AVDictionary *thread_opt = NULL;
|
||||
|
||||
codec = avcodec_find_decoder(st->codec->codec_id);
|
||||
codec = st->codec->codec ? st->codec->codec :
|
||||
avcodec_find_decoder(st->codec->codec_id);
|
||||
|
||||
if (!codec)
|
||||
return -1;
|
||||
|
||||
@ -2169,8 +2171,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
|
||||
}
|
||||
}
|
||||
assert(!st->codec->codec);
|
||||
codec = avcodec_find_decoder(st->codec->codec_id);
|
||||
codec = st->codec->codec ? st->codec->codec :
|
||||
avcodec_find_decoder(st->codec->codec_id);
|
||||
|
||||
/* force thread count to 1 since the h264 decoder will not extract SPS
|
||||
* and PPS to extradata during multi-threaded decoding */
|
||||
|
Loading…
Reference in New Issue
Block a user