[FFmpeg-cvslog] r25257 - in trunk/libavcodec: avcodec.h options.c utils.c
michael
subversion
Wed Sep 29 17:05:47 CEST 2010
Author: michael
Date: Wed Sep 29 17:05:47 2010
New Revision: 25257
Log:
Move allocation and init to defaults of the private codec contexts to avcodec_get_context_defaults3().
That way the user app can set codec specific parameters in the private context
before opening it.
Modified:
trunk/libavcodec/avcodec.h
trunk/libavcodec/options.c
trunk/libavcodec/utils.c
Modified: trunk/libavcodec/avcodec.h
==============================================================================
--- trunk/libavcodec/avcodec.h Wed Sep 29 16:04:39 2010 (r25256)
+++ trunk/libavcodec/avcodec.h Wed Sep 29 17:05:47 2010 (r25257)
@@ -3330,6 +3330,10 @@ void avcodec_get_context_defaults(AVCode
* we WILL change its arguments and name a few times! */
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
* resulting struct can be deallocated by simply calling av_free().
@@ -3343,6 +3347,10 @@ AVCodecContext *avcodec_alloc_context(vo
* we WILL change its arguments and name a few times! */
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
* AVCodecContext. The resulting destination codec context will be
Modified: trunk/libavcodec/options.c
==============================================================================
--- trunk/libavcodec/options.c Wed Sep 29 16:04:39 2010 (r25256)
+++ trunk/libavcodec/options.c Wed Sep 29 17:05:47 2010 (r25257)
@@ -467,6 +467,36 @@ void avcodec_get_context_defaults2(AVCod
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 *avctx= av_malloc(sizeof(AVCodecContext));
Modified: trunk/libavcodec/utils.c
==============================================================================
--- trunk/libavcodec/utils.c Wed Sep 29 16:04:39 2010 (r25256)
+++ trunk/libavcodec/utils.c Wed Sep 29 17:05:47 2010 (r25257)
@@ -471,11 +471,17 @@ int attribute_align_arg avcodec_open(AVC
goto end;
if (codec->priv_data_size > 0) {
+ if(!avctx->priv_data){
avctx->priv_data = av_mallocz(codec->priv_data_size);
if (!avctx->priv_data) {
ret = AVERROR(ENOMEM);
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 {
avctx->priv_data = NULL;
}
More information about the ffmpeg-cvslog
mailing list