2009-01-10 11:56:07 +02:00
/*
* Copyright ( c ) 2000 , 2001 , 2002 Fabrice Bellard
*
2011-03-18 19:35:10 +02:00
* This file is part of Libav .
2009-01-10 11:56:07 +02:00
*
2011-03-18 19:35:10 +02:00
* Libav is free software ; you can redistribute it and / or
2009-01-10 11:56:07 +02: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 19:35:10 +02:00
* Libav is distributed in the hope that it will be useful ,
2009-01-10 11:56:07 +02: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 19:35:10 +02:00
* License along with Libav ; if not , write to the Free Software
2009-01-10 11:56:07 +02:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "avformat.h"
2011-11-05 14:30:21 +03:00
# include "avio_internal.h"
2010-09-26 17:25:22 +03:00
# include "libavutil/opt.h"
2009-01-10 11:56:07 +02:00
/**
2010-04-20 17:45:34 +03:00
* @ file
2009-01-10 11:56:07 +02: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-10-03 20:49:12 +03:00
static void * format_child_next ( void * obj , void * prev )
{
AVFormatContext * s = obj ;
if ( ! prev & & s - > priv_data & &
( ( s - > iformat & & s - > iformat - > priv_class ) | |
s - > oformat & & s - > oformat - > priv_class ) )
return s - > priv_data ;
2011-11-05 14:30:21 +03:00
if ( s - > pb & & s - > pb - > av_class & & prev ! = s - > pb )
return s - > pb ;
2011-10-03 20:49:12 +03:00
return NULL ;
}
static const AVClass * format_child_class_next ( const AVClass * prev )
2011-05-22 09:37:25 +03:00
{
AVInputFormat * ifmt = NULL ;
AVOutputFormat * ofmt = NULL ;
2011-10-03 20:49:12 +03:00
2011-11-14 14:24:21 +03:00
if ( ! prev )
return & ffio_url_class ;
while ( ( ifmt = av_iformat_next ( ifmt ) ) )
2011-10-03 20:49:12 +03:00
if ( ifmt - > priv_class = = prev )
break ;
2011-11-14 14:24:21 +03:00
if ( ! ifmt )
while ( ( ofmt = av_oformat_next ( ofmt ) ) )
if ( ofmt - > priv_class = = prev )
break ;
if ( ! ofmt )
2011-10-03 20:49:12 +03:00
while ( ifmt = av_iformat_next ( ifmt ) )
if ( ifmt - > priv_class )
return ifmt - > priv_class ;
2011-11-14 14:24:21 +03:00
while ( ofmt = av_oformat_next ( ofmt ) )
if ( ofmt - > priv_class )
return ofmt - > priv_class ;
2011-10-03 20:49:12 +03:00
2011-05-22 09:37:25 +03:00
return NULL ;
}
2009-01-10 11:56:07 +02: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-10-04 08:38:01 +03:00
{ " probesize " , " set probing size " , OFFSET ( probesize ) , AV_OPT_TYPE_INT , { . dbl = 5000000 } , 32 , INT_MAX , D } ,
2011-10-09 15:40:11 +03:00
# if FF_API_MUXRATE
2011-10-04 08:38:01 +03:00
{ " muxrate " , " set mux rate " , OFFSET ( mux_rate ) , AV_OPT_TYPE_INT , { . dbl = DEFAULT } , 0 , INT_MAX , E } ,
2011-10-09 15:40:11 +03:00
# endif
2011-10-04 08:38:01 +03:00
{ " packetsize " , " set packet size " , OFFSET ( packet_size ) , AV_OPT_TYPE_INT , { . dbl = DEFAULT } , 0 , INT_MAX , E } ,
{ " fflags " , NULL , OFFSET ( flags ) , AV_OPT_TYPE_FLAGS , { . dbl = DEFAULT } , INT_MIN , INT_MAX , D | E , " fflags " } ,
{ " ignidx " , " ignore index " , 0 , AV_OPT_TYPE_CONST , { . dbl = AVFMT_FLAG_IGNIDX } , INT_MIN , INT_MAX , D , " fflags " } ,
{ " genpts " , " generate pts " , 0 , AV_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 , AV_OPT_TYPE_CONST , { . dbl = AVFMT_FLAG_NOFILLIN } , INT_MIN , INT_MAX , D , " fflags " } ,
{ " noparse " , " disable AVParsers, this needs nofillin too " , 0 , AV_OPT_TYPE_CONST , { . dbl = AVFMT_FLAG_NOPARSE } , INT_MIN , INT_MAX , D , " fflags " } ,
{ " igndts " , " ignore dts " , 0 , AV_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
2011-10-04 08:38:01 +03:00
{ " rtphint " , " add rtp hinting (deprecated, use the -movflags rtphint option instead) " , 0 , AV_OPT_TYPE_CONST , { . dbl = AVFMT_FLAG_RTP_HINT } , INT_MIN , INT_MAX , E , " fflags " } ,
2011-05-20 12:27:02 +03:00
# endif
2011-10-04 08:38:01 +03:00
{ " discardcorrupt " , " discard corrupted frames " , 0 , AV_OPT_TYPE_CONST , { . dbl = AVFMT_FLAG_DISCARD_CORRUPT } , INT_MIN , INT_MAX , D , " fflags " } ,
{ " analyzeduration " , " how many microseconds are analyzed to estimate duration " , OFFSET ( max_analyze_duration ) , AV_OPT_TYPE_INT , { . dbl = 5 * AV_TIME_BASE } , 0 , INT_MAX , D } ,
{ " cryptokey " , " decryption key " , OFFSET ( key ) , AV_OPT_TYPE_BINARY , { . dbl = 0 } , 0 , 0 , D } ,
{ " indexmem " , " max memory used for timestamp index (per stream) " , OFFSET ( max_index_size ) , AV_OPT_TYPE_INT , { . dbl = 1 < < 20 } , 0 , INT_MAX , D } ,
{ " rtbufsize " , " max memory used for buffering real-time frames " , OFFSET ( max_picture_buffer ) , AV_OPT_TYPE_INT , { . dbl = 3041280 } , 0 , INT_MAX , D } , /* defaults to 1s of 15fps 352x288 YUYV422 video */
{ " fdebug " , " print specific debug info " , OFFSET ( debug ) , AV_OPT_TYPE_FLAGS , { . dbl = DEFAULT } , 0 , INT_MAX , E | D , " fdebug " } ,
{ " ts " , NULL , 0 , AV_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 ) , AV_OPT_TYPE_INT , { . dbl = DEFAULT } , 0 , INT_MAX , E | D } ,
{ " fpsprobesize " , " number of frames used to probe fps " , OFFSET ( fps_probe_size ) , AV_OPT_TYPE_INT , { . dbl = - 1 } , - 1 , INT_MAX - 1 , D } ,
2012-01-20 11:53:54 +03:00
/* this is a crutch for avconv, since it cannot deal with identically named options in different contexts.
* to be removed when avconv is fixed */
{ " f_err_detect " , " set error detection flags (deprecated; use err_detect, save via avconv) " , OFFSET ( error_recognition ) , AV_OPT_TYPE_FLAGS , { . dbl = AV_EF_CRCCHECK } , INT_MIN , INT_MAX , D , " err_detect " } ,
{ " err_detect " , " set error detection flags " , OFFSET ( error_recognition ) , AV_OPT_TYPE_FLAGS , { . dbl = AV_EF_CRCCHECK } , INT_MIN , INT_MAX , D , " err_detect " } ,
{ " crccheck " , " verify embedded CRCs " , 0 , AV_OPT_TYPE_CONST , { . dbl = AV_EF_CRCCHECK } , INT_MIN , INT_MAX , D , " err_detect " } ,
{ " bitstream " , " detect bitstream specification deviations " , 0 , AV_OPT_TYPE_CONST , { . dbl = AV_EF_BITSTREAM } , INT_MIN , INT_MAX , D , " err_detect " } ,
{ " buffer " , " detect improper bitstream length " , 0 , AV_OPT_TYPE_CONST , { . dbl = AV_EF_BUFFER } , INT_MIN , INT_MAX , D , " err_detect " } ,
{ " explode " , " abort decoding on minor error detection " , 0 , AV_OPT_TYPE_CONST , { . dbl = AV_EF_EXPLODE } , INT_MIN , INT_MAX , D , " err_detect " } ,
2009-01-10 11:56:07 +02:00
{ NULL } ,
} ;
# undef E
# undef D
# undef DEFAULT
2011-04-29 12:30:02 +03:00
static const AVClass av_format_context_class = {
. class_name = " AVFormatContext " ,
. item_name = format_to_name ,
. option = options ,
. version = LIBAVUTIL_VERSION_INT ,
2011-10-03 20:49:12 +03:00
. child_next = format_child_next ,
. child_class_next = format_child_class_next ,
2011-04-29 12:30:02 +03:00
} ;
2009-01-10 11:56:07 +02: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 10:16:40 +02:00
AVFormatContext * avformat_alloc_context ( void )
2009-01-10 11:56:07 +02:00
{
AVFormatContext * ic ;
ic = av_malloc ( sizeof ( AVFormatContext ) ) ;
if ( ! ic ) return ic ;
avformat_get_context_defaults ( ic ) ;
return ic ;
}
2011-08-23 08:23:52 +03:00
const AVClass * avformat_get_class ( void )
{
return & av_format_context_class ;
}