2009-01-10 09:56:07 +00:00
/*
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* 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.
*
* FFmpeg is distributed in the hope that it will be useful,
* 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
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avformat.h"
2011-11-05 12:30:21 +01:00
#include "avio_internal.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-10-03 19:49:12 +02: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 12:30:21 +01:00
#if !FF_API_OLD_AVIO
if ( s -> pb && s -> pb -> av_class && prev != s -> pb )
return s -> pb ;
#endif
2011-10-03 19:49:12 +02:00
return NULL ;
}
static const AVClass * format_child_class_next ( const AVClass * prev )
2011-05-22 08:37:25 +02:00
{
AVInputFormat * ifmt = NULL ;
AVOutputFormat * ofmt = NULL ;
2011-11-13 23:43:12 +01:00
if ( ! prev )
2011-11-14 12:24:21 +01:00
#if !FF_API_OLD_AVIO
return & ffio_url_class ;
#else
prev = ( void * ) & ifmt ; // Dummy pointer;
#endif
while (( ifmt = av_iformat_next ( ifmt )))
2011-10-03 19:49:12 +02:00
if ( ifmt -> priv_class == prev )
break ;
2011-11-14 12:24:21 +01:00
if ( ! ifmt )
while (( ofmt = av_oformat_next ( ofmt )))
if ( ofmt -> priv_class == prev )
break ;
if ( ! ofmt )
2011-10-03 19:49:12 +02:00
while ( ifmt = av_iformat_next ( ifmt ))
if ( ifmt -> priv_class )
return ifmt -> priv_class ;
2011-05-22 08:37:25 +02:00
2011-11-14 12:24:21 +01:00
while ( ofmt = av_oformat_next ( ofmt ))
if ( ofmt -> priv_class )
return ofmt -> priv_class ;
2011-05-22 08:37:25 +02:00
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-10-04 07:38:01 +02:00
{ "probesize" , "set probing size" , OFFSET ( probesize ), AV_OPT_TYPE_INT , {. dbl = 5000000 }, 32 , INT_MAX , D },
2011-10-09 14:40:11 +02:00
#if FF_API_MUXRATE
2011-10-04 07:38:01 +02:00
{ "muxrate" , "set mux rate" , OFFSET ( mux_rate ), AV_OPT_TYPE_INT , {. dbl = DEFAULT }, 0 , INT_MAX , E },
2011-10-09 14:40:11 +02:00
#endif
2011-10-04 07:38:01 +02: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 07:38:01 +02: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 07:38:01 +02:00
{ "discardcorrupt" , "discard corrupted frames" , 0 , AV_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_DISCARD_CORRUPT }, INT_MIN , INT_MAX , D , "fflags" },
2011-10-13 04:55:40 +02:00
{ "sortdts" , "try to interleave outputted packets by dts" , 0 , AV_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_SORT_DTS }, INT_MIN , INT_MAX , D , "fflags" },
{ "keepside" , "dont merge side data" , 0 , AV_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_KEEP_SIDE_DATA }, INT_MIN , INT_MAX , D , "fflags" },
{ "latm" , "enable RTP MP4A-LATM payload" , 0 , AV_OPT_TYPE_CONST , {. dbl = AVFMT_FLAG_MP4A_LATM }, INT_MIN , INT_MAX , E , "fflags" },
2011-10-04 07:38:01 +02:00
{ "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 },
2011-10-26 22:17:08 +02:00
{ "audio_preload" , "microseconds by which audio packets should be interleaved earlier" , OFFSET ( audio_preload ), AV_OPT_TYPE_INT , {. dbl = 0 }, 0 , INT_MAX - 1 , E },
2011-11-30 00:21:00 +01:00
{ "chunk_duration" , "microseconds for each chunk" , OFFSET ( max_chunk_duration ), AV_OPT_TYPE_INT , {. dbl = 0 }, 0 , INT_MAX - 1 , E },
{ "chunk_size" , "size in bytes for each chunk" , OFFSET ( max_chunk_size ), AV_OPT_TYPE_INT , {. dbl = 0 }, 0 , INT_MAX - 1 , E },
2012-01-20 03:53:54 -05: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" },
2012-01-21 23:46:36 +01:00
{ "careful" , "consider things that violate the spec and have not been seen in the wild as errors" , 0 , AV_OPT_TYPE_CONST , {. dbl = AV_EF_CAREFUL }, INT_MIN , INT_MAX , D , "err_detect" },
{ "compliant" , "consider all spec non compliancies as errors" , 0 , AV_OPT_TYPE_CONST , {. dbl = AV_EF_COMPLIANT }, INT_MIN , INT_MAX , D , "err_detect" },
{ "aggressive" , "consider things that a sane encoder shouldnt do as an error" , 0 , AV_OPT_TYPE_CONST , {. dbl = AV_EF_AGGRESSIVE }, INT_MIN , INT_MAX , D , "err_detect" },
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-10-03 19:49:12 +02:00
. child_next = format_child_next ,
. child_class_next = format_child_class_next ,
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 ;
}