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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!ap->prealloced_context)
|
||||||
ic = av_alloc_format_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