Commit 8d904664 authored by nicodvb's avatar nicodvb

initial support for AVOption in AVFormatContext

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@6108 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 2ddcbe32
...@@ -252,6 +252,7 @@ static int sws_flags = SWS_BICUBIC; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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 @@ ...@@ -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) ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment