initial support for AVOption in AVFormatContext
Originally committed as revision 6108 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							
								
								
									
										14
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								ffmpeg.c
									
									
									
									
									
								
							@@ -252,6 +252,7 @@ static int sws_flags = SWS_BICUBIC;
 | 
				
			|||||||
const char **opt_names=NULL;
 | 
					const char **opt_names=NULL;
 | 
				
			||||||
int opt_name_count=0;
 | 
					int opt_name_count=0;
 | 
				
			||||||
AVCodecContext *avctx_opts;
 | 
					AVCodecContext *avctx_opts;
 | 
				
			||||||
 | 
					AVFormatContext *avformat_opts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 | 
					static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 | 
				
			||||||
static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
 | 
					static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
 | 
				
			||||||
@@ -2780,7 +2781,10 @@ static void opt_input_file(const char *filename)
 | 
				
			|||||||
                   !strcmp( filename, "/dev/stdin" );
 | 
					                   !strcmp( filename, "/dev/stdin" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* get default parameters from command line */
 | 
					    /* get default parameters from command line */
 | 
				
			||||||
 | 
					    ic = av_alloc_format_context();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memset(ap, 0, sizeof(*ap));
 | 
					    memset(ap, 0, sizeof(*ap));
 | 
				
			||||||
 | 
					    ap->prealloced_context = 1;
 | 
				
			||||||
    ap->sample_rate = audio_sample_rate;
 | 
					    ap->sample_rate = audio_sample_rate;
 | 
				
			||||||
    ap->channels = audio_channels;
 | 
					    ap->channels = audio_channels;
 | 
				
			||||||
    ap->time_base.den = frame_rate;
 | 
					    ap->time_base.den = frame_rate;
 | 
				
			||||||
@@ -2797,6 +2801,12 @@ static void opt_input_file(const char *filename)
 | 
				
			|||||||
    if(pgmyuv_compatibility_hack)
 | 
					    if(pgmyuv_compatibility_hack)
 | 
				
			||||||
        ap->video_codec_id= CODEC_ID_PGMYUV;
 | 
					        ap->video_codec_id= CODEC_ID_PGMYUV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(i=0; i<opt_name_count; i++){
 | 
				
			||||||
 | 
					        AVOption *opt;
 | 
				
			||||||
 | 
					        double d= av_get_double(avformat_opts, opt_names[i], &opt);
 | 
				
			||||||
 | 
					        if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
 | 
				
			||||||
 | 
					            av_set_double(ic, opt_names[i], d);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    /* open the input file with generic libav function */
 | 
					    /* open the input file with generic libav function */
 | 
				
			||||||
    err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
 | 
					    err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
 | 
				
			||||||
    if (err < 0) {
 | 
					    if (err < 0) {
 | 
				
			||||||
@@ -3928,6 +3938,8 @@ static void show_version(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static int opt_default(const char *opt, const char *arg){
 | 
					static int opt_default(const char *opt, const char *arg){
 | 
				
			||||||
    AVOption *o= av_set_string(avctx_opts, opt, arg);
 | 
					    AVOption *o= av_set_string(avctx_opts, opt, arg);
 | 
				
			||||||
 | 
					    if(!o)
 | 
				
			||||||
 | 
					        o = av_set_string(avformat_opts, opt, arg);
 | 
				
			||||||
    if(!o)
 | 
					    if(!o)
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4191,6 +4203,7 @@ static void show_help(void)
 | 
				
			|||||||
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
 | 
					                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
 | 
				
			||||||
                      OPT_EXPERT);
 | 
					                      OPT_EXPERT);
 | 
				
			||||||
    av_opt_show(avctx_opts, NULL);
 | 
					    av_opt_show(avctx_opts, NULL);
 | 
				
			||||||
 | 
					    av_opt_show(avformat_opts, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -4208,6 +4221,7 @@ int main(int argc, char **argv)
 | 
				
			|||||||
    av_register_all();
 | 
					    av_register_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    avctx_opts= avcodec_alloc_context();
 | 
					    avctx_opts= avcodec_alloc_context();
 | 
				
			||||||
 | 
					    avformat_opts = av_alloc_format_context();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (argc <= 1)
 | 
					    if (argc <= 1)
 | 
				
			||||||
        show_help();
 | 
					        show_help();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,6 +112,7 @@ typedef struct AVFormatParameters {
 | 
				
			|||||||
                                  mpeg2ts_raw is TRUE */
 | 
					                                  mpeg2ts_raw is TRUE */
 | 
				
			||||||
    int initial_pause:1;       /* do not begin to play the stream
 | 
					    int initial_pause:1;       /* do not begin to play the stream
 | 
				
			||||||
                                  immediately (RTSP only) */
 | 
					                                  immediately (RTSP only) */
 | 
				
			||||||
 | 
					    int prealloced_context:1;
 | 
				
			||||||
    enum CodecID video_codec_id;
 | 
					    enum CodecID video_codec_id;
 | 
				
			||||||
    enum CodecID audio_codec_id;
 | 
					    enum CodecID audio_codec_id;
 | 
				
			||||||
} AVFormatParameters;
 | 
					} AVFormatParameters;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
#include "avformat.h"
 | 
					#include "avformat.h"
 | 
				
			||||||
#include "allformats.h"
 | 
					#include "allformats.h"
 | 
				
			||||||
 | 
					#include "opt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef NDEBUG
 | 
					#undef NDEBUG
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -453,13 +454,28 @@ static const char* format_to_name(void* ptr)
 | 
				
			|||||||
    else return "NULL";
 | 
					    else return "NULL";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
 | 
					#define OFFSET(x) (int)&((AVFormatContext*)0)->x
 | 
				
			||||||
 | 
					#define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
 | 
				
			||||||
 | 
					//these names are too long to be readable
 | 
				
			||||||
 | 
					#define E AV_OPT_FLAG_ENCODING_PARAM
 | 
				
			||||||
 | 
					#define D AV_OPT_FLAG_DECODING_PARAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const AVOption options[]={
 | 
				
			||||||
 | 
					{NULL},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void avformat_get_context_defaults(AVFormatContext *s){
 | 
				
			||||||
 | 
					    memset(s, 0, sizeof(AVFormatContext));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AVFormatContext *av_alloc_format_context(void)
 | 
					AVFormatContext *av_alloc_format_context(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AVFormatContext *ic;
 | 
					    AVFormatContext *ic;
 | 
				
			||||||
    ic = av_mallocz(sizeof(AVFormatContext));
 | 
					    ic = av_mallocz(sizeof(AVFormatContext));
 | 
				
			||||||
    if (!ic) return ic;
 | 
					    if (!ic) return ic;
 | 
				
			||||||
 | 
					    avformat_get_context_defaults(ic);
 | 
				
			||||||
    ic->av_class = &av_format_context_class;
 | 
					    ic->av_class = &av_format_context_class;
 | 
				
			||||||
    return ic;
 | 
					    return ic;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -481,7 +497,10 @@ int av_open_input_stream(AVFormatContext **ic_ptr,
 | 
				
			|||||||
        memset(ap, 0, sizeof(default_ap));
 | 
					        memset(ap, 0, sizeof(default_ap));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ic = av_alloc_format_context();
 | 
					    if(!ap->prealloced_context)
 | 
				
			||||||
 | 
					        ic = av_alloc_format_context();
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        ic = *ic_ptr;
 | 
				
			||||||
    if (!ic) {
 | 
					    if (!ic) {
 | 
				
			||||||
        err = AVERROR_NOMEM;
 | 
					        err = AVERROR_NOMEM;
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user