2009-01-10 09:56:07 +00:00
/*
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
*
2011-03-18 17:35:10 +00:00
* This file is part of Libav.
2009-01-10 09:56:07 +00:00
*
2011-03-18 17:35:10 +00:00
* Libav is free software; you can redistribute it and/or
2009-01-10 09:56:07 +00:00
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
2011-03-18 17:35:10 +00:00
* Libav is distributed in the hope that it will be useful,
2009-01-10 09:56:07 +00:00
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
2011-03-18 17:35:10 +00:00
* License along with Libav; if not, write to the Free Software
2009-01-10 09:56:07 +00:00
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avformat.h"
2010-09-26 14:25:22 +00:00
#include "libavutil/opt.h"
2009-01-10 09:56:07 +00:00
/**
2010-04-20 14:45:34 +00:00
* @file
2009-01-10 09:56:07 +00:00
* Options definition for AVFormatContext.
*/
static const char * format_to_name ( void * ptr )
{
AVFormatContext * fc = ( AVFormatContext * ) ptr ;
if ( fc -> iformat ) return fc -> iformat -> name ;
else if ( fc -> oformat ) return fc -> oformat -> name ;
else return "NULL" ;
}
2011-05-22 08:37:25 +02:00
static const AVOption * opt_find ( void * obj , const char * name , const char * unit , int opt_flags , int search_flags )
{
AVFormatContext * s = obj ;
AVInputFormat * ifmt = NULL ;
AVOutputFormat * ofmt = NULL ;
2011-08-23 07:11:26 +02:00
if ( ! ( search_flags & AV_OPT_SEARCH_FAKE_OBJ ) && s -> priv_data ) {
2011-05-22 08:37:25 +02:00
if (( s -> iformat && ! s -> iformat -> priv_class ) ||
( s -> oformat && ! s -> oformat -> priv_class ))
return NULL ;
return av_opt_find ( s -> priv_data , name , unit , opt_flags , search_flags );
}
while (( ifmt = av_iformat_next ( ifmt ))) {
const AVOption * o ;
if ( ifmt -> priv_class && ( o = av_opt_find ( & ifmt -> priv_class , name , unit , opt_flags , search_flags )))
return o ;
}
while (( ofmt = av_oformat_next ( ofmt ))) {
const AVOption * o ;
if ( ofmt -> priv_class && ( o = av_opt_find ( & ofmt -> priv_class , name , unit , opt_flags , search_flags )))
return o ;
}
return NULL ;
}
2009-01-10 09:56:07 +00:00
#define OFFSET(x) offsetof(AVFormatContext,x)
#define DEFAULT 0 //should be NAN but it does not work as it is 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 [] = {
2011-04-30 07:43:26 +02:00
{ "probesize" , "set probing size" , OFFSET ( probesize ), FF_OPT_TYPE_INT , {. dbl = 5000000 }, 32 , INT_MAX , D },
{ "muxrate" , "set mux rate" , OFFSET ( mux_rate ), FF_OPT_TYPE_INT , {. dbl = DEFAULT }, 0 , INT_MAX , E },
{ "packetsize" , "set packet size" , OFFSET ( packet_size ), FF_OPT_TYPE_INT , {. dbl = DEFAULT }, 0 , INT_MAX , E },
{ "fflags" , NULL , OFFSET ( flags ), FF_OPT_TYPE_FLAGS , {. dbl = DEFAULT }, INT_MIN , INT_MAX , D | E , "fflags" },
{ "ignidx" , "ignore index" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_IGNIDX }, INT_MIN , INT_MAX , D , "fflags" },
{ "genpts" , "generate pts" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_GENPTS }, INT_MIN , INT_MAX , D , "fflags" },
{ "nofillin" , "do not fill in missing values that can be exactly calculated" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_NOFILLIN }, INT_MIN , INT_MAX , D , "fflags" },
{ "noparse" , "disable AVParsers, this needs nofillin too" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_NOPARSE }, INT_MIN , INT_MAX , D , "fflags" },
{ "igndts" , "ignore dts" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_IGNDTS }, INT_MIN , INT_MAX , D , "fflags" },
2011-05-20 12:27:02 +03:00
#if FF_API_FLAG_RTP_HINT
{ "rtphint" , "add rtp hinting (deprecated, use the -movflags rtphint option instead)" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_RTP_HINT }, INT_MIN , INT_MAX , E , "fflags" },
#endif
2011-07-24 17:28:33 +03:00
{ "discardcorrupt" , "discard corrupted frames" , 0 , FF_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_DISCARD_CORRUPT }, INT_MIN , INT_MAX , D , "fflags" },
2011-04-30 07:43:26 +02:00
{ "analyzeduration" , "how many microseconds are analyzed to estimate duration" , OFFSET ( max_analyze_duration ), FF_OPT_TYPE_INT , {. dbl = 5 * AV_TIME_BASE }, 0 , INT_MAX , D },
{ "cryptokey" , "decryption key" , OFFSET ( key ), FF_OPT_TYPE_BINARY , {. dbl = 0 }, 0 , 0 , D },
{ "indexmem" , "max memory used for timestamp index (per stream)" , OFFSET ( max_index_size ), FF_OPT_TYPE_INT , {. dbl = 1 << 20 }, 0 , INT_MAX , D },
{ "rtbufsize" , "max memory used for buffering real-time frames" , OFFSET ( max_picture_buffer ), FF_OPT_TYPE_INT , {. dbl = 3041280 }, 0 , INT_MAX , D }, /* defaults to 1s of 15fps 352x288 YUYV422 video */
{ "fdebug" , "print specific debug info" , OFFSET ( debug ), FF_OPT_TYPE_FLAGS , {. dbl = DEFAULT }, 0 , INT_MAX , E | D , "fdebug" },
{ "ts" , NULL , 0 , FF_OPT_TYPE_CONST , {. dbl = FF_FDEBUG_TS }, INT_MIN , INT_MAX , E | D , "fdebug" },
{ "max_delay" , "maximum muxing or demuxing delay in microseconds" , OFFSET ( max_delay ), FF_OPT_TYPE_INT , {. dbl = DEFAULT }, 0 , INT_MAX , E | D },
2011-08-06 04:42:34 +00:00
{ "fer" , "set error detection aggressivity" , OFFSET ( error_recognition ), FF_OPT_TYPE_INT , {. dbl = FF_ER_CAREFUL }, INT_MIN , INT_MAX , D , "fer" },
{ "careful" , NULL , 0 , FF_OPT_TYPE_CONST , {. dbl = FF_ER_CAREFUL }, INT_MIN , INT_MAX , D , "fer" },
{ "explode" , "abort decoding on error recognition" , 0 , FF_OPT_TYPE_CONST , {. dbl = FF_ER_EXPLODE }, INT_MIN , INT_MAX , D , "fer" },
2011-06-08 14:59:47 +02:00
{ "fpsprobesize" , "number of frames used to probe fps" , OFFSET ( fps_probe_size ), FF_OPT_TYPE_INT , {. dbl = - 1 }, - 1 , INT_MAX - 1 , D },
2009-01-10 09:56:07 +00:00
{ NULL },
};
#undef E
#undef D
#undef DEFAULT
2011-04-29 11:30:02 +02:00
static const AVClass av_format_context_class = {
. class_name = "AVFormatContext" ,
. item_name = format_to_name ,
. option = options ,
. version = LIBAVUTIL_VERSION_INT ,
2011-05-22 08:37:25 +02:00
. opt_find = opt_find ,
2011-04-29 11:30:02 +02:00
};
2009-01-10 09:56:07 +00:00
static void avformat_get_context_defaults ( AVFormatContext * s )
{
memset ( s , 0 , sizeof ( AVFormatContext ));
s -> av_class = & av_format_context_class ;
av_opt_set_defaults ( s );
}
2009-02-08 08:16:40 +00:00
AVFormatContext * avformat_alloc_context ( void )
2009-01-10 09:56:07 +00:00
{
AVFormatContext * ic ;
ic = av_malloc ( sizeof ( AVFormatContext ));
if ( ! ic ) return ic ;
avformat_get_context_defaults ( ic );
return ic ;
}
2011-08-23 07:23:52 +02:00
const AVClass * avformat_get_class ( void )
{
return & av_format_context_class ;
}