That way the user app can set codec specific parameters in the private context before opening it. Originally committed as revision 25257 to svn://svn.ffmpeg.org/ffmpeg/trunktags/n0.8
| @@ -3330,6 +3330,10 @@ void avcodec_get_context_defaults(AVCodecContext *s); | |||||
| * we WILL change its arguments and name a few times! */ | * we WILL change its arguments and name a few times! */ | ||||
| void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType); | void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType); | ||||
| /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! | |||||
| * we WILL change its arguments and name a few times! */ | |||||
| int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec); | |||||
| /** | /** | ||||
| * Allocate an AVCodecContext and set its fields to default values. The | * Allocate an AVCodecContext and set its fields to default values. The | ||||
| * resulting struct can be deallocated by simply calling av_free(). | * resulting struct can be deallocated by simply calling av_free(). | ||||
| @@ -3343,6 +3347,10 @@ AVCodecContext *avcodec_alloc_context(void); | |||||
| * we WILL change its arguments and name a few times! */ | * we WILL change its arguments and name a few times! */ | ||||
| AVCodecContext *avcodec_alloc_context2(enum AVMediaType); | AVCodecContext *avcodec_alloc_context2(enum AVMediaType); | ||||
| /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! | |||||
| * we WILL change its arguments and name a few times! */ | |||||
| AVCodecContext *avcodec_alloc_context3(AVCodec *codec); | |||||
| /** | /** | ||||
| * Copy the settings of the source AVCodecContext into the destination | * Copy the settings of the source AVCodecContext into the destination | ||||
| * AVCodecContext. The resulting destination codec context will be | * AVCodecContext. The resulting destination codec context will be | ||||
| @@ -467,6 +467,36 @@ void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType codec_typ | |||||
| s->reordered_opaque= AV_NOPTS_VALUE; | s->reordered_opaque= AV_NOPTS_VALUE; | ||||
| } | } | ||||
| int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec){ | |||||
| avcodec_get_context_defaults2(s, codec ? codec->type : AVMEDIA_TYPE_UNKNOWN); | |||||
| if(codec && codec->priv_data_size){ | |||||
| if(!s->priv_data){ | |||||
| s->priv_data= av_mallocz(codec->priv_data_size); | |||||
| if (!s->priv_data) { | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| } | |||||
| if(codec->priv_class){ | |||||
| *(AVClass**)s->priv_data= codec->priv_class; | |||||
| av_opt_set_defaults(s->priv_data); | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| AVCodecContext *avcodec_alloc_context3(AVCodec *codec){ | |||||
| AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); | |||||
| if(avctx==NULL) return NULL; | |||||
| if(avcodec_get_context_defaults3(avctx, codec) < 0){ | |||||
| av_free(avctx); | |||||
| return NULL; | |||||
| } | |||||
| return avctx; | |||||
| } | |||||
| AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ | AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ | ||||
| AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); | AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); | ||||
| @@ -471,11 +471,17 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | |||||
| goto end; | goto end; | ||||
| if (codec->priv_data_size > 0) { | if (codec->priv_data_size > 0) { | ||||
| if(!avctx->priv_data){ | |||||
| avctx->priv_data = av_mallocz(codec->priv_data_size); | avctx->priv_data = av_mallocz(codec->priv_data_size); | ||||
| if (!avctx->priv_data) { | if (!avctx->priv_data) { | ||||
| 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() | |||||
| *(AVClass**)avctx->priv_data= codec->priv_class; | |||||
| av_opt_set_defaults(avctx->priv_data); | |||||
| } | |||||
| } | |||||
| } else { | } else { | ||||
| avctx->priv_data = NULL; | avctx->priv_data = NULL; | ||||
| } | } | ||||