From c03bb84ce50794bab234b1c5cbfa74f6e8e3c6f2 Mon Sep 17 00:00:00 2001 From: lotanrm Date: Thu, 17 May 2012 17:32:26 +0000 Subject: Added support for ffmpeg-0.10. git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@2883 b956fd51-792f-4845-bead-9b4dfca2ff2c --- src/lib/ffmpeg-0.10/avcodec.pas | 1277 ++++++++++++++------- src/lib/ffmpeg-0.10/avformat.pas | 1651 +++++++++++++++++++-------- src/lib/ffmpeg-0.10/avio.pas | 137 ++- src/lib/ffmpeg-0.10/avutil.pas | 333 +----- src/lib/ffmpeg-0.10/libavutil/dict.pas | 8 +- src/lib/ffmpeg-0.10/libavutil/mem.pas | 14 +- src/lib/ffmpeg-0.10/libavutil/opt.pas | 406 +------ src/lib/ffmpeg-0.10/libavutil/pixfmt.pas | 2 +- src/lib/ffmpeg-0.10/libavutil/samplefmt.pas | 2 +- src/media/UAudioDecoder_FFmpeg.pas | 64 +- src/media/UMediaCore_FFmpeg.pas | 6 +- src/media/UVideo.pas | 38 +- 12 files changed, 2223 insertions(+), 1715 deletions(-) (limited to 'src') diff --git a/src/lib/ffmpeg-0.10/avcodec.pas b/src/lib/ffmpeg-0.10/avcodec.pas index b2ed9fd2..6e4a9a32 100644 --- a/src/lib/ffmpeg-0.10/avcodec.pas +++ b/src/lib/ffmpeg-0.10/avcodec.pas @@ -78,10 +78,11 @@ const * you start working on it). Simply adjusting the max. versions is NOT a valid * fix. *) + (* Supported version by this header *) - LIBAVCODEC_MAX_VERSION_MAJOR = 52; - LIBAVCODEC_MAX_VERSION_MINOR = 122; - LIBAVCODEC_MAX_VERSION_RELEASE = 0; + LIBAVCODEC_MAX_VERSION_MAJOR = 53; + LIBAVCODEC_MAX_VERSION_MINOR = 61; + LIBAVCODEC_MAX_VERSION_RELEASE = 100; LIBAVCODEC_MAX_VERSION = (LIBAVCODEC_MAX_VERSION_MAJOR * VERSION_MAJOR) + (LIBAVCODEC_MAX_VERSION_MINOR * VERSION_MINOR) + (LIBAVCODEC_MAX_VERSION_RELEASE * VERSION_RELEASE); @@ -108,69 +109,94 @@ const * Those FF_API_* defines are not part of public API. * They may change, break or disappear at any time. *) -const +{$macro on} {$ifndef FF_API_PALETTE_CONTROL} - FF_API_PALETTE_CONTROL = LIBAVCODEC_VERSION_MAJOR < 54; +{$define FF_API_PALETTE_CONTROL := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_MM_FLAGS} - FF_API_MM_FLAGS = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_OLD_SAMPLE_FMT} +{$define FF_API_OLD_SAMPLE_FMT := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_OPT_SHOW} - FF_API_OPT_SHOW = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_OLD_AUDIOCONVERT} +{$define FF_API_OLD_AUDIOCONVERT := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_AUDIO_OLD} - FF_API_AUDIO_OLD = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_ANTIALIAS_ALGO} +{$define FF_API_ANTIALIAS_ALGO := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_VIDEO_OLD} - FF_API_VIDEO_OLD = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_REQUEST_CHANNELS} +{$define FF_API_REQUEST_CHANNELS := (LIBAVCODEC_VERSION_MAJOR < 55)} {$endif} -{$ifndef FF_API_SUBTITLE_OLD} - FF_API_SUBTITLE_OLD = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_OPT_H} +{$define FF_API_OPT_H := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_USE_LPC} - FF_API_USE_LPC = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_THREAD_INIT} +{$define FF_API_THREAD_INIT := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_SET_STRING_OLD} - FF_API_SET_STRING_OLD = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_OLD_FF_PICT_TYPES} +{$define FF_API_OLD_FF_PICT_TYPES := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_INOFFICIAL} - FF_API_INOFFICIAL = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_FLAC_GLOBAL_OPTS} +{$define FF_API_FLAC_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_OLD_SAMPLE_FMT} - FF_API_OLD_SAMPLE_FMT = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_GET_PIX_FMT_NAME} +{$define FF_API_GET_PIX_FMT_NAME := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_OLD_AUDIOCONVERT} - FF_API_OLD_AUDIOCONVERT = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_ALLOC_CONTEXT} +{$define FF_API_ALLOC_CONTEXT := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_HURRY_UP} - FF_API_HURRY_UP = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_AVCODEC_OPEN} +{$define FF_API_AVCODEC_OPEN := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_RATE_EMU} - FF_API_RATE_EMU = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_DRC_SCALE} +{$define FF_API_DRC_SCALE := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_MB_Q} - FF_API_MB_Q = LIBAVCODEC_VERSION_MAJOR < 53; +{$ifndef FF_API_ER} +{$define FF_API_ER := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_ANTIALIAS_ALGO} - FF_API_ANTIALIAS_ALGO = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_AVCODEC_INIT} +{$define FF_API_AVCODEC_INIT := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_REQUEST_CHANNELS} - FF_API_REQUEST_CHANNELS = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_X264_GLOBAL_OPTS} +{$define FF_API_X264_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_OPT_H} - FF_API_OPT_H = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_MPEGVIDEO_GLOBAL_OPTS} +//{$define FF_API_MPEGVIDEO_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_THREAD_INIT} - FF_API_THREAD_INIT = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_LAME_GLOBAL_OPTS} +//{$define FF_API_LAME_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_OLD_FF_PICT_TYPES} - FF_API_OLD_FF_PICT_TYPES = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_SNOW_GLOBAL_OPTS} +//{$define FF_API_SNOW_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_FLAC_GLOBAL_OPTS} - FF_API_FLAC_GLOBAL_OPTS = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_MJPEG_GLOBAL_OPTS} +//{$define FF_API_MJPEG_GLOBAL_OPTS := (LIBAVCODEC_VERSION_MAJOR < 54)} {$endif} -{$ifndef FF_API_GET_PIX_FMT_NAME} - FF_API_GET_PIX_FMT_NAME = LIBAVCODEC_VERSION_MAJOR < 54; +{$ifndef FF_API_GET_ALPHA_INFO} +{$define FF_API_GET_ALPHA_INFO := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_PARSE_FRAME} +{$define FF_API_PARSE_FRAME := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_INTERNAL_CONTEXT} +{$define FF_API_INTERNAL_CONTEXT := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_TIFFENC_COMPLEVEL} +{$define FF_API_TIFFENC_COMPLEVEL := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_DATA_POINTERS} +{$define FF_API_DATA_POINTERS := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_OLD_DECODE_AUDIO} +{$define FF_API_OLD_DECODE_AUDIO := (LIBAVCODEC_VERSION_MAJOR < 55)} +{$endif} +{$ifndef FF_API_OLD_TIMECODE} +{$define FF_API_OLD_TIMECODE := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} + +{$ifndef FF_API_AVFRAME_AGE} +{$define FF_API_AVFRAME_AGE := (LIBAVCODEC_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_OLD_ENCODE_AUDIO} +{$define FF_API_OLD_ENCODE_AUDIO := (LIBAVCODEC_VERSION_MAJOR < 55)} {$endif} type @@ -260,9 +286,6 @@ type CODEC_ID_QDRAW, CODEC_ID_VIXL, CODEC_ID_QPEG, -{$IF LIBAVCODEC_VERSION_MAJOR < 53} - CODEC_ID_XVID, -{$IFEND} CODEC_ID_PNG, CODEC_ID_PPM, CODEC_ID_PBM, @@ -300,7 +323,9 @@ type CODEC_ID_TIERTEXSEQVIDEO, CODEC_ID_TIFF, CODEC_ID_GIF, +{$IFDEF LIBAVCODEC_VERSION_MAJOR == 53} CODEC_ID_FFH264, +{$ENDIF} CODEC_ID_DXA, CODEC_ID_DNXHD, CODEC_ID_THP, @@ -318,8 +343,10 @@ type CODEC_ID_INDEO5, CODEC_ID_MIMIC, CODEC_ID_RL2, +{$IF LIBAVCODEC_VERSION_MAJOR = 53} CODEC_ID_8SVX_EXP, CODEC_ID_8SVX_FIB, +{$ENDIF} CODEC_ID_ESCAPE124, CODEC_ID_DIRAC, CODEC_ID_BFI, @@ -356,10 +383,22 @@ type CODEC_ID_PRORES, CODEC_ID_JV, CODEC_ID_DFA, - CODEC_ID_8SVX_RAW, - + CODEC_ID_WMV3IMAGE, + CODEC_ID_VC1IMAGE, +{$IF LIBAVCODEC_VERSION_MAJOR = 53} + CODEC_ID_G723_1_DEPRECATED, + CODEC_ID_G729_DEPRECATED, +{$ENDIF} + CODEC_ID_UTVIDEO_DEPRECATED, + CODEC_ID_BMV_VIDEO, + CODEC_ID_VBLE, + CODEC_ID_DXTORY, + CODEC_ID_V410, + CODEC_ID_XWD, + CODEC_ID_UTVIDEO = $0800, + //* various PCM "codecs" */ - CODEC_ID_PCM_S16LE= $10000, + CODEC_ID_PCM_S16LE = $10000, CODEC_ID_PCM_S16BE, CODEC_ID_PCM_U16LE, CODEC_ID_PCM_U16BE, @@ -386,9 +425,10 @@ type CODEC_ID_PCM_BLURAY, CODEC_ID_PCM_LXF, CODEC_ID_S302M, + CODEC_ID_PCM_S8_PLANAR, //* various ADPCM codecs */ - CODEC_ID_ADPCM_IMA_QT= $11000, + CODEC_ID_ADPCM_IMA_QT = $11000, CODEC_ID_ADPCM_IMA_WAV, CODEC_ID_ADPCM_IMA_DK3, CODEC_ID_ADPCM_IMA_DK4, @@ -417,23 +457,24 @@ type CODEC_ID_ADPCM_EA_MAXIS_XA, CODEC_ID_ADPCM_IMA_ISS, CODEC_ID_ADPCM_G722, + CODEC_ID_ADPCM_IMA_APC, //* AMR */ - CODEC_ID_AMR_NB= $12000, + CODEC_ID_AMR_NB = $12000, CODEC_ID_AMR_WB, //* RealAudio codecs*/ - CODEC_ID_RA_144= $13000, + CODEC_ID_RA_144 = $13000, CODEC_ID_RA_288, //* various DPCM codecs */ - CODEC_ID_ROQ_DPCM= $14000, + CODEC_ID_ROQ_DPCM = $14000, CODEC_ID_INTERPLAY_DPCM, CODEC_ID_XAN_DPCM, CODEC_ID_SOL_DPCM, //* audio codecs */ - CODEC_ID_MP2= $15000, + CODEC_ID_MP2 = $15000, CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 CODEC_ID_AAC, CODEC_ID_AC3, @@ -445,8 +486,10 @@ type CODEC_ID_MACE3, CODEC_ID_MACE6, CODEC_ID_VMDAUDIO, +{$IF LIBAVCODEC_VERSION_MAJOR = 53} CODEC_ID_SONIC, CODEC_ID_SONIC_LS, +{$ENDIF} CODEC_ID_FLAC, CODEC_ID_MP3ADU, CODEC_ID_MP3ON4, @@ -488,9 +531,18 @@ type CODEC_ID_AAC_LATM, CODEC_ID_QDMC, CODEC_ID_CELT, - +//{$IF LIBAVCODEC_VERSION_MAJOR = 53} +// CODEC_ID_G723_1_DEPRECATED, +// CODEC_ID_G729_DEPRECATED, +// CODEC_ID_8SVX_EXP, +// CODEC_ID_8SVX_FIB, +//{$ENDIF} + CODEC_ID_BMV_AUDIO, + CODEC_ID_G729 = $15800, + CODEC_ID_G723_1= $15801, + //* subtitle codecs */ - CODEC_ID_DVD_SUBTITLE= $17000, + CODEC_ID_DVD_SUBTITLE = $17000, CODEC_ID_DVB_SUBTITLE, CODEC_ID_TEXT, ///< raw UTF-8 text CODEC_ID_XSUB, @@ -499,16 +551,30 @@ type CODEC_ID_HDMV_PGS_SUBTITLE, CODEC_ID_DVB_TELETEXT, CODEC_ID_SRT, - CODEC_ID_MICRODVD, //* other specific kind of codecs (generally used for attachments) */ - CODEC_ID_TTF= $18000, - - CODEC_ID_PROBE= $19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it + CODEC_ID_TTF = $18000, + + CODEC_ID_PROBE = $19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it - CODEC_ID_MPEG2TS= $20000, (**< _FAKE_ codec to indicate a raw MPEG-2 TS + CODEC_ID_MPEG2TS = $20000, (**< _FAKE_ codec to indicate a raw MPEG-2 TS * stream (only used by libavformat) *) - CODEC_ID_FFMETADATA= $21000 ///< Dummy codec for streams containing only metadata information. + CODEC_ID_MPEG4SYSTEMS = $20001, (**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) *) + CODEC_ID_FFMETADATA = $21000, ///< Dummy codec for streams containing only metadata information. + + CODEC_ID_G2M = $0047324D, + CODEC_ID_IDF = $00494446, + CODEC_ID_8SVX_RAW = $38535658, + CODEC_ID_AVRP = $41565250, + CODEC_ID_BINTEXT = $42545854, + CODEC_ID_ESCAPE130 = $45313330, + CODEC_ID_FFWAVESYNTH = $46465753, + CODEC_ID_V308 = $56333038, + CODEC_ID_XBIN = $5842494E, + CODEC_ID_Y41P = $59343150, + CODEC_ID_YUV4 = $59555634, + CODEC_ID_MICRODVD = $6D445644 ); type @@ -523,7 +589,7 @@ const CODEC_TYPE_ATTACHMENT = AVMEDIA_TYPE_ATTACHMENT; CODEC_TYPE_NB = AVMEDIA_TYPE_NB; -{$IF FF_API_OLD_AUDIOCONVERT} +{$IFDEF FF_API_OLD_AUDIOCONVERT} {$I libavcodec/audioconvert.pas} @@ -574,8 +640,10 @@ const CH_LAYOUT_STEREO_DOWNMIX = AV_CH_LAYOUT_STEREO_DOWNMIX; {$IFEND} +{$IFDEF FF_API_OLD_DECODE_AUDIO} {* in bytes *} AVCODEC_MAX_AUDIO_FRAME_SIZE = 192000; // 1 second of 48khz 32bit audio +{$ENDIF} {** * Required number of additionally allocated bytes at the end of the input bitstream for decoding. @@ -584,7 +652,7 @@ const * Note: If the first 23 bits of the additional bytes are not 0, then damaged * MPEG bitstreams could cause overread and segfault. *} - FF_INPUT_BUFFER_PADDING_SIZE = 8; + FF_INPUT_BUFFER_PADDING_SIZE = 16; {** * minimum encoding buffer size. @@ -637,6 +705,7 @@ type AVCOL_TRC_UNSPECIFIED = 2, AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_SPC_SMPTE240M = 7, AVCOL_TRC_NB ///< Not part of ABI ); @@ -647,7 +716,8 @@ type AVCOL_SPC_FCC = 4, AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above - AVCOL_SPC_SMPTE240M = 7, + AVCOL_SPC_SMPTE240M_ = 7, + AVCOL_SPC_YCGCO = 8, AVCOL_SPC_NB ///< Not part of ABI ); @@ -674,7 +744,7 @@ type AVCHROMA_LOC_NB ///< Not part of ABI ); -{$IF FF_API_FLAC_GLOBAL_OPTS} +{$IFDEF FF_API_FLAC_GLOBAL_OPTS} (** * LPC analysis type *) @@ -759,6 +829,30 @@ const CODEC_FLAG2_STRICT_GOP = $00000002; ///< strictly enforce GOP size CODEC_FLAG2_NO_OUTPUT = $00000004; ///< skip bitstream encoding CODEC_FLAG2_LOCAL_HEADER = $00000008; ///< place global headers at every keyframe instead of in extradata + CODEC_FLAG2_SKIP_RD = $00004000; ///< RD optimal MB level residual skipping + CODEC_FLAG2_CHUNKS = $00008000; ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries. + CODEC_FLAG2_SHOW_ALL = $00400000; ///< Show all frames before the first keyframe +(** + * @defgroup deprecated_flags Deprecated codec flags + * Use corresponding private codec options instead. + * @{ + *) +{$IFDEF FF_API_MPEGVIDEO_GLOBAL_OPTS} + CODEC_FLAG_OBMC = $00000001; ///< OBMC + CODEC_FLAG_H263P_AIV = $00000008; ///< H.263 alternative inter VLC + CODEC_FLAG_PART 0x0080 ///< Use data partitioning. + CODEC_FLAG_ALT_SCAN = $00100000; ///< Use alternate scan. + CODEC_FLAG_H263P_UMV = $02000000; ///< unlimited motion vector + CODEC_FLAG_H263P_SLICE_STRUCT = $10000000; + CODEC_FLAG_SVCD_SCAN_OFFSET = $40000000; ///< Will reserve space for SVCD scan offset user data. + CODEC_FLAG2_INTRA_VLC = $00000800; ///< Use MPEG-2 intra VLC table. + CODEC_FLAG2_DROP_FRAME_TIMECODE = $00002000; ///< timecode is in drop frame format. + CODEC_FLAG2_NON_LINEAR_QUANT = $00010000; ///< Use MPEG-2 nonlinear quantizer. +{$ENDIF} +{$IFDEF FF_API_MJPEG_GLOBAL_OPTS} + CODEC_FLAG_EXTERN_HUFF = $1000; ///< Use external Huffman table (for MJPEG). +{$ENDIF} +{$IFDEF FF_API_X264_GLOBAL_OPTS} CODEC_FLAG2_BPYRAMID = $00000010; ///< H.264 allow b-frames to be used as references CODEC_FLAG2_WPRED = $00000020; ///< H.264 weighted biprediction for b-frames CODEC_FLAG2_MIXED_REFS = $00000040; ///< H.264 multiple references per partition @@ -766,18 +860,21 @@ const CODEC_FLAG2_FASTPSKIP = $00000100; ///< H.264 fast pskip CODEC_FLAG2_AUD = $00000200; ///< H.264 access unit delimiters CODEC_FLAG2_BRDO = $00000400; ///< b-frame rate-distortion optimization - CODEC_FLAG2_INTRA_VLC = $00000800; ///< use MPEG-2 intra VLC table - CODEC_FLAG2_MEMC_ONLY = $00001000; ///< only do ME/MC (I frames -> ref, P frame -> ME+MC) - CODEC_FLAG2_DROP_FRAME_TIMECODE = $00002000; ///< timecode is in drop frame format. - CODEC_FLAG2_SKIP_RD = $00004000; ///< RD optimal MB level residual skipping - CODEC_FLAG2_CHUNKS = $00008000; ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries. - CODEC_FLAG2_NON_LINEAR_QUANT = $00010000; ///< Use MPEG-2 nonlinear quantizer. - CODEC_FLAG2_BIT_RESERVOIR = $00020000; ///< Use a bit reservoir when encoding if possible CODEC_FLAG2_MBTREE = $00040000; ///< Use macroblock tree ratecontrol (x264 only) CODEC_FLAG2_PSY = $00080000; ///< Use psycho visual optimizations. CODEC_FLAG2_SSIM = $00100000; ///< Compute SSIM during encoding, error[] values are undefined. CODEC_FLAG2_INTRA_REFRESH = $00200000; ///< Use periodic insertion of intra blocks instead of keyframes. - +{$ENDIF} +{$IFDEF FF_API_SNOW_GLOBAL_OPTS} + CODEC_FLAG2_MEMC_ONLY = $00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC). +{$ENDIF} +{$IFDEF FF_API_LAME_GLOBAL_OPTS} + CODEC_FLAG2_BIT_RESERVOIR = $00020000 ///< Use a bit reservoir when encoding if possible +{$ENDIF} +(** + * @} + *) + (* Unsupported options : * Syntax Arithmetic coding (SAC) * Reference Picture Selection @@ -793,17 +890,38 @@ const * assume the buffer was allocated by avcodec_default_get_buffer. *) CODEC_CAP_DR1 = $0002; +{$IFDEF FF_API_PARSE_FRAME} (* if 'parse_only' field is true, then avcodec_parse_frame() can be used *) CODEC_CAP_PARSE_ONLY = $0004; +{$ENDIF} CODEC_CAP_TRUNCATED = $0008; (* codec can export data for HW decoding (XvMC) *) CODEC_CAP_HWACCEL = $0010; - (** - * codec has a non zero delay and needs to be feeded with NULL at the end to get the delayed data. - * if this is not set, the codec is guranteed to never be feeded with NULL data - *) +(** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + *) CODEC_CAP_DELAY = $0020; (** @@ -856,6 +974,18 @@ const *) CODEC_CAP_SLICE_THREADS = $2000; + (** + * Codec supports changed parameters at any point. + *) + CODEC_CAP_PARAM_CHANGE = $4000; + (** + * Codec supports avctx->thread_count == 0 (auto). + *) + CODEC_CAP_AUTO_THREADS = $8000; + (** + * Audio encoder supports receiving a different number of samples in each call. + *) + CODEC_CAP_VARIABLE_FRAME_SIZE = $10000; (** * Codec is lossless. *) @@ -921,7 +1051,7 @@ const FF_BUFFER_TYPE_SHARED = 4; ///< buffer from somewhere else, don't dealloc image (data/base), all other tables are not shared FF_BUFFER_TYPE_COPY = 8; ///< just a (modified) copy of some other buffer, don't dealloc anything. -{$IF FF_API_OLD_FF_PICT_TYPES} +{$IFDEF FF_API_OLD_FF_PICT_TYPES} (* DEPRECATED, directly use the AV_PICTURE_TYPE_* enum values *) FF_I_TYPE = 1; ///< Intra FF_P_TYPE = 2; ///< Predicted @@ -962,9 +1092,6 @@ const FF_COMPLIANCE_VERY_STRICT = 2; ///< strictly conform to an older more strict version of the spec or reference software FF_COMPLIANCE_STRICT = 1; ///< strictly conform to all the things in the spec no matter what consequences FF_COMPLIANCE_NORMAL = 0; -{$IF FF_API_INOFFICIAL} - FF_COMPLIANCE_INOFFICIAL = -1; ///< Allow inofficial extensions -{$IFEND} FF_COMPLIANCE_UNOFFICIAL = -1; ///< Allow unofficial extensions FF_COMPLIANCE_EXPERIMENTAL = -2; ///< Allow nonstandardized experimental things. @@ -972,6 +1099,7 @@ const FF_ER_COMPLIANT = 2; FF_ER_AGGRESSIVE = 3; FF_ER_VERY_AGGRESSIVE = 4; + FF_ER_EXPLODE = 5; FF_DCT_AUTO = 0; FF_DCT_FASTINT = 1; @@ -1010,25 +1138,6 @@ const FF_EC_GUESS_MVS = 1; FF_EC_DEBLOCK = 2; -{$IF FF_API_MM_FLAGS} - FF_MM_FORCE = AV_CPU_FLAG_FORCE; - FF_MM_MMX = AV_CPU_FLAG_MMX; - FF_MM_3DNOW = AV_CPU_FLAG_3DNOW; - FF_MM_MMXEXT = AV_CPU_FLAG_MMX2; - FF_MM_MMX2 = AV_CPU_FLAG_MMX2; - FF_MM_SSE = AV_CPU_FLAG_SSE; - FF_MM_SSE2 = AV_CPU_FLAG_SSE2; - FF_MM_SSE2SLOW = AV_CPU_FLAG_SSE2SLOW; - FF_MM_3DNOWEXT = AV_CPU_FLAG_3DNOWEXT; - FF_MM_SSE3 = AV_CPU_FLAG_SSE3; - FF_MM_SSE3SLOW = AV_CPU_FLAG_SSE3SLOW; - FF_MM_SSSE3 = AV_CPU_FLAG_SSSE3; - FF_MM_SSE4 = AV_CPU_FLAG_SSE4; - FF_MM_SSE42 = AV_CPU_FLAG_SSE42; - FF_MM_IWMMXT = AV_CPU_FLAG_IWMMXT; - FF_MM_ALTIVEC = AV_CPU_FLAG_ALTIVEC; -{$IFEND} - FF_PRED_LEFT = 0; FF_PRED_PLANE = 1; FF_PRED_MEDIAN = 2; @@ -1095,7 +1204,7 @@ const FF_MB_DECISION_BITS = 1; ///< chooses the one which needs the fewest bits FF_MB_DECISION_RD = 2; ///< rate distortion -{$IF FF_API_ANTIALIAS_ALGO} +{$IFDEF FF_API_ANTIALIAS_ALGO} FF_AA_AUTO = 0; FF_AA_FASTINT = 1; //not implemented yet FF_AA_INT = 2; @@ -1141,6 +1250,23 @@ const FF_PROFILE_VC1_COMPLEX = 2; FF_PROFILE_VC1_ADVANCED = 3; + FF_PROFILE_MPEG4_SIMPLE = 0; + FF_PROFILE_MPEG4_SIMPLE_SCALABLE = 1; + FF_PROFILE_MPEG4_CORE = 2; + FF_PROFILE_MPEG4_MAIN = 3; + FF_PROFILE_MPEG4_N_BIT = 4; + FF_PROFILE_MPEG4_SCALABLE_TEXTURE = 5; + FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION = 6; + FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE = 7; + FF_PROFILE_MPEG4_HYBRID = 8; + FF_PROFILE_MPEG4_ADVANCED_REAL_TIME = 9; + FF_PROFILE_MPEG4_CORE_SCALABLE = 10; + FF_PROFILE_MPEG4_ADVANCED_CODING = 11; + FF_PROFILE_MPEG4_ADVANCED_CORE = 12; + FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE = 13; + FF_PROFILE_MPEG4_SIMPLE_STUDIO = 14; + FF_PROFILE_MPEG4_ADVANCED_SIMPLE = 15; + FF_LEVEL_UNKNOWN = -99; X264_PART_I4X4 = $001; (* Analyse i4x4 *) @@ -1151,13 +1277,35 @@ const FF_COMPRESSION_DEFAULT = -1; - FF_THREAD_FRAME = 1; //< Decode more than one frame at once - FF_THREAD_SLICE = 2; //< Decode more than one part of a single frame at once + FF_THREAD_FRAME = 1; ///< Decode more than one frame at once + FF_THREAD_SLICE = 2; ///< Decode more than one part of a single frame at once + + AV_EF_CRCCHECK = 1; + AV_EF_BITSTREAM = 2; + AV_EF_BUFFER = 4; + AV_EF_EXPLODE = 8; + + AV_EF_CAREFUL = 65536; + AV_EF_COMPLIANT = 131072; + AV_EF_AGGRESSIVE = 262144; AVPALETTE_SIZE = 1024; AVPALETTE_COUNT = 256; type + AVPacketSideDataType = ( + AV_PKT_DATA_PALETTE, + AV_PKT_DATA_NEW_EXTRADATA, + AV_PKT_DATA_PARAM_CHANGE + ); + + TAVPacketSideDataType = record + data: PByte; + size: cint; + type_: AVPacketSideDataType; + end; + PAVPacketSideDataType = ^TAVPacketSideDataType; + PAVPacket = ^TAVPacket; TAVPacket = record (* @@ -1179,7 +1327,16 @@ type data: PByteArray; size: cint; stream_index: cint; + (** + * A combination of AV_PKT_FLAG values + *) flags: cint; + (** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + *) + side_data: PAVPacketSideDataType; + side_data_elems: cint; (* * Duration of this packet in AVStream->time_base units, 0 if unknown. * Equals next_pts - this_pts in presentation order. @@ -1209,40 +1366,67 @@ type end; {TAVPacket} const - AV_PKT_FLAG_KEY = $0001; -{$IF LIBAVCODEC_VERSION_MAJOR < 53} - PKT_FLAG_KEY = AV_PKT_FLAG_KEY; -{$IFEND} - + AV_PKT_FLAG_KEY = $0001; ///< The packet contains a keyframe + AV_PKT_FLAG_CORRUPT = $0002; ///< The packet content is corrupted + +{$IFDEF FF_API_DATA_POINTERS} + AV_NUM_DATA_POINTERS = 4; +{$ELSE} + AV_NUM_DATA_POINTERS = 8; +{$ENDIF} + +(** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + *) + +type + AVSideDataParamChangeFlags = ( + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = $0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = $0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = $0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = $0008 + ); + type PAVCodecContext = ^TAVCodecContext; (** * Audio Video Frame. - * New fields can be added to the end of FF_COMMON_FRAME with minor version - * bumps. - * Removal, reordering and changes to existing fields require a major - * version bump. No fields should be added into AVFrame before or after - * FF_COMMON_FRAME! - * sizeof(AVFrame) must not be used outside libav*. - *) + * New fields can be added to the end of AVFRAME with minor version + * bumps. Similarly fields that are marked as to be only accessed by + * av_opt_ptr() can be reordered. This allows 2 forks to add fields + * without breaking compatibility with each other. + * Removal, reordering and changes in the remaining cases require + * a major version bump. + * sizeof(AVFrame) must not be used outside libavcodec. + x *) PAVFrame = ^TAVFrame; TAVFrame = record (** - * pointer to the picture planes. + * pointer to the picture/channel planes. * This might be different from the first allocated byte - * - encoding: - * - decoding: + * - encoding: Set by user + * - decoding: set by AVCodecContext.get_buffer() *) - data: array [0..3] of pbyte; - linesize: array [0..3] of cint; + data: array [0..AV_NUM_DATA_POINTERS - 1] of pbyte; + linesize: array [0..AV_NUM_DATA_POINTERS - 1] of cint; (** * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer. * This isn't used by libavcodec unless the default get/release_buffer() is used. * - encoding: * - decoding: *) - base: array [0..3] of pbyte; + base: array [0..AV_NUM_DATA_POINTERS - 1] of pbyte; (** * 1 -> keyframe, 0-> not * - encoding: Set by libavcodec. @@ -1282,13 +1466,12 @@ type *) quality: cint; +{$IFDEF FF_API_AVFRAME_AGE} (** - * buffer age (1->was last buffer and dint change, 2->..., ...). - * Set to INT_MAX if the buffer has not been used yet. - * - encoding: unused - * - decoding: MUST be set by get_buffer(). + * @deprecated unused *) age: cint; +{$ENDIF} (** * is this picture used as reference @@ -1365,7 +1548,7 @@ type * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR. * - decoding: unused *) - error: array [0..3] of cuint64; + error: array [0..AV_NUM_DATA_POINTERS - 1] of cuint64; (** * type of the buffer (to keep track of who has to deallocate data[*]) @@ -1463,56 +1646,69 @@ type * - encoding: unused * - decoding: Read by user. *) - pkt_pts: cint64; + pkt_pts: cint64; (** * dts from the last AVPacket that has been input into the decoder * - encoding: unused * - decoding: Read by user. *) - pkt_dts: cint64; + pkt_dts: cint64; (** * the AVCodecContext which ff_thread_get_buffer() was last called on * - encoding: Set by libavcodec. * - decoding: Set by libavcodec. *) - owner: PAVCodecContext; + owner: PAVCodecContext; (** * used by multithreading to store frame-specific info * - encoding: Set by libavcodec. * - decoding: Set by libavcodec. *) - thread_opaque: pointer; + thread_opaque: pointer; (** - * frame timestamp estimated using various heuristics, in stream time base + * number of audio samples (per channel) described by this frame * - encoding: unused - * - decoding: set by libavcodec, read by user. + * - decoding: Set by libavcodec *) - best_effort_timestamp: cint64; + nb_samples: cint; (** - * reordered pos from the last AVPacket that has been input into the decoder - * - encoding: unused - * - decoding: Read by user. + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data will always be set by get_buffer(), + * but for planar audio with more channels that can fit in data, + * extended_data must be used by the decoder in order to access all + * channels. + * + * encoding: unused + * decoding: set by AVCodecContext.get_buffer() *) - pkt_pos: cint64; + extended_data: PPointer; (** * reordered sample aspect ratio for the video frame, 0/1 if unknown\unspecified * - encoding: unused * - decoding: Read by user. *) - sample_aspect_ratio: TAVRational; + sample_aspect_ratio: TAVRational; (** * width and height of the video frame * - encoding: unused * - decoding: Read by user. *) - width, height: cint; + width, height: cint; (** * format of the frame, -1 if unknown or unset @@ -1521,7 +1717,21 @@ type * - encoding: unused * - decoding: Read by user. *) - format: cint; + format: cint; + + (** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + *) + best_effort_timestamp: cint64; + + (** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + *) + pkt_pos: cint64; end; {TAVFrame} PAVClass = ^TAVClass; @@ -1531,14 +1741,14 @@ type PAVHWAccel = ^TAVHWAccel; // int[4] - PQuadIntArray = ^TQuadIntArray; - TQuadIntArray = array [0..3] of cint; + PAVNDPArray = ^TAVNDPArray; + TAVNDPArray = array [0..AV_NUM_DATA_POINTERS - 1] of cint; // int (*func)(struct AVCodecContext *c2, void *arg) TExecuteFunc = function(c2: PAVCodecContext; arg: Pointer): cint; cdecl; // int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr) TExecute2Func = function(c2: PAVCodecContext; arg: Pointer; jobnr: cint; threadnr: cint): cint; cdecl; -{$IF FF_API_PALETTE_CONTROL} +{$IFDEF FF_API_PALETTE_CONTROL} (** * AVPaletteControl * This structure defines a method for communicating palette changes @@ -1561,17 +1771,28 @@ type end; {deprecated;} {$IFEND} + AVFieldOrder = ( + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT //< Bottom coded first, top displayed first + ); + (** * main external API structure. * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bump. + * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. * sizeof(AVCodecContext) must not be used outside libav*. *) TAVCodecContext = record {720} (** * information on struct for av_log - * - set by avcodec_alloc_context + * - set by avcodec_alloc_context3 *) av_class: PAVClass; (** @@ -1600,7 +1821,7 @@ type * Some codecs need additional format info. It is stored here. * If any muxer uses this then ALL demuxers/parsers AND encoders for the * specific codec MUST set it correctly otherwise stream copy breaks. - * In general use of this field by muxers is not recommanded. + * In general use of this field by muxers is not recommended. * - encoding: Set by libavcodec. * - decoding: Set by libavcodec. (FIXME: Is this OK?) *) @@ -1665,16 +1886,6 @@ type *) pix_fmt: TAVPixelFormat; -{$IF FF_API_RATE_EMU} - (** - * Frame rate emulation. If not zero, the lower layer (i.e. format handler) - * has to read frames at native frame rate. - * - encoding: Set by user. - * - decoding: unused - *) - rate_emu: cint; -{$IFEND} - (** * If non NULL, 'draw_horiz_band' is called by the libavcodec * decoder to draw a horizontal band. It improves cache usage. Not @@ -1695,7 +1906,7 @@ type * @param offset offset into the AVFrame.data from which the slice should be read *) draw_horiz_band: procedure (s: PAVCodecContext; - src: {const} PAVFrame; offset: PQuadIntArray; + src: {const} PAVFrame; offset: PAVNDPArray; y: cint; type_: cint; height: cint); cdecl; (* audio only *) @@ -1715,15 +1926,12 @@ type *) frame_size: cint; frame_number: cint; ///< audio or video frame number -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} - real_pict_num: cint; ///< returns the real picture number of previous encoded frame -{$IFEND} (** * Number of frames the decoded output will be delayed relative to * the encoded input. * - encoding: Set by libavcodec. - * - decoding: unused + * - decoding: Set by libavcodec. *) delay: cint; @@ -1774,16 +1982,6 @@ type b_frame_strategy: cint; -{$IF FF_API_HURRY_UP} - (** - * hurry up amount - * - encoding: unused - * - decoding: Set by user. 1-> Skip B-frames, 2-> Skip IDCT/dequant too, 5-> Skip everything except header - * @deprecated Deprecated in favor of skip_idct and skip_frame. - *) - hurry_up: cint; -{$IFEND} - codec: PAVCodec; priv_data: pointer; @@ -1839,7 +2037,7 @@ type * A demuxer should set this to what is stored in the field used to identify the codec. * If there are multiple such fields in a container then the demuxer should choose the one * which maximizes the information about the used codec. - * If the codec tag field in a container is larger then 32 bits then the demuxer should + * If the codec tag field in a container is larger than 32 bits then the demuxer should * remap the longer ID to 32 bits with a table or other structure. Alternatively a new * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated * first. @@ -1890,6 +2088,7 @@ type *) b_quant_offset: cfloat; +{$IFDEF FF_API_ER} (** * Error recognization; higher values will detect more errors but may * misdetect some more or less valid parts as errors. @@ -1897,15 +2096,59 @@ type * - decoding: Set by user. *) error_recognition: cint; +{$ENDIF} (** * Called at the beginning of each frame to get a buffer for it. - * If pic.reference is set then the frame will be read later by libavcodec. - * avcodec_align_dimensions2() should be used to find the required width and - * height, as they normally need to be rounded up to the next multiple of 16. + * + * The function will set AVFrame.data[], AVFrame.linesize[]. + * AVFrame.extended_data[] must also be set, but it should be the same as + * AVFrame.data[] except for planar audio with more channels than can fit + * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as + * many data pointers as it can hold. + * * if CODEC_CAP_DR1 is not set then get_buffer() must call * avcodec_default_get_buffer() instead of providing buffers allocated by * some other means. + * + * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't + * need it. avcodec_default_get_buffer() aligns the output buffer properly, + * but if get_buffer() is overridden then alignment considerations should + * be taken into account. + * + * @see avcodec_default_get_buffer() + * + * Video: + * + * If pic.reference is set then the frame will be read later by libavcodec. + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * it may be called from a different thread, but not from more than one at + * once. Does not need to be reentrant. + * + * @see release_buffer(), reget_buffer() + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * Decoders cannot use the buffer after returning from + * avcodec_decode_audio4(), so they will not call release_buffer(), as it + * is assumed to be released immediately upon return. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * * - encoding: unused * - decoding: Set by libavcodec, user can override. *) @@ -1934,9 +2177,15 @@ type *) block_align: cint; - parse_only: cint; (* - decoding only: if true, only parsing is done - (function avcodec_parse_frame()). The frame - data is returned. Only MPEG codecs support this now. *) +{$IFDEF FF_API_PARSE_FRAME} + (** + * If true, only parsing is done. The frame data is returned. + * Only MPEG audio decoders support this now. + * - encoding: unused + * - decoding: Set by user + *) + parse_only: cint; {deprecated} +{$ENDIF} (** * 0-> h263 quant 1-> mpeg quant @@ -2116,7 +2365,7 @@ type * - encoding: Set by libavcodec. * - decoding: Set by user. *) - bits_per_coded_sample: cint; + bits_per_coded_sample: cint; (** * prediction method (needed for huffyuv) @@ -2160,23 +2409,7 @@ type * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR. * - decoding: unused *) - error: array [0..3] of cuint64; - -{$IF FF_API_MB_Q} - (** - * minimum MB quantizer - * - encoding: unused - * - decoding: unused - *) - mb_qmin: cint; {deprecated} - - (** - * maximum MB quantizer - * - encoding: unused - * - decoding: unused - *) - mb_qmax: cint; {deprecated} -{$IFEND} + error: array [0..AV_NUM_DATA_POINTERS - 1] of cuint64; (** * motion estimation comparison function @@ -2298,17 +2531,21 @@ type *) color_table_id: cint; +{$IFDEF FF_API_INTERNAL_CONTEXT} (** * internal_buffer count * Don't touch, used by libavcodec default_get_buffer(). + * @deprecated this field was moved to an internal context *) internal_buffer_count: cint; (** * internal_buffers * Don't touch, used by libavcodec default_get_buffer(). + * @deprecated this field was moved to an internal context *) internal_buffer: pointer; +{$ENDIF} (** * Global quality for codecs which cannot change it per frame. @@ -2332,14 +2569,12 @@ type *) context_model: cint; - { (** * * - encoding: unused * - decoding: Set by user. *) - realloc: function (s: PAVCodecContext; buf: Pbyte; buf_size: cint): Pbyte; cdecl; - } +// realloc: function (s: PAVCodecContext; buf: Pbyte; buf_size: cint): Pbyte; cdecl; (** * slice flags @@ -2382,7 +2617,7 @@ type * - encoding: unused * - decoding: Set by user, will be converted to uppercase by libavcodec during init. *) - stream_codec_tag: array [0..3] of AnsiChar; //cuint; + stream_codec_tag: cuint; (** * scene change detection threshold @@ -2406,7 +2641,7 @@ type *) lmax: cint; -{$IF FF_API_PALETTE_CONTROL} +{$IFDEF FF_API_PALETTE_CONTROL} (** * palette control structure * - encoding: ??? (no palette-enabled encoder yet) @@ -2464,7 +2699,7 @@ type *) error_rate: cint; -{$IF FF_API_ANTIALIAS_ALGO} +{$IFDEF FF_API_ANTIALIAS_ALGO} (** * MP3 antialias algorithm, see FF_AA_* below. * - encoding: unused @@ -2528,53 +2763,52 @@ type * - encoding: Set by user. * - decoding: unused *) - intra_dc_precision: cint; + intra_dc_precision: cint; (** * noise vs. sse weight for the nsse comparsion function * - encoding: Set by user. * - decoding: unused *) - nsse_weight: cint; + nsse_weight: cint; (** * Number of macroblock rows at the top which are skipped. * - encoding: unused * - decoding: Set by user. *) - skip_top: cint; + skip_top: cint; (** * Number of macroblock rows at the bottom which are skipped. * - encoding: unused * - decoding: Set by user. *) - skip_bottom: cint; + skip_bottom: cint; (** * profile * - encoding: Set by user. * - decoding: Set by libavcodec. *) - profile: cint; + profile: cint; (** * level * - encoding: Set by user. * - decoding: Set by libavcodec. *) - level: cint; + level: cint; (** * low resolution decoding, 1-> 1/2 size, 2->1/4 size * - encoding: unused * - decoding: Set by user. *) - lowres: cint; + lowres: cint; (** - * Bitstream width / height, may be different from width/height if lowres - * or other things are used. + * Bitstream width / height, may be different from width/height if lowres enabled. * - encoding: unused * - decoding: Set by user before init if known. Codec should override / dynamically change if needed. *) @@ -2672,10 +2906,12 @@ type *) brd_scale: cint; +{$IFDEF FF_API_X264_GLOBAL_OPTS} (** * constant rate factor - quality-based VBR - values ~correspond to qps * - encoding: Set by user. * - decoding: unused + * @deprecated use 'crf' libx264 private option *) crf: cfloat; @@ -2683,8 +2919,10 @@ type * constant quantization parameter rate control method * - encoding: Set by user. * - decoding: unused + * @deprecated use 'cqp' libx264 private option *) cqp: cint; +{$ENDIF} (** * minimum GOP size @@ -2707,12 +2945,14 @@ type *) chromaoffset: cint; +{$IFDEF FF_API_X264_GLOBAL_OPTS} (** * Influences how often B-frames are used. * - encoding: Set by user. * - decoding: unused *) bframebias: cint; +{$ENDIF} (** * trellis RD quantization @@ -2721,6 +2961,7 @@ type *) trellis: cint; +{$IFDEF FF_API_X264_GLOBAL_OPTS} (** * Reduce fluctuations in qp (before curve compression). * - encoding: Set by user. @@ -2757,6 +2998,7 @@ type * - decoding: unused *) directpred: cint; +{$ENDIF} (** * Audio cutoff bandwidth (0 means "automatic") @@ -2781,7 +3023,7 @@ type mv0_threshold: cint; (** - * Adjusts sensitivity of b_frame_strategy 1. + * Adjust sensitivity of b_frame_strategy 1. * - encoding: Set by user. * - decoding: unused *) @@ -2793,36 +3035,32 @@ type *) compression_level: cint; -{$IF FF_API_USE_LPC} (** - * Sets whether to use LPC mode - used by FLAC encoder. * - encoding: Set by user. * - decoding: unused - * @deprecated Deprecated in favor of lpc_type and lpc_passes. *) - use_lpc: cint; + min_prediction_order: cint; (** - * LPC coefficient precision - used by FLAC encoder * - encoding: Set by user. * - decoding: unused *) - lpc_coeff_precision: cint; -{$IFEND} + max_prediction_order: cint; +{$IFDEF FF_API_FLAC_GLOBAL_OPTS} (** - * - encoding: Set by user. - * - decoding: unused + * @name FLAC options + * @deprecated Use FLAC encoder private options instead. + * @{ *) - min_prediction_order: cint; (** + * LPC coefficient precision - used by FLAC encoder * - encoding: Set by user. * - decoding: unused *) - max_prediction_order: cint; + lpc_coeff_precision: cint; {deprecated} -{$IF FF_API_FLAC_GLOBAL_OPTS} (** * search method for selecting prediction order * - encoding: Set by user. @@ -2850,7 +3088,7 @@ type *) timecode_frame_start: cint64; -{$IF FF_API_REQUEST_CHANNELS} +{$IFDEF FF_API_REQUEST_CHANNELS} (** * Decoder should decode to this many channels if it can (0 for default) * - encoding: unused @@ -2860,13 +3098,15 @@ type request_channels: cint; {$IFEND} +{$IFDEF FF_API_DRC_SCALE} (** * Percentage of dynamic range compression to be applied by the decoder. * The default value is 1.0, corresponding to full compression. * - encoding: unused * - decoding: Set by user. *) - drc_scale: cfloat; + drc_scale: cfloat; {deprecated} +{$ENDIF} (** * opaque 64bit number (generally a PTS) that will be reordered and @@ -2878,7 +3118,6 @@ type (** * Bits per sample/pixel of internal libavcodec pixel/sample format. - * This field is applicable only when sample_fmt is SAMPLE_FMT_S32. * - encoding: set by user. * - decoding: set by libavcodec. *) @@ -2889,14 +3128,14 @@ type * - encoding: set by user. * - decoding: set by libavcodec. *) - channel_layout: cint64; + channel_layout: cuint64; (** * Request decoder to use this channel layout if it can (0 for default) * - encoding: unused * - decoding: Set by user. *) - request_channel_layout: cint64; + request_channel_layout: cuint64; (** * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. @@ -2995,6 +3234,7 @@ type *) execute2: function (c: PAVCodecContext; func: TExecute2Func; arg2: Pointer; ret: Pcint; count: cint): cint; cdecl; +{$IFDEF FF_API_X264_GLOBAL_OPTS} (** * explicit P-frame weighted prediction analysis method * 0: off @@ -3003,7 +3243,7 @@ type * - encoding: Set by user. * - decoding: unused *) - weighted_p_pred: cint; + weighted_p_pred: cint; {deprecated} (** * AQ mode @@ -3013,7 +3253,7 @@ type * - encoding: Set by user * - decoding: unused *) - aq_mode: cint; + aq_mode: cint; {deprecated} (** * AQ strength @@ -3021,7 +3261,7 @@ type * - encoding: Set by user * - decoding: unused *) - aq_strength: cfloat; + aq_strength: cfloat; {deprecated} (** * PSY RD @@ -3029,7 +3269,7 @@ type * - encoding: Set by user * - decoding: unused *) - psy_rd: cfloat; + psy_rd: cfloat; {deprecated} (** * PSY trellis @@ -3037,7 +3277,7 @@ type * - encoding: Set by user * - decoding: unused *) - psy_trellis: cfloat; + psy_trellis: cfloat; {deprecated} (** * RC lookahead @@ -3045,7 +3285,7 @@ type * - encoding: Set by user * - decoding: unused *) - rc_lookahead: cint; + rc_lookahead: cint; {deprecated} (** * Constant rate factor maximum @@ -3054,13 +3294,14 @@ type * - encoding: Set by user. * - decoding: unused *) - crf_max: cfloat; + crf_max: cfloat; {deprecated} +{$ENDIF} log_level_offset: cint; -{$IF FF_API_FLAC_GLOBAL_OPTS} +{$IFDEF FF_API_FLAC_GLOBAL_OPTS} (** - * Determines which LPC analysis algorithm to use. + * Determine which LPC analysis algorithm to use. * - encoding: Set by user * - decoding: unused *) @@ -3088,8 +3329,8 @@ type * For SUBTITLE_ASS subtitle type, it should contain the whole ASS * [Script Info] and [V4+ Styles] section, plus the [Events] line and * the Format line following. It shouldn't include any Dialogue line. - * - encoding: Set/allocated/freed by user (before avcodec_open()) - * - decoding: Set/allocated/freed by libavcodec (by avcodec_open()) + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) *) subtitle_header: Pcuint8; subtitle_header_size: cint; @@ -3103,6 +3344,7 @@ type *) pkt: PAVPacket; +{$IFDEF FF_API_INTERNAL_CONTEXT} (** * Whether this is a copy of the context which had init() called on it. * This is used by multithreading - shared tables and picture pointers @@ -3110,7 +3352,8 @@ type * - encoding: Set by libavcodec. * - decoding: Set by libavcodec. *) - is_copy: cint; + is_copy: cint; {deprecated} +{$ENDIF} (** * Which multithreading methods to use. @@ -3162,6 +3405,27 @@ type *) request_sample_fmt: TAVSampleFormat; + (** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + *) + err_recognition: cint; + + (** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + *) + internal: pointer; + + (** Field order + * - encoding: set by libavcodec + * - decoding: Set by libavcodec + *) + field_order: AVFieldOrder; + (** * Current statistics for PTS correction. * - decoding: maintained and used by libavcodec, not intended to be used by user apps @@ -3215,13 +3479,13 @@ type long_name: {const} PAnsiChar; supported_samplerates: {const} PCint; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 sample_fmts: {const} PAVSampleFormatArray; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 - channel_layouts: {const} PCint64; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + channel_layouts: {const} PCuint64; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 max_lowres: byte; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 priv_class: {const} PAVClass; ///< AVClass for the private context profiles: {const} PAVProfile; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} (** - * @defgroup framethreading Frame-level threading support functions. + * @name Frame-level threading support functions * @{ *) (** @@ -3239,6 +3503,29 @@ type *) update_thread_context: function (dst: PAVCodecContext; src: {const} PAVCodecContext): cint; cdecl; (** @} *) + + (** + * Private codec-specific defaults. + *) + defaults: {const} pointer; + + (** + * Initialize codec static data, called from avcodec_register(). + *) + init_static_data: procedure (codec: PAVCodec); cdecl; + + (** + * Encode data to an AVPacket. + * + * @param avctx codec context + * @param avpkt output AVPacket (may contain a user-provided buffer) + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + *) + encode2: function (avctx: PAVCodecContext; avpkt: PAVPacket; frame: {const} PAVFrame; + got_packet_ptr: Pcint): cint; cdecl; end; {TAVCodec} (** @@ -3341,8 +3628,8 @@ type *) PAVPicture = ^TAVPicture; TAVPicture = record - data: array [0..3] of PByteArray; - linesize: array [0..3] of cint; ///< number of bytes per line + data: array [0..AV_NUM_DATA_POINTERS] of PByteArray; + linesize: array [0..AV_NUM_DATA_POINTERS] of cint; ///< number of bytes per line end; {TAVPicture} TAVSubtitleType = ( @@ -3457,21 +3744,42 @@ function av_dup_packet(pkt: PAVPacket): cint; procedure av_free_packet(pkt: PAVPacket); cdecl; external av__codec; +(** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + *) +function av_packet_new_side_data(pkt: PAVPacket; type_: AVPacketSideDataType; + size: cint): PByte; + cdecl; external av__codec; + +(** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + *) +function av_packet_get_side_data(pkt: PAVPacket; type_: AVPacketSideDataType; + size: Pcint): PByte; + cdecl; external av__codec; + +function av_packet_merge_side_data(pkt: PAVPacket): cint; + cdecl; external av__codec; + +function av_packet_split_side_data(pkt: PAVPacket): cint; + cdecl; external av__codec; + (* resample.c *) type PReSampleContext = pointer; PAVResampleContext = pointer; PImgReSampleContext = pointer; -{$IF FF_API_AUDIO_OLD} -(** - * @deprecated Use av_audio_resample_init() instead. - *) -function audio_resample_init (output_channels: cint; input_channels: cint; - output_rate: cint; input_rate: cint): PReSampleContext; - cdecl; external av__codec; deprecated; -{$IFEND} - (** * Initialize audio resampling context. * @@ -3486,7 +3794,7 @@ function audio_resample_init (output_channels: cint; input_channels: cint; * @param linear if 1 then the used FIR filter will be linearly interpolated between the 2 closest, if 0 the closest will be used * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate - * @return allocated ReSampleContext, NULL if error occured + * @return allocated ReSampleContext, NULL if error occurred *) function av_audio_resample_init(output_channels: cint; input_channels: cint; output_rate: cint; input_rate: cint; @@ -3600,7 +3908,7 @@ function avpicture_fill (picture: PAVPicture; ptr: pcuint8; * The data is stored compactly, without any gaps for alignment or padding * which may be applied by avpicture_fill(). * - * \see avpicture_get_size() + * @see avpicture_get_size() * * @param[in] src AVPicture containing image data * @param[in] pix_fmt The format in which the picture data is stored. @@ -3633,7 +3941,14 @@ function avpicture_get_size (pix_fmt: TAVPixelFormat; width: cint; height: cint) procedure avcodec_get_chroma_sub_sample (pix_fmt: TAVPixelFormat; var h_shift: cint; var v_shift: cint); cdecl; external av__codec; -{$IF FF_API_GET_PIX_FMT_NAME} +(** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + *) +function avcodec_get_name(id: TCodecID): PAnsiChar; + cdecl; external av__codec; + +{$IFDEF FF_API_GET_PIX_FMT_NAME} (** * Return the short name for a pixel format. * @@ -3647,23 +3962,6 @@ function avcodec_get_pix_fmt_name(pix_fmt: TAVPixelFormat): PAnsiChar; procedure avcodec_set_dimensions(s: PAVCodecContext; width: cint; height: cint); cdecl; external av__codec; -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -(** - * Return the pixel format corresponding to the name name. - * - * If there is no pixel format with name name, then looks for a - * pixel format with the name corresponding to the native endian - * format of name. - * For example in a little-endian system, first looks for "gray16", - * then for "gray16le". - * - * Finally if no pixel format has been found, returns PIX_FMT_NONE.* - * @deprecated Deprecated in favor of av_get_pix_fmt(). - *) -function avcodec_get_pix_fmt(name: {const} PAnsiChar): TAVPixelFormat; - cdecl; external av__codec; deprecated; -{$IFEND} - (** * Return a value representing the fourCC code associated to the * pixel format pix_fmt, or 0 if no associated fourCC code can be @@ -3705,7 +4003,8 @@ const * @param[in] dst_pix_fmt destination pixel format * @param[in] src_pix_fmt source pixel format * @param[in] has_alpha Whether the source pixel format alpha channel is used. - * @return Combination of flags informing you what kind of losses will occur. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). *) function avcodec_get_pix_fmt_loss (dst_pix_fmt: TAVPixelFormat; src_pix_fmt: TAVPixelFormat; has_alpha: cint): cint; @@ -3721,9 +4020,11 @@ function avcodec_get_pix_fmt_loss (dst_pix_fmt: TAVPixelFormat; src_pix_fmt: TAV * The pixel formats from which it chooses one, are determined by the * pix_fmt_mask parameter. * + * Note, only the first 64 pixel formats will fit in pix_fmt_mask. + * * @code * src_pix_fmt = PIX_FMT_YUV420P; - * pix_fmt_mask = (1 << PIX_FMT_YUV422P) || (1 << PIX_FMT_RGB24); + * pix_fmt_mask = (1 << PIX_FMT_YUV422P) | (1 << PIX_FMT_RGB24); * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss); * @endcode * @@ -3745,6 +4046,7 @@ procedure avcodec_pix_fmt_string (buf: PAnsiChar; buf_size: cint; pix_fmt: TAVPi cdecl; external av__codec; deprecated; {$IFEND} +{$IFDEF FF_API_GET_ALPHA_INFO} const FF_ALPHA_TRANSP = $0001; {* image has some totally transparent pixels *} FF_ALPHA_SEMI_TRANSP = $0002; {* image has some transparent pixels *} @@ -3756,8 +4058,9 @@ const function img_get_alpha_info (src: {const} PAVPicture; pix_fmt: TAVPixelFormat; width: cint; - height: cint): cint; + height: cint): cint; {deprecated} cdecl; external av__codec; +{$ENDIF} (* deinterlace a picture *) (* deinterlace - if not supported return -1 *) @@ -3796,29 +4099,22 @@ function avcodec_configuration(): PAnsiChar; function avcodec_license(): PAnsiChar; cdecl; external av__codec; +{$IFDEF FF_API_AVCODEC_INIT} (** - * Initialize libavcodec. - * - * @warning This function must be called before any other libavcodec - * function. - * - * @warning This function is not thread-safe. + * @deprecated this function is called automatically from avcodec_register() + * and avcodec_register_all(), there is no need to call it manually *) procedure avcodec_init(); cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION_MAJOR < 53} -(** - * @deprecated Deprecated in favor of avcodec_register(). - *) -procedure register_avcodec(codec: PAVCodec); - cdecl; external av__codec; deprecated; {$IFEND} (** * Register the codec codec and initialize libavcodec. * - * @see avcodec_init(), avcodec_register_all() + * @warning either this function or avcodec_register_all() must be called + * before any other libavcodec functions. + * + * @see avcodec_register_all() *) procedure avcodec_register(codec: PAVCodec); cdecl; external av__codec; @@ -3871,24 +4167,35 @@ procedure avcodec_string(buf: PAnsiChar; buf_size: cint; enc: PAVCodecContext; e function av_get_profile_name(codec: {const} PAVCodec; profile: cint): {const} PAnsiChar; cdecl; external av__codec; +{$IFDEF FF_API_ALLOC_CONTEXT} (** * Set the fields of the given AVCodecContext to default values. * * @param s The AVCodecContext of which the fields should be set to default values. + * @deprecated use avcodec_get_context_defaults3 *) -procedure avcodec_get_context_defaults(s: PAVCodecContext); +procedure avcodec_get_context_defaults(s: PAVCodecContext); {deprecated} cdecl; external av__codec; (** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! * we WILL change its arguments and name a few times! *) -procedure avcodec_get_context_defaults2(s: PAVCodecContext; ctype: TAVMediaType); +procedure avcodec_get_context_defaults2(s: PAVCodecContext; ctype: TAVMediaType); {deprecated} cdecl; external av__codec; +{$ENDIF} -(** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! - * we WILL change its arguments and name a few times! *) +(** + * Set the fields of the given AVCodecContext to default values corresponding + * to the given codec (defaults may be codec-dependent). + * + * Do not call this function if a non-NULL codec has been passed + * to avcodec_alloc_context3() that allocated this AVCodecContext. + * If codec is non-NULL, it is illegal to call avcodec_open2() with a + * different codec on this AVCodecContext. + *) procedure avcodec_get_context_defaults3(s: PAVCodecContext; codec: PAVCodec); cdecl; external av__codec; +{$IFDEF FF_API_ALLOC_CONTEXT} (** * Allocate an AVCodecContext and sets it fields to default values. The * resulting struct can be deallocated by simply calling av_free(). @@ -3897,26 +4204,37 @@ procedure avcodec_get_context_defaults3(s: PAVCodecContext; codec: PAVCodec); * @see avcodec_get_context_defaults *) function avcodec_alloc_context(): PAVCodecContext; - cdecl; external av__codec; + cdecl; external av__codec; deprecated; (** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! * we WILL change its arguments and name a few times! *) -function avcodec_alloc_context2(ctype: TAVMediaType): PAVCodecContext; +function avcodec_alloc_context2(ctype: TAVMediaType): PAVCodecContext; {deprecated} cdecl; external av__codec; +{$ENDIF} -(** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! - * we WILL change its arguments and name a few times! *) +(** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct can be deallocated by calling avcodec_close() on it followed + * by av_free(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * + * @return An AVCodecContext filled with default values or NULL on failure. + * @see avcodec_get_context_defaults + *) function avcodec_alloc_context3(codec: PAVCodec): PAVCodecContext; cdecl; external av__codec; (** * Copy the settings of the source AVCodecContext into the destination * AVCodecContext. The resulting destination codec context will be - * unopened, i.e. you are required to call avcodec_open() before you + * unopened, i.e. you are required to call avcodec_open2() before you * can use this AVCodecContext to decode/encode video/audio data. * * @param dest target codec context, should be initialized with - * avcodec_alloc_context(), but otherwise uninitialized + * avcodec_alloc_context3(), but otherwise uninitialized * @param src source codec context * @return AVERROR() on error (e.g. memory allocation error), 0 on success *) @@ -3980,28 +4298,18 @@ procedure avcodec_align_dimensions(s: PAVCodecContext; width: PCint; height: PCi * according to avcodec_get_edge_width() before. *) procedure avcodec_align_dimensions2(s: PAVCodecContext; width: PCint; height: PCint; - linesize_align: PQuadIntArray); + linesize_align: PAVNDPArray); cdecl; external av__codec; -{$IF LIBAVCODEC_VERSION_MAJOR < 53} -(** - * @deprecated Deprecated in favor of av_check_image_size(). - *) -function avcodec_check_dimensions(av_log_ctx: pointer; w: cuint; h: cuint): cint; - cdecl; external av__codec; deprecated; -{$IFEND} - function avcodec_default_get_format(s: PAVCodecContext; fmt: {const} PAVPixelFormat): TAVPixelFormat; cdecl; external av__codec; -{$IF FF_API_THREAD_INIT} +{$IFDEF FF_API_THREAD_INIT} (** - * @deprecated Set s->thread_count before calling avcodec_open() instead of calling this. + * @deprecated Set s->thread_count before calling avcodec_open2() instead of calling this. *) function avcodec_thread_init(s: PAVCodecContext; thread_count: cint): cint; cdecl; external av__codec; deprecated; -procedure avcodec_thread_free(s: PAVCodecContext); - cdecl; external av__codec; deprecated; {$IFEND} function avcodec_default_execute(s: PAVCodecContext; func: TExecuteFunc; arg: Pointer; var ret: cint; count: cint; size: cint): cint; @@ -4011,6 +4319,7 @@ function avcodec_default_execute2(s: PAVCodecContext; func: TExecuteFunc; arg: P cdecl; external av__codec; //FIXME func typedef +{$IFDEF FF_API_AVCODEC_OPEN} (** * Initialize the AVCodecContext to use the given AVCodec. Prior to using this * function the context has to be allocated. @@ -4027,7 +4336,7 @@ function avcodec_default_execute2(s: PAVCodecContext; func: TExecuteFunc; arg: P * if (!codec) * exit(1); * - * context = avcodec_alloc_context(); + * context = avcodec_alloc_context3(codec); * * if (avcodec_open(context, codec) < 0) * exit(1); @@ -4036,33 +4345,59 @@ function avcodec_default_execute2(s: PAVCodecContext; func: TExecuteFunc; arg: P * @param avctx The context which will be set up to use the given codec. * @param codec The codec to use within the context. * @return zero on success, a negative value on error - * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder + * @see avcodec_alloc_context3, avcodec_find_decoder, avcodec_find_encoder, avcodec_close + * + * @deprecated use avcodec_open2 *) function avcodec_open(avctx: PAVCodecContext; codec: PAVCodec): cint; - cdecl; external av__codec; - + cdecl; external av__codec; deprecated; +{$ENDIF} -{$IF FF_API_AUDIO_OLD} (** - * Decode an audio frame from buf into samples. - * Wrapper function which calls avcodec_decode_audio3. + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). * - * @deprecated Use avcodec_decode_audio3 instead. - * @param avctx the codec context - * @param[out] samples the output buffer, sample type in avctx->sample_fmt - * @param[in,out] frame_size_ptr the output buffer size in bytes - * @param[in] buf the input buffer - * @param[in] buf_size the input buffer size in bytes - * @return On error a negative value is returned, otherwise the number of bytes - * used or zero if no frame could be decompressed. + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @code + * avcodec_register_all(); + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * avcodec_get_context_defaults3() for this context, then this + * parameter MUST be either NULL or equal to the previously passed + * codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). *) -function avcodec_decode_audio2(avctx: PAVCodecContext; samples: PSmallint; - var frame_size_ptr: cint; - buf: {const} PByteArray; buf_size: cint): cint; - cdecl; external av__codec; deprecated; -{$IFEND} +function avcodec_open2(avctx: PAVCodecContext; codec: PAVCodec; options: pointer): cint; + cdecl; external av__codec; +{$IFDEF FF_API_OLD_DECODE_AUDIO} (** + * Wrapper function which calls avcodec_decode_audio4. + * + * @deprecated Use avcodec_decode_audio4 instead. + * * Decode the audio frame of size avpkt->size from avpkt->data into samples. * Some decoders may support multiple frames in a single AVPacket, such * decoders would then just decode the first frame. In this case, @@ -4082,6 +4417,11 @@ function avcodec_decode_audio2(avctx: PAVCodecContext; samples: PSmallint; * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that * no overreading happens for damaged MPEG streams. * + * @warning You must not provide a custom get_buffer() when using + * avcodec_decode_audio3(). Doing so will override it with + * avcodec_default_get_buffer. Use avcodec_decode_audio4() instead, + * which does allow the application to provide a custom get_buffer(). + * * @note You might have to align the input buffer avpkt->data and output buffer * samples. The alignment requirements depend on the CPU: On some CPUs it isn't * necessary at all, on others it won't work at all if not aligned and on others @@ -4091,11 +4431,14 @@ function avcodec_decode_audio2(avctx: PAVCodecContext; samples: PSmallint; * samples should be 16 byte aligned unless the CPU doesn't need it * (AltiVec and SSE do). * - * @note Some codecs have a delay between input and output, these need to be - * fed with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames. + * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. * * @param avctx the codec context - * @param[out] samples the output buffer + * @param[out] samples the output buffer, sample type in avctx->sample_fmt + * If the sample format is planar, each channel plane will + * be the same size, with no padding between channels. * @param[in,out] frame_size_ptr the output buffer size in bytes * @param[in] avpkt The input AVPacket containing the input buffer. * You can create such packet with av_init_packet() and by then setting @@ -4106,35 +4449,46 @@ function avcodec_decode_audio2(avctx: PAVCodecContext; samples: PSmallint; *) function avcodec_decode_audio3(avctx: PAVCodecContext; samples: PSmallint; var frame_size_ptr: cint; - avpkt: PAVPacket): cint; + avpkt: PAVPacket): cint; {deprecated} cdecl; external av__codec; +{$ENDIF} -{$IF FF_API_VIDEO_OLD} (** - * Decode a video frame from buf into picture. - * Wrapper function which calls avcodec_decode_video2. + * Decode the audio frame of size avpkt->size from avpkt->data into frame. * - * @deprecated Use avcodec_decode_video2 instead. - * @param avctx the codec context - * @param[out] picture The AVFrame in which the decoded video frame will be stored. - * Use avcodec_alloc_frame to get an AVFrame, the codec will - * allocate memory for the actual bitmap. - * with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit. - * with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder - * decodes and the decoder tells the user once it does not need the data anymore, - * the user app can at this point free/reuse/keep the memory as it sees fit. + * Some decoders may support multiple frames in a single AVPacket. Such + * decoders would then just decode the first frame. In this case, + * avcodec_decode_audio4 has to be called again with an AVPacket containing + * the remaining data in order to decode the second frame, etc... + * Even if no frames are returned, the packet needs to be fed to the decoder + * with remaining data until it is completely consumed or an error occurs. * - * @param[in] buf the input buffer - * @param[in] buf_size the size of the input buffer in bytes - * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. - * @return On error a negative value is returned, otherwise the number of bytes - * used or zero if no frame could be decompressed. + * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note You might have to align the input buffer. The alignment requirements + * depend on the CPU and the decoder. + * + * @param avctx the codec context + * @param[out] frame The AVFrame in which to store decoded audio samples. + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer(). The + * decoder may, however, only utilize part of the buffer by + * setting AVFrame.nb_samples to a smaller value in the + * output frame. + * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is + * non-zero. + * @param[in] avpkt The input AVPacket containing the input buffer. + * At least avpkt->data and avpkt->size should be set. Some + * decoders might also require additional fields to be set. + * @return A negative error code is returned if an error occurred during + * decoding, otherwise the number of bytes consumed from the input + * AVPacket is returned. *) -function avcodec_decode_video(avctx: PAVCodecContext; picture: PAVFrame; - var got_picture_ptr: cint; - buf: {const} PByteArray; buf_size: cint): cint; - cdecl; external av__codec; deprecated; -{$IFEND} +function avcodec_decode_audio4(avctx: PAVCodecContext; frame: PAVFrame; + got_frame_ptr: Pcint; avpkt: PAVPacket): cint; + cdecl; external av__codec; (** * Decode the video frame of size avpkt->size from avpkt->data into picture. @@ -4155,6 +4509,10 @@ function avcodec_decode_video(avctx: PAVCodecContext; picture: PAVFrame; * * In practice, avpkt->data should have 4 byte alignment at minimum. * + * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. + * * @param avctx the codec context * @param[out] picture The AVFrame in which the decoded video frame will be stored. * @param[in] avpkt The input AVpacket containing the input buffer. @@ -4168,10 +4526,10 @@ function avcodec_decode_video(avctx: PAVCodecContext; picture: PAVFrame; *) function avcodec_decode_video2(avctx: PAVCodecContext; picture: PAVFrame; var got_picture_ptr: cint; - avpkt: PAVPacket): cint; + avpkt: {const} PAVPacket): cint; cdecl; external av__codec; -{$IF FF_API_SUBTITLE_OLD} +{$IFDEF FF_API_SUBTITLE_OLD} (* Decode a subtitle message. Return -1 if error, otherwise return the * number of bytes used. If no subtitle could be decompressed, * got_sub_ptr is zero. Otherwise, the subtitle is stored in*sub. @@ -4203,25 +4561,23 @@ function avcodec_decode_subtitle2(avctx: PAVCodecContext; sub: PAVSubtitle; cdecl; external av__codec; (** - * Frees all allocated data in the given subtitle struct. + * Free all allocated data in the given subtitle struct. * * @param sub AVSubtitle to free. *) procedure avsubtitle_free(sub: PAVSubtitle); cdecl; external av__codec; -function avcodec_parse_frame(avctx: PAVCodecContext; pdata: PPointer; - data_size_ptr: PCint; - buf: PByteArray; buf_size: cint): cint; - cdecl; external av__codec; - +{$IFDEF FF_API_OLD_ENCODE_AUDIO} (** * Encode an audio frame from samples into buf. * + * @deprecated Use avcodec_encode_audio2 instead. + * * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large. - * However, for PCM audio the user will know how much space is needed - * because it depends on the value passed in buf_size as described - * below. In that case a lower value can be used. + * However, for codecs with avctx->frame_size equal to 0 (e.g. PCM) the user + * will know how much space is needed because it depends on the value passed + * in buf_size as described below. In that case a lower value can be used. * * @param avctx the codec context * @param[out] buf the output buffer @@ -4229,13 +4585,80 @@ function avcodec_parse_frame(avctx: PAVCodecContext; pdata: PPointer; * @param[in] samples the input buffer containing the samples * The number of samples read from this buffer is frame_size*channels, * both of which are defined in avctx. - * For PCM audio the number of samples read from samples is equal to - * buf_size * input_sample_size / output_sample_size. + * For codecs which have avctx->frame_size equal to 0 (e.g. PCM) the number of + * samples read from samples is equal to: + * buf_size * 8 / (avctx->channels * av_get_bits_per_sample(avctx->codec_id)) + * This also implies that av_get_bits_per_sample() must not return 0 for these + * codecs. * @return On error a negative value is returned, on success zero or the number * of bytes used to encode the data read from the input buffer. *) function avcodec_encode_audio(avctx: PAVCodecContext; buf: PByte; - buf_size: cint; samples: {const} PSmallint): cint; + buf_size: cint; samples: {const} PSmallint): cint; {deprecated} + cdecl; external av__codec; +{$ENDIF} + +(** + * Encode a frame of audio. + * + * Takes input samples from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay, split, and combine input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. All other AVPacket fields + * will be reset by the encoder using av_init_packet(). If + * avpkt->data is NULL, the encoder will allocate it. + * The encoder will set avpkt->size to the size of the + * output packet. + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * CODEC_CAP_DELAY capability set. + * There are 2 codec capabilities that affect the allowed + * values of frame->nb_samples. + * If CODEC_CAP_SMALL_LAST_FRAME is set, then only the final + * frame may be smaller than avctx->frame_size, and all other + * frames must be equal to avctx->frame_size. + * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If neither is set, frame->nb_samples must be equal to + * avctx->frame_size for all frames. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + *) +function avcodec_encode_audio2(avctx: PAVCodecContext; avpkt: PAVPacket; + frame: {const} PAVFrame; got_packet_ptr: Pcint): cint; + cdecl; external av__codec; + +(** + * Fill audio frame data and linesize. + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment + * @return 0 on success, negative error code on failure + *) +function avcodec_fill_audio_frame(frame: PAVFrame; nb_channels: cint; + sample_fmt: TAVSampleFormat; buf: {const} PByte; + buf_size: cint; align: cint): cint; cdecl; external av__codec; (** @@ -4257,6 +4680,15 @@ function avcodec_encode_subtitle(avctx: PAVCodecContext; buf: PByteArray; buf_size: cint; sub: {const} PAVSubtitle): cint; cdecl; external av__codec; +(** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() / + * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will + * do nothing. + *) function avcodec_close(avctx: PAVCodecContext): cint; cdecl; external av__codec; @@ -4285,7 +4717,7 @@ procedure avcodec_default_free_buffers(s: PAVCodecContext); (* misc useful functions *) -{$IF FF_API_OLD_FF_PICT_TYPES} +{$IFDEF FF_API_OLD_FF_PICT_TYPES} (** * Return a single letter to describe the given picture type pict_type. * @@ -4306,9 +4738,9 @@ function av_get_pict_type_char(pict_type: cint): AnsiChar; function av_get_bits_per_sample(codec_id: TCodecID): cint; cdecl; external av__codec; -{$IF FF_API_OLD_SAMPLE_FMT} +{$IFDEF FF_API_OLD_SAMPLE_FMT} (** - * @deprecated Use av_get_bits_per_sample_fmt() instead. + * @deprecated Use av_get_bytes_per_sample() instead. *) function av_get_bits_per_sample_format(sample_fmt: TAVSampleFormat): cint; cdecl; external av__codec; deprecated; @@ -4362,7 +4794,7 @@ type offset: cint64; ///< byte offset from starting packet start cur_frame_end: array [0..AV_PARSER_PTS_NB - 1] of cint64; - (*! + (** * Set by parser to 1 for key frames and 0 for non-key frames. * It is initialized to -1, so if the parser doesn't set this flag, * old-style fallback using FF_I_TYPE picture type as key frames @@ -4470,18 +4902,6 @@ procedure av_register_codec_parser(parser: PAVCodecParser); function av_parser_init(codec_id: cint): PAVCodecParserContext; cdecl; external av__codec; -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -function av_parser_parse(s: PAVCodecParserContext; - avctx: PAVCodecContext; - poutbuf: PPointer; - poutbuf_size: PCint; - buf: {const} PByteArray; - buf_size: cint; - pts: cint64; - dts: cint64): cint; - cdecl; external av__codec; deprecated; -{$IFEND} - (** * Parse a packet. * @@ -4578,7 +4998,7 @@ function av_bitstream_filter_next(f: PAVBitStreamFilter): PAVBitStreamFilter; * * @see av_realloc *) -procedure av_fast_realloc(ptr: pointer; size: PCuint; min_size: FF_INTERNALC_MEM_TYPE); +procedure av_fast_realloc(ptr: pointer; size: PCuint; min_size: size_t); cdecl; external av__codec; (** @@ -4593,22 +5013,18 @@ procedure av_fast_realloc(ptr: pointer; size: PCuint; min_size: FF_INTERNALC_MEM * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and * *size 0 if an error occurred. *) -procedure av_fast_malloc(ptr: pointer; size: PCuint; min_size: FF_INTERNALC_MEM_TYPE); +procedure av_fast_malloc(ptr: pointer; size: PCuint; min_size: size_t); cdecl; external av__codec; -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} (** - * @deprecated Deprecated in favor of av_image_copy(). + * Same behaviour av_fast_malloc but the buffer has additional + * FF_INPUT_PADDING_SIZE at the end which will will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. *) -type - PQuaduint8Array = ^TQuaduint8Array; - TQuaduint8Array = array [0..3] of cuint8; - -procedure av_picture_data_copy(dst_data: PQuaduint8Array; dst_linesize: TQuadIntArray; - src_data: PQuaduint8Array; src_linesize: TQuadIntArray; - pix_fmt: TAVPixelFormat; width: cint; height: cint); - cdecl; external av__codec; deprecated; -{$IFEND} +procedure av_fast_padded_malloc(ptr: pointer; size: Pcuint; min_size: size_t); + cdecl; external av__codec; (** * Copy image src to dst. Wraps av_picture_data_copy() above. @@ -4656,24 +5072,6 @@ function av_picture_pad(dst: PAVPicture; function av_xiphlacing(s: PByte; v: cuint): cuint; cdecl; external av__codec; -{$IF LIBAVCODEC_VERSION_MAJOR < 53} -(** - * Parse str and put in width_ptr and height_ptr the detected values. - * - * @deprecated Deprecated in favor of av_parse_video_size(). - *) -function av_parse_video_frame_size(width_ptr: PCint; height_ptr: PCint; str: {const} PAnsiChar): cint; - cdecl; external av__codec; deprecated; - -(** - * Parse str and store the detected values in *frame_rate. - * - * @deprecated Deprecated in favor of av_parse_video_rate(). - *) -function av_parse_video_frame_rate(frame_rate: PAVRational; str: {const} PAnsiChar): cint; - cdecl; external av__codec; deprecated; -{$IFEND} - (** * Log a generic warning message about a missing feature. This function is * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) @@ -4697,7 +5095,7 @@ procedure av_log_missing_feature(avc: Pointer; feature: {const} PAnsiChar; want_ * a pointer to an AVClass struct * @param[in] msg string containing an optional message, or NULL if no message *) -procedure av_log_ask_for_sample(avc: Pointer; msg: {const} PAnsiChar); +procedure av_log_ask_for_sample(avc: Pointer; msg: {const} PAnsiChar); {todo: av_printf_format(2, 3);} cdecl; external av__codec; (** @@ -4742,6 +5140,37 @@ type //function av_lockmgr_register(cb: function (mutex: Ppointer; op: TAVLockOp)): cint; // cdecl; external av__codec; +(** + * Get the type of the given codec. + *) +function avcodec_get_type(codec_id: TCodecID): TAVMediaType; + cdecl; external av__codec; + +(** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + *) +function avcodec_get_class(): {const} PAVClass; + cdecl; external av__codec; + +(** + * Get the AVClass for AVFrame. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + *) +function avcodec_get_frame_class(): {const} PAVClass; + cdecl; external av__codec; + +(** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + *) +function avcodec_is_open(s: PAVCodecContext): cint; + cdecl; external av__codec; + implementation end. diff --git a/src/lib/ffmpeg-0.10/avformat.pas b/src/lib/ffmpeg-0.10/avformat.pas index a1c72e66..31d0777d 100644 --- a/src/lib/ffmpeg-0.10/avformat.pas +++ b/src/lib/ffmpeg-0.10/avformat.pas @@ -61,9 +61,9 @@ const * by removing all unneeded conditionals. *) (* Max. supported version by this header *) - LIBAVFORMAT_MAX_VERSION_MAJOR = 52; - LIBAVFORMAT_MAX_VERSION_MINOR = 111; - LIBAVFORMAT_MAX_VERSION_RELEASE = 0; + LIBAVFORMAT_MAX_VERSION_MAJOR = 53; + LIBAVFORMAT_MAX_VERSION_MINOR = 32; + LIBAVFORMAT_MAX_VERSION_RELEASE = 100; LIBAVFORMAT_MAX_VERSION = (LIBAVFORMAT_MAX_VERSION_MAJOR * VERSION_MAJOR) + (LIBAVFORMAT_MAX_VERSION_MINOR * VERSION_MINOR) + (LIBAVFORMAT_MAX_VERSION_RELEASE * VERSION_RELEASE); @@ -93,83 +93,271 @@ const } (** - * Return the LIBAVFORMAT_VERSION_INT constant. - *) -function avformat_version(): cuint; - cdecl; external av__format; - -(** - * Return the libavformat build-time configuration. - *) -function avformat_configuration(): {const} PansiChar; - cdecl; external av__format; - -(** - * Return the libavformat license. + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + *) +{$macro on} +{$ifndef FF_API_OLD_METADATA2} +{$define FF_API_OLD_METADATA2 := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_OLD_AVIO} +{$define FF_API_OLD_AVIO := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_DUMP_FORMAT} +{$define FF_API_DUMP_FORMAT := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_PARSE_DATE} +{$define FF_API_PARSE_DATE := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_FIND_INFO_TAG} +{$define FF_API_FIND_INFO_TAG := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_PKT_DUMP} +{$define FF_API_PKT_DUMP := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_GUESS_IMG2_CODEC} +{$define FF_API_GUESS_IMG2_CODEC := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_SDP_CREATE} +{$define FF_API_SDP_CREATE := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_ALLOC_OUTPUT_CONTEXT} +{$define FF_API_ALLOC_OUTPUT_CONTEXT := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_FORMAT_PARAMETERS} +{$define FF_API_FORMAT_PARAMETERS := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_FLAG_RTP_HINT} +{$define FF_API_FLAG_RTP_HINT := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_AVSTREAM_QUALITY} +{$define FF_API_AVSTREAM_QUALITY := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_LOOP_INPUT} +{$define FF_API_LOOP_INPUT := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_LOOP_OUTPUT} +{$define FF_API_LOOP_OUTPUT := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_TIMESTAMP} +{$define FF_API_TIMESTAMP := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_FILESIZE} +{$define FF_API_FILESIZE := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_MUXRATE} +{$define FF_API_MUXRATE := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_RTSP_URL_OPTIONS} +{$define FF_API_RTSP_URL_OPTIONS := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_NEW_STREAM} +{$define FF_API_NEW_STREAM := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_PRELOAD} +{$define FF_API_PRELOAD := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_STREAM_COPY} +{$define FF_API_STREAM_COPY := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_SEEK_PUBLIC} +{$define FF_API_SEEK_PUBLIC := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_REORDER_PRIVATE} +{$define FF_API_REORDER_PRIVATE := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_OLD_INTERRUPT_CB} +{$define FF_API_OLD_INTERRUPT_CB := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_SET_PTS_INFO} +{$define FF_API_SET_PTS_INFO := (LIBAVFORMAT_VERSION_MAJOR < 54)} +{$endif} +{$ifndef FF_API_CLOSE_INPUT_FILE} +{$define FF_API_CLOSE_INPUT_FILE := (LIBAVFORMAT_VERSION_MAJOR < 55)} +{$endif} + +(** + * @defgroup libavf I/O and Muxing/Demuxing Library + * @{ + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). Before using lavf, you need to call + * av_register_all() to register all compiled muxers, demuxers and protocols. + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * registered input/output formats using the av_iformat_next() / + * av_oformat_next() functions. The protocols layer is not part of the public + * API, so you can only get the names of supported protocols with the + * avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libav structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more frames which belong a single + * elementary stream. In lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL or filename, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + * *) -function avformat_license(): {const} PansiChar; - cdecl; external av__format; type PAVFile = Pointer; (* - * Public Metadata API. + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf * The metadata API allows libavformat to export metadata tags to a client - * application using a sequence of key/value pairs. Like all strings in FFmpeg, - * metadata must be stored as UTF-8 encoded Unicode. Note that metadata + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * * Important concepts to keep in mind: - * 1. Keys are unique; there can never be 2 tags with the same key. This is + * - Keys are unique; there can never be 2 tags with the same key. This is * also meant semantically, i.e., a demuxer should not knowingly produce * several keys that are literally different but semantically identical. * E.g., key=Author5, key=Author6. In this example, all authors must be * placed in the same tag. - * 2. Metadata is flat, not hierarchical; there are no subtags. If you + * - Metadata is flat, not hierarchical; there are no subtags. If you * want to store, e.g., the email address of the child of producer Alice * and actor Bob, that could have key=alice_and_bobs_childs_email_address. - * 3. Several modifiers can be applied to the tag name. This is done by + * - Several modifiers can be applied to the tag name. This is done by * appending a dash character ('-') and the modifier name in the order * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. - * a) language -- a tag whose value is localized for a particular language + * - language -- a tag whose value is localized for a particular language * is appended with the ISO 639-2/B 3-letter language code. * For example: Author-ger=Michael, Author-eng=Mike * The original/default language is in the unqualified "Author" tag. * A demuxer should set a default if it sets any translated tag. - * b) sorting -- a modified version of a tag that should be used for + * - sorting -- a modified version of a tag that should be used for * sorting will have '-sort' appended. E.g. artist="The Beatles", * artist-sort="Beatles, The". * - * 4. Demuxers attempt to export metadata in a generic format, however tags + * - Demuxers attempt to export metadata in a generic format, however tags * with no generic equivalents are left as they are stored in the container. * Follows a list of generic tag names: * - * album -- name of the set this work belongs to - * album_artist -- main creator of the set/album, if different from artist. - * e.g. "Various Artists" for compilation albums. - * artist -- main creator of the work - * comment -- any additional description of the file. - * composer -- who composed the work, if different from artist. - * copyright -- name of copyright holder. - * creation_time-- date when the file was created, preferably in ISO 8601. - * date -- date when the work was created, preferably in ISO 8601. - * disc -- number of a subset, e.g. disc in a multi-disc collection. - * encoder -- name/settings of the software/hardware that produced the file. - * encoded_by -- person/group who created the file. - * filename -- original name of the file. - * genre -- . - * language -- main language in which the work is performed, preferably - * in ISO 639-2 format. Multiple languages can be specified by - * separating them with commas. - * performer -- artist who performed the work, if different from artist. - * E.g for "Also sprach Zarathustra", artist would be "Richard - * Strauss" and performer "London Philharmonic Orchestra". - * publisher -- name of the label/publisher. - * service_name -- name of the service in broadcasting (channel name). - * service_provider -- name of the service provider in broadcasting. - * title -- name of the work. - * track -- number of this work in the set, can be in form current/total. - * variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} *) {$IF FF_API_OLD_METADATA2} @@ -217,21 +405,6 @@ function av_metadata_get(m: PAVDictionary; key: {const} PAnsiChar; prev: {const} PAVDictionaryEntry; flags: cint): PAVDictionaryEntry; cdecl; external av__format; -{$IF FF_API_OLD_METADATA} -(** - * Set the given tag in *pm, overwriting an existing tag. - * - * @param pm pointer to a pointer to a metadata struct. If *pm is NULL - * a metadata struct is allocated and put in *pm. - * @param key tag key to add to *pm (will be av_strduped) - * @param value tag value to add to *pm (will be av_strduped) - * @return >= 0 on success otherwise an error code <0 - * @deprecated Use av_metadata_set2() instead. - *) -function av_metadata_set(var pm: PAVMetadata; key: {const} PAnsiChar; value: {const} PAnsiChar): cint; - cdecl; external av__format; deprecated; -{$ENDIF} - (** * Set the given tag in *pm, overwriting an existing tag. * @@ -261,7 +434,9 @@ procedure av_metadata_copy(var dst: PAVDictionary; src: PAVDictionary; flags: ci *) procedure av_metadata_free(var m: PAVDictionary); cdecl; external av__format; deprecated; - +(** + * @} + *) {$ENDIF} (* packet functions *) @@ -338,7 +513,7 @@ const AVPROBE_SCORE_MAX = 100; ///< Maximum score, half of that is used for file-extension-based detection AVPROBE_PADDING_SIZE = 32; ///< extra allocated bytes at the end of the probe buffer - //! Demuxer will use url_fopen, no opened file should be provided by the caller. +/// Demuxer will use avio_open, no opened file should be provided by the caller. AVFMT_NOFILE = $0001; AVFMT_NEEDNUMBER = $0002; (**< Needs '%d' in filename. *) AVFMT_SHOW_IDS = $0008; (**< Show format stream IDs numbers. *) @@ -350,7 +525,15 @@ const AVFMT_TS_DISCONT = $0200; (**< Format allows timestamp discontinuities. *) AVFMT_VARIABLE_FPS = $0400; (**< Format allows variable fps. *) AVFMT_NODIMENSIONS = $0800; (**< Format does not need width/height *) - + AVFMT_NOSTREAMS = $1000; (**< Format does not require any streams *) + AVFMT_NOBINSEARCH = $2000; (**< Format does not allow to fallback to binary search via read_timestamp *) + AVFMT_NOGENSEARCH = $4000; (**< Format does not allow to fallback to generic search *) + AVFMT_NO_BYTE_SEEK = $8000; (**< Format does not allow seeking by bytes *) + AVFMT_ALLOW_FLUSH = $10000; (**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. *) + AVFMT_TS_NONSTRICT = $8000000; (**< Format does not require strictly + increasing timestamps, but they must + still be monotonic *) + // used by AVIndexEntry AVINDEX_KEYFRAME = $0001; @@ -370,6 +553,8 @@ const AVFMT_FLAG_NOPARSE = $0020; ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled AVFMT_FLAG_RTP_HINT = $0040; ///< Add RTP hinting to the output file + MAX_STD_TIMEBASES = (60*12+5); + // used by AVStream MAX_REORDER_DELAY = 16; @@ -409,6 +594,7 @@ type PAVInputFormat = ^TAVInputFormat; PAVIndexEntry = ^TAVIndexEntry; + PPAVStream = ^PAVStream; PAVStream = ^TAVStream; PAVPacketList = ^TAVPacketList; @@ -432,20 +618,6 @@ type s_conv: {const} PAVMetadataConv; end; - PAVChapter = ^TAVChapter; - TAVChapter = record - id: cint; ///< unique ID to identify the chapter - time_base: TAVRational; ///< time base in which the start/end timestamps are specified - start, end_: cint64; ///< chapter start/end time in time_base units -{$IF FF_API_OLD_METADATA} - title: PAnsiChar; ///< chapter title -{$ENDIF} - metadata: PAVMetadata; - end; - - TAVChapterArray = array[0..(MaxInt div SizeOf(TAVChapter))-1] of TAVChapter; - PAVChapterArray = ^TAVChapterArray; - TAVFormatParameters = record time_base: TAVRational; sample_rate: cint; @@ -465,11 +637,13 @@ type unsigned int prealloced_context:1; } bf_flags: byte; // 0:mpeg2ts_raw/1:mpeg2ts_compute_pcr/2:initial_pause/3:prealloced_context - video_codec_id: TCodecID; - audio_codec_id: TCodecID; end; - TAVOutputFormat = record +(** + * @addtogroup lavf_encoding + * @{ + *) + TAVOutputFormat = record name: PAnsiChar; (** * Descriptive name for the format, meant to be more human-readable @@ -487,16 +661,24 @@ type audio_codec: TCodecID; (**< default audio codec *) video_codec: TCodecID; (**< default video codec *) write_header: function (c: PAVFormatContext): cint; cdecl; + (** + * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, + * pkt can be NULL in order to flush data buffered in the muxer. + * When flushing, return 0 if there still is more data to flush, + * or 1 if everything was flushed and there is no more buffered + * data. + *) write_packet: function (c: PAVFormatContext; pkt: PAVPacket): cint; cdecl; write_trailer: function (c: PAVFormatContext): cint; cdecl; - (** - * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER - *) - flags: cint; (** - * Currently only used to set pixel format if not YUV420P. + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH *) - set_parameters: function (c: PAVFormatContext; f: PAVFormatParameters): cint; cdecl; + flags: cint; + + dummy: pointer; + interleave_packet: function (s: PAVFormatContext; out_: PAVPacket; in_: PAVPacket; flush: cint): cint; cdecl; @@ -508,12 +690,34 @@ type subtitle_codec: TCodecID; (**< default subtitle codec *) +{$IF FF_API_OLD_METADATA2} {const} metadata_conv: PAVMetadataConv; +{$ENDIF} - (* private fields *) + {const} priv_class: PAVClass; ///< AVClass for the private context + + (** + * Test if the given codec can be stored in this container. + * + * @return 1 if the codec is supported, 0 if it is not. + * A negative number if unknown. + *) + query_codec: function (id: TCodecID; std_compliance: cint): cint; cdecl; + + get_output_timestamp: procedure (s: PAVFormatContext; stream: cint; + dts: Pcint64; wall: Pcint64); cdecl; + + (* private fields *) next: PAVOutputFormat; end; - +(** + * @} + *) + +(** + * @addtogroup lavf_decoding + * @{ + *) TAVInputFormat = record (** * A comma separated list of short names for the format. New names @@ -576,14 +780,16 @@ type timestamp: cint64; flags: cint): cint; cdecl; (** - * Gets the next timestamp in stream[stream_index].time_base units. + * Get the next timestamp in stream[stream_index].time_base units. * @return the timestamp or AV_NOPTS_VALUE if an error occurred *) read_timestamp: function (s: PAVFormatContext; stream_index: cint; pos: pint64; pos_limit: cint64): cint64; cdecl; (** - * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER. + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK. *) flags: cint; @@ -631,7 +837,10 @@ type (* private fields *) next: PAVInputFormat; end; - +(** + * @} + *) + TAVStreamParseType = ( AVSTREAM_PARSE_NONE, AVSTREAM_PARSE_FULL, (**< full parsing and repack *) @@ -642,8 +851,13 @@ type TAVIndexEntry = record pos: cint64; - timestamp: cint64; - { Delphi doesn't support bitfields -> use flags_size instead + timestamp: cint64; (**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + *) + { Delphi doesn't support bitfields -> use flags_size instead int flags:2; int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). } @@ -651,6 +865,16 @@ type min_distance: cint; (**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. *) end; + PStreamInfo = ^TStreamInfo; + TStreamInfo = record + last_dts: cint64; + duration_gcd: cint64; + duration_count: cint; + duration_error: array[0..1] of array[0..1] of array[0..MAX_STD_TIMEBASES - 1] of cdouble; + codec_info_duration: cint64; + nb_decoded_frames: cint; + end; + (** * Stream structure. * New fields can be added to the end with minor version bumps. @@ -673,32 +897,43 @@ type r_frame_rate: TAVRational; priv_data: pointer; +{$IFDEF FF_API_REORDER_PRIVATE} (* internal data used in av_find_stream_info() *) first_dts: cint64; +{$ENDIF} (** * encoding: pts generation when outputting stream *) pts: TAVFrac; + (** * This is the fundamental unit of time (in seconds) in terms * of which frame timestamps are represented. For fixed-fps content, * time base should be 1/framerate and timestamp increments should be 1. + * decoding: set by libavformat + * encoding: set by libavformat in av_write_header *) time_base: TAVRational; +{$IFDEF FF_API_REORDER_PRIVATE} pts_wrap_bits: cint; (* number of bits in pts (used for wrapping control) *) +{$ENDIF} +{$IFDEF FF_API_STREAM_COPY} (* ffmpeg.c private use *) - stream_copy: cint; (**< If set, just copy stream. *) + stream_copy: cint; (**< If set, just copy stream. *) {deprecated} +{$ENDIF} discard: TAVDiscard; ///< Selects which packets can be discarded at will and do not need to be demuxed. +{$IFDEF FF_API_AVSTREAM_QUALITY} //FIXME move stuff to a flags field? (** * Quality, as it has been removed from AVCodecContext and put in AVVideoFrame. * MN:dunno if thats the right place, for it *) - quality: cfloat; + quality: cfloat; {deprecated} +{$ENDIF} (** - * Decoding: pts of the first frame of the stream, in stream time base. + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. * Only set this if you are absolutely 100% sure that the value you set * it to really is the pts of the first frame. * This may be undefined (AV_NOPTS_VALUE). @@ -714,10 +949,7 @@ type *) duration: cint64; -{$IF FF_API_OLD_METADATA} - language: array [0..3] of PAnsiChar; (**< ISO 639-2/B 3-letter language code (empty string if undefined) *) -{$ENDIF} - +{$IFDEF FF_API_REORDER_PRIVATE} (* av_read_frame() support *) need_parsing: TAVStreamParseType; parser: PAVCodecParserContext; @@ -730,17 +962,16 @@ type support seeking natively. *) nb_index_entries: cint; index_entries_allocated_size: cuint; +{$ENDIF} nb_frames: cint64; ///< number of frames in this stream if known or 0 - unused: array [0..4] of cint64; -{$IF FF_API_OLD_METADATA} - filename: PAnsiChar; (**< source filename of the stream *) -{$ENDIF} - disposition: cint; (**< AV_DISPOSITION_* bitfield *) + +{$IFDEF FF_API_REORDER_PRIVATE} probe_data: TAVProbeData; pts_buffer: array [0..MAX_REORDER_DELAY] of cint64; +{$ENDIF} (** * sample aspect ratio (0 if unknown) @@ -749,8 +980,9 @@ type *) sample_aspect_ratio: TAVRational; - metadata: PAVMetadata; + metadata: PAVDictionary; +{$IFDEF FF_API_REORDER_PRIVATE} {* Intended mostly for av_read_frame() support. Not supposed to be used by *} {* external applications; try to use something else if at all possible. *} cur_ptr: {const} PCuint8; @@ -775,53 +1007,188 @@ type (** * last packet in packet_buffer for this stream when muxing. - * used internally, NOT PART OF PUBLIC API, dont read or write from outside of libav* + * Used internally, NOT PART OF PUBLIC API, do not read or + * write from outside of libav* *) last_in_packet_buffer: PAVPacketList; +{$ENDIF} (** * Average framerate *) avg_frame_rate: TAVRational; - (** + (***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + *) + + (** * Number of frames that have been demuxed during av_find_stream_info() *) codec_info_nb_frames: cint; + + (** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + *) + stream_identifier: cint; + + interleaver_chunk_size: cint64; + interleaver_chunk_duration: cint64; + + (** + * Stream information used internally by av_find_stream_info() + *) + info: PStreamInfo; + + (** + * flag to indicate that probing is requested + * NOT PART OF PUBLIC API + *) + request_probe: cint; +{$IFNDEF FF_API_REORDER_PRIVATE} + {const} cur_ptr: PByte; + cur_len: cint; + cur_pkt: TAVPacket; + + // Timestamp generation support: + (** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + *) + reference_dts: cint64; + first_dts: cint64; + cur_dts: cint64; + last_IP_duration: cint; + last_IP_pts: cint64; + + (** + * Number of packets to buffer for codec probing + *) + probe_packets: cint; + + (** + * last packet in packet_buffer for this stream when muxing. + *) + last_in_packet_buffer: PAVPacketList; + probe_data: TAVProbeData; + pts_buffer: array [0..MAX_REORDER_DELAY] of cint64; + (* av_read_frame() support *) + need_parsing: TAVStreamParseType; + parser: PAVCodecParserContext; + + index_entries: PAVIndexEntry; (**< Only used if the format does not + support seeking natively. *) + nb_index_entries: cint; + index_entries_allocated_size: cuint; + + pts_wrap_bits: cint; (**< number of bits in pts (used for wrapping control) *) +{$ENDIF} end; +(** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + *) + TAVProgram = record + id: cint; + flags: cint; + discard: TAVDiscard; ///< selects which program to discard and which to feed to the caller + stream_index: Pcuint; + nb_stream_indexes: cuint; + metadata: PAVDictionary; + + program_num: cint; + pmt_pid: cint; + pcr_pid: cint; + end; (*AVProgram*) + + PAVChapter = ^TAVChapter; + TAVChapter = record + id: cint; ///< unique ID to identify the chapter + time_base: TAVRational; ///< time base in which the start/end timestamps are specified + start, end_: cint64; ///< chapter start/end time in time_base units + metadata: PAVDictionary; + end; (*AVChapter*) + + TAVChapterArray = array[0..(MaxInt div SizeOf(TAVChapter))-1] of TAVChapter; + PAVChapterArray = ^TAVChapterArray; + (** * Format I/O context. * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bump. - * sizeof(AVFormatContext) must not be used outside libav*. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. *) TAVFormatContext = record + (** + * A class for logging and AVOptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + *) av_class: PAVClass; (**< Set by avformat_alloc_context. *) - (* Can only be iformat or oformat, not both at the same time. *) + + (** + * Can only be iformat or oformat, not both at the same time. + * + * decoding: set by avformat_open_input(). + * encoding: set by the user. + *) iformat: PAVInputFormat; oformat: PAVOutputFormat; + + (** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + *) priv_data: pointer; - pb: PByteIOContext; + (* + * I/O context. + * + * decoding: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * encoding: set by the user. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + *) + pb: PByteIOContext; + (** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * decoding: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * encoding: streams are created by the user before avformat_write_header(). + *) nb_streams: cuint; - streams: array [0..MAX_STREAMS - 1] of PAVStream; + streams: PPAVStream; + filename: array [0..1023] of AnsiChar; (* input or output filename *) (* stream info *) - timestamp: cint64; -{$IF FF_API_OLD_METADATA} - title: array [0..511] of AnsiChar; - author: array [0..511] of AnsiChar; - copyright: array [0..511] of AnsiChar; - comment: array [0..511] of AnsiChar; - album: array [0..511] of AnsiChar; - year: cint; (**< ID3 year, 0 if none *) - track: cint; (**< track number, 0 if none *) - genre: array [0..31] of AnsiChar; (**< ID3 genre *) +{$IFDEF FF_API_TIMESTAMP} + (** + * @deprecated use 'creation_time' metadata tag instead + *) + timestamp: cint64; {deprecated} {$ENDIF} +{$IFDEF FF_API_REORDER_PRIVATE} ctx_flags: cint; (**< Format-specific flags, see AVFMTCTX_xx *) (* private data for pts handling (do not modify directly). *) (** @@ -830,6 +1197,7 @@ type * streams. *) packet_buffer: PAVPacketList; +{$ENDIF} (** * Decoding: position of the first frame of the component, in @@ -844,10 +1212,14 @@ type * AVStream values if not set. *) duration: cint64; + +{$IFDEF FF_API_FILESIZE} (** * decoding: total file size, 0 if unknown *) file_size: cint64; +{$ENDIF} + (** * Decoding: total stream bitrate in bit/s, 0 if not * available. Never set it directly if the file_size and the @@ -855,28 +1227,42 @@ type *) bit_rate: cint; +{$IFDEF FF_API_REORDER_PRIVATE} (* av_read_frame() support *) cur_st: PAVStream; - cur_ptr_deprecated: pbyte; - cur_len_deprecated: cint; - cur_pkt_deprecated: TAVPacket; (* av_seek_frame() support *) data_offset: cint64; (**< offset of the first packet *) - index_built: cint; +{$ENDIF} - mux_rate: cint; +{$IFDEF FF_API_MUXRATE} + (** + * use mpeg muxer private options instead + *) + mux_rate: cint; {deprecated} +{$ENDIF} packet_size: cuint; - preload: cint; +{$IFDEF FF_API_PRELOAD} + preload: cint; {deprecated} +{$ENDIF} max_delay: cint; +{$IFDEF FF_API_LOOP_OUTPUT} (** * number of times to loop output in formats that support it + * + * @deprecated use the 'loop' private option in the gif muxer. *) loop_output: cint; +{$ENDIF} flags: cint; - loop_input: cint; +{$IFDEF FF_API_LOOP_INPUT} + (** + * @deprecated, use the 'loop' img2 demuxer private option. + *) + loop_input: cint; {deprecated} +{$ENDIF} (** * decoding: size of data to probe; encoding: unused. @@ -930,6 +1316,7 @@ type * obtained from realtime capture devices. *) max_picture_buffer: cuint; + nb_chapters: cuint; chapters: PAVChapterArray; @@ -949,13 +1336,15 @@ type packet_buffer_end: PAVPacketList; - metadata: PAVMetadata; + metadata: PAVDictionary; +{$IFDEF FF_API_REORDER_PRIVATE} (** * Remaining size available for raw_packet_buffer, in bytes. * NOT PART OF PUBLIC API *) raw_packet_buffer_remaining_size: cint; +{$ENDIF} (** * Start time of the stream in real world time, in microseconds @@ -966,199 +1355,280 @@ type *) start_time_realtime: cint64; - end; + (** + * decoding: number of frames used to probe fps + *) + fps_probe_size: cint; - (** - * New fields can be added to the end with minor version bumps. - * Removal, reordering and changes to existing fields require a major - * version bump. - * sizeof(AVProgram) must not be used outside libav*. - *) - TAVProgram = record - id : cint; -{$IF FF_API_OLD_METADATA} - provider_name : PAnsiChar; ///< network name for DVB streams - name : PAnsiChar; ///< service name for DVB streams + (** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + *) + error_recognition: cint; + + (** + * Custom interrupt callbacks for the I/O layer. + * + * decoding: set by the user before avformat_open_input(). + * encoding: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + *) + interrupt_callback: TAVIOInterruptCB; + + (** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + *) + ts_id: cint; + + (** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user via AVOptions (NO direct access) + * - decoding: unused + *) + audio_preload: cint; + + (** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user via AVOptions (NO direct access) + * - decoding: unused + *) + max_chunk_duration: cint; + + (** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user via AVOptions (NO direct access) + * - decoding: unused + *) + max_chunk_size: cint; + + (***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + *) +{$IFNDEF FF_API_REORDER_PRIVATE} + (** + * Raw packets from the demuxer, prior to parsing and decoding. + * This buffer is used for buffering packets until the codec can + * be identified, as parsing cannot be done without knowing the + * codec. + *) + raw_packet_buffer_: PAVPacketList; + raw_packet_buffer_end_: PAVPacketList; + (** + * Remaining size available for raw_packet_buffer, in bytes. + *) + raw_packet_buffer_remaining_size: cint; + + (** + * This buffer is only needed when packets were already buffered but + * not decoded, for example to get the codec parameters in MPEG + * streams. + *) + packet_buffer: PAVPacketList; + packet_buffer_end_: PAVPacketList; + + (* av_read_frame() support *) + cur_st: PAVStream; + + (* av_seek_frame() support *) + data_offset: cint64; (**< offset of the first packet *) {$ENDIF} - flags : cint; - discard : TAVDiscard; ///< selects which program to discard and which to feed to the caller - stream_index : PCardinal; - nb_stream_indexes : PCardinal; - metadata : PAVMetadata; end; TAVPacketList = record pkt: TAVPacket; next: PAVPacketList; - end; + end; (*AVPacketList*) (** - * Convert all the metadata sets from ctx according to the source and - * destination conversion tables. If one of the tables is NULL, then - * tags are converted to/from ffmpeg generic tag names. - * - * @param d_conv destination tags format conversion table - * @param s_conv source tags format conversion table + * This function is provided for compatibility reason and currently does nothing. *) -procedure av_metadata_conv(ctx: PAVFormatContext; {const} d_conv: PAVMetadataConv; - {const} s_conv: PAVMetadataConv); - cdecl; external av__format; +procedure av_metadata_conv(ctx: PAVFormatContext; {const} d_conv: PAVMetadataConv; {const} s_conv: PAVMetadataConv); + cdecl; external av__format; deprecated; -{ -var - first_iformat: PAVInputFormat; external av__format; - first_oformat: PAVOutputFormat; external av__format; -} (** - * If f is NULL, returns the first registered input format, - * if f is non-NULL, returns the next registered input format after f - * or NULL if f is the last one. + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ *) -function av_iformat_next(f: PAVInputFormat): PAVInputFormat; - cdecl; external av__format; + (** - * If f is NULL, returns the first registered output format, - * if f is non-NULL, returns the next registered input format after f - * or NULL if f is the last one. + * Return the LIBAVFORMAT_VERSION_INT constant. *) -function av_oformat_next(f: PAVOutputFormat): PAVOutputFormat; - cdecl; external av__format; +function avformat_version(): cuint; + cdecl; external av__format; -function av_guess_image2_codec(filename: {const} PAnsiChar): TCodecID; - cdecl; external av__format; +(** + * Return the libavformat build-time configuration. + *) +function avformat_configuration(): {const} PansiChar; + cdecl; external av__format; -(* XXX: Use automatic init with either ELF sections or C file parser *) -(* modules. *) +(** + * Return the libavformat license. + *) +function avformat_license(): {const} PansiChar; + cdecl; external av__format; -(* utils.c *) -procedure av_register_input_format(format: PAVInputFormat); +(** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + * @see av_register_protocol() + *) +procedure av_register_all(); cdecl; external av__format; +procedure av_register_input_format(format: PAVInputFormat); + cdecl; external av__format; procedure av_register_output_format(format: PAVOutputFormat); cdecl; external av__format; -function guess_stream_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; - cdecl; external av__format; deprecated; - (** - * Return the output format in the list of registered output formats - * which best matches the provided parameters, or return NULL if - * there is no match. + * Do global initialization of network components. This is optional, + * but recommended, since it avoids the overhead of implicitly + * doing the setup for each session. * - * @param short_name if non-NULL checks if short_name matches with the - * names of the registered formats - * @param filename if non-NULL checks if filename terminates with the - * extensions of the registered formats - * @param mime_type if non-NULL checks if mime_type matches with the - * MIME type of the registered formats + * Calling this function will become mandatory if using network + * protocols at some major version bump. *) +function avformat_network_init(): cint; + cdecl; external av__format; + (** - * @deprecated Use av_guess_format() instead. + * Undo the initialization done by avformat_network_init. *) -function guess_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; - cdecl; external av__format; deprecated; - -function av_guess_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; +function avformat_network_deinit(): cint; cdecl; external av__format; (** - * Guess the codec ID based upon muxer and filename. + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. *) -function av_guess_codec(fmt: PAVOutputFormat; short_name: PAnsiChar; - filename: PAnsiChar; mime_type: PAnsiChar; - type_: TCodecType): TCodecID; - cdecl; external av__format; +function av_iformat_next(f: PAVInputFormat): PAVInputFormat; + cdecl; external av__format; +(** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + *) +function av_oformat_next(f: PAVOutputFormat): PAVOutputFormat; + cdecl; external av__format; (** - * Send a nice hexadecimal dump of a buffer to the specified file stream. - * - * @param f The file stream pointer where the dump should be sent to. - * @param buf buffer - * @param size buffer size - * - * @see av_hex_dump_log, av_pkt_dump, av_pkt_dump_log + * Allocate an AVFormatContext. + * Can be freed with av_free() but do not forget to free everything you + * explicitly allocated as well! *) -procedure av_hex_dump(f: PAVFile; buf: PByteArray; size: cint); +function avformat_alloc_context(): PAVFormatContext; cdecl; external av__format; (** - * Send a nice hexadecimal dump of a buffer to the log. - * - * @param avcl A pointer to an arbitrary struct of which the first field is a - * pointer to an AVClass struct. - * @param level The importance level of the message, lower values signifying - * higher importance. - * @param buf buffer - * @param size buffer size - * - * @see av_hex_dump, av_pkt_dump, av_pkt_dump_log + * Free an AVFormatContext and all its streams. + * @param s context to free *) -procedure av_hex_dump_log(avcl: Pointer; level: cint; buf: PByteArray; size: cint); +procedure avformat_free_context(s: PAVFormatContext); cdecl; external av__format; (** - * Send a nice dump of a packet to the specified file stream. + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. * - * @param f The file stream pointer where the dump should be sent to. - * @param pkt packet to dump - * @param dump_payload True if the payload must be displayed, too. + * @see av_opt_find(). *) -procedure av_pkt_dump(f: PAVFile; pkt: PAVPacket; dump_payload: cint); +function avformat_get_class(): {const}PAVClass; cdecl; external av__format; (** - * Send a nice dump of a packet to the log. + * Add a new stream to a media file. * - * @param avcl A pointer to an arbitrary struct of which the first field is a - * pointer to an AVClass struct. - * @param level The importance level of the message, lower values signifying - * higher importance. - * @param pkt packet to dump - * @param dump_payload True if the payload must be displayed, too. + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * @param c If non-NULL, the AVCodecContext corresponding to the new stream + * will be initialized to use this codec. This is needed for e.g. codec-specific + * defaults to be set, so codec should be provided if it is known. + * + * @return newly created stream or NULL on error. *) -procedure av_pkt_dump_log(avcl: Pointer; level: cint; pkt: PAVPacket; dump_payload: cint); +function avformat_new_stream(s: PAVFormatContext; c: PAVCodec): PAVStream; + cdecl; external av__format; + +function av_new_program(s: PAVFormatContext; id: cint): PAVProgram; cdecl; external av__format; (** - * Initialize libavformat and register all the muxers, demuxers and - * protocols. If you do not call this function, then you can select - * exactly which formats you want to support. - * - * @see av_register_input_format() - * @see av_register_output_format() - * @see av_register_protocol() + * @} *) -procedure av_register_all(); + +{$IFDEF FF_API_GUESS_IMG2_CODEC} +function av_guess_image2_codec(filename: {const} PAnsiChar): TCodecID; + cdecl; external av__format; +{$ENDIF} + +{$IFDEF FF_API_PKT_DUMP} +procedure av_pkt_dump(f: PAVFile; pkt: PAVPacket; dump_payload: cint); {deprecated} + cdecl; external av__format; +procedure av_pkt_dump_log(avcl: Pointer; level: cint; pkt: PAVPacket; dump_payload: cint); {deprecated} cdecl; external av__format; +{$ENDIF} +{$IFDEF FF_API_ALLOC_OUTPUT_CONTEXT} (** - * Get the CodecID for the given codec tag tag. - * If no codec id is found returns CODEC_ID_NONE. - * - * @param tags list of supported codec_id-codec_tag pairs, as stored - * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @deprecated deprecated in favor of avformat_alloc_output_context2() *) -function av_codec_get_id(var tags: PAVCodecTag; tag: cuint): TCodecID; +function avformat_alloc_output_context({const} format: PAnsiChar; + oformat: PAVOutputFormat; + {const} filename: PAnsiChar): PAVFormatContext; cdecl; external av__format; +{$ENDIF} (** - * Getsthe codec tag for the given codec id id. - * If no codec tag is found returns 0. + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. * - * @param tags list of supported codec_id-codec_tag pairs, as stored - * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure *) -function av_codec_get_tag(var tags: PAVCodecTag; id: TCodecID): cuint; +function avformat_alloc_output_context2(ctx: PPAVFormatContext; oformat: PAVOutputFormat; + {const} format_name: PAnsiChar; {const} filename: PAnsiChar): cint; cdecl; external av__format; -(* media file input *) +(** + * @addtogroup lavf_decoding + * @{ + *) (** * Find AVInputFormat based on the short name of the input format. @@ -1189,6 +1659,17 @@ function av_probe_input_format(pd: PAVProbeData; is_opened: cint): PAVInputForma function av_probe_input_format2(pd: PAVProbeData; is_opened: cint; score_max: PCint): PAVInputFormat; cdecl; external av__format; +(** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + *) +function av_probe_input_format3(pd: PAVProbeData; is_opened: cint; score_ret: Pcint): PAVInputFormat; + cdecl; external av__format; + +{$IFDEF FF_API_FORMAT_PARAMETERS} (** * Allocate all the structures needed to read an input stream. * This does not open the needed codecs for decoding the stream[s]. @@ -1214,20 +1695,50 @@ function av_open_input_file(var ic_ptr: PAVFormatContext; filename: PAnsiChar; fmt: PAVInputFormat; buf_size: cint; ap: PAVFormatParameters): cint; cdecl; external av__format; +{$ENDIF} (** - * Allocate an AVFormatContext. - * Can be freed with av_free() but do not forget to free everything you - * explicitly allocated as well! + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with av_close_input_file(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). + * May be a pointer to NULL, in which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed on failure. + * @param filename Name of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. *) -function avformat_alloc_context(): PAVFormatContext; +function avformat_open_input(ps: {PPAVFormatContext} pointer; {const} filename: PAnsiChar; fmt: PAVInputFormat; options: {PPAVDictionary} pointer): cint; + cdecl; external av__format; + +function av_demuxer_open(ic: PAVFormatContext; ap: TAVFormatParameters): cint; cdecl; external av__format; +{$IFDEF FF_API_FORMAT_PARAMETERS} (** - * @deprecated Use avformat_alloc_context() instead. + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @return >=0 if OK, AVERROR_xxx on error + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. *) -function av_alloc_format_context(): PAVFormatContext; +function av_find_stream_info(ic: PAVFormatContext): cint; {deprecated} cdecl; external av__format; +{$ENDIF} (** * Read packets of a media file to get stream information. This @@ -1238,11 +1749,64 @@ function av_alloc_format_context(): PAVFormatContext; * examined packets may be buffered for later processing. * * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * * @todo Let the user decide somehow what information is needed so that * we do not waste time getting stuff the user does not need. *) -function av_find_stream_info(ic: PAVFormatContext): cint; +function avformat_find_stream_info(ic: PAVFormatContext; options: {PPAVDictionary} pointer): cint; + cdecl; external av__format; + +(** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + *) +function av_find_program_from_stream(ic: PAVFormatContext; last: PAVProgram; s: cint): PAVProgram; + cdecl; external av__format; + +(** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + *) +function av_find_best_stream(ic: PAVFormatContext; + type_: TAVMediaType; + wanted_stream_nb: cint; + related_stream: cint; + decoder_ret: {PPAVCodec} pointer; + flags: cint): cint; cdecl; external av__format; (** @@ -1260,11 +1824,16 @@ function av_read_packet(s: PAVFormatContext; var pkt: TAVPacket): cint; (** * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. * * The returned packet is valid * until the next av_read_frame() or until av_close_input_file() and * must be freed with av_free_packet. For video, the packet contains - * exactly one frame. For audio, it contains an cint number of + * exactly one frame. For audio, it contains an integer number of * frames if each frame has a known fixed size (e.g. PCM or ADPCM * data). If the audio frames have a variable size (e.g. MPEG audio), * then it contains one frame. @@ -1295,40 +1864,6 @@ function av_seek_frame(s: PAVFormatContext; stream_index: cint; timestamp: cint6 flags: cint): cint; cdecl; external av__format; -(** - * Seek to timestamp ts. - * Seeking will be done so that the point from which all active streams - * can be presented successfully will be closest to ts and within min/max_ts. - * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. - * - * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in byte and - * are the file position (this may not be supported by all demuxers). - * If flags contain AVSEEK_FLAG_FRAME then all timestamps are in frames - * in the stream with stream_index (this may not be supported by all demuxers). - * Otherwise all timestamps are in units of the stream selected by stream_index - * or if stream_index is -1, in AV_TIME_BASE units. - * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as - * keyframes (this may not be supported by all demuxers). - * - * @param stream_index index of the stream which is used as time base reference. - * @param min_ts smallest acceptable timestamp - * @param ts target timestamp - * @param max_ts largest acceptable timestamp - * @param flags flags - * @return >=0 on success, error code otherwise - * - * @note This is part of the new seek API which is still under construction. - * Thus do not use this yet. It may change at any time, do not expect - * ABI compatibility yet! - *) -function avformat_seek_file(s: PAVFormatContext; - stream_index: cint; - min_ts: cint64; - ts: cint64; - max_ts: cint64; - flags: cint): cint; - cdecl; external av__format; - (** * Start playing a network-based stream (e.g. RTSP stream) at the * current position. @@ -1344,21 +1879,38 @@ function av_read_play(s: PAVFormatContext): cint; function av_read_pause(s: PAVFormatContext): cint; cdecl; external av__format; +{$IFDEF FF_API_FORMAT_PARAMETERS} (** * Free a AVFormatContext allocated by av_open_input_stream. * @param s context to free + * @deprecated use av_close_input_file() *) procedure av_close_input_stream(s: PAVFormatContext); cdecl; external av__format; +{$ENDIF} +{$IFDEF FF_API_CLOSE_INPUT_FILE} (** + * @deprecated use avformat_close_input() * Close a media file (but not its codecs). * * @param s media file handle *) procedure av_close_input_file(s: PAVFormatContext); cdecl; external av__format; +{$ENDIF} +(** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + *) +procedure avformat_close_input(s: PPAVFormatContext); + cdecl; external av__format; +(** + * @} + *) + +{$IFDEF FF_API_NEW_STREAM} (** * Add a new stream to a media file. * @@ -1371,39 +1923,16 @@ procedure av_close_input_file(s: PAVFormatContext); *) function av_new_stream(s: PAVFormatContext; id: cint): PAVStream; cdecl; external av__format; +{$ENDIF} -function av_new_program(s: PAVFormatContext; id: cint): PAVProgram; - cdecl; external av__format; - -(** - * Add a new chapter. - * This function is NOT part of the public API - * and should ONLY be used by demuxers. - * - * @param s media file handle - * @param id unique ID for this chapter - * @param start chapter start time in time_base units - * @param end chapter end time in time_base units - * @param title chapter title - * - * @return AVChapter or NULL on error - *) -function ff_new_chapter(s: PAVFormatContext; id: cint; time_base: TAVRational; - start, end_: cint64; title: {const} PAnsiChar): PAVChapter; - cdecl; external av__format; - +{$IFDEF FF_API_SET_PTS_INFO} (** - * Set the pts for a given stream. - * - * @param s stream - * @param pts_wrap_bits number of bits effectively used by the pts - * (used for wrap control, 33 is the value for MPEG) - * @param pts_num numerator to convert to seconds (MPEG: 1) - * @param pts_den denominator to convert to seconds (MPEG: 90000) + * @deprecated this function is not supposed to be called outside of lavf *) procedure av_set_pts_info(s: PAVStream; pts_wrap_bits: cint; pts_num: cuint; pts_den: cuint); cdecl; external av__format; +{$ENDIF} const AVSEEK_FLAG_BACKWARD = 1; ///< seek backward @@ -1411,114 +1940,55 @@ const AVSEEK_FLAG_ANY = 4; ///< seek to any frame, even non-keyframes AVSEEK_FLAG_FRAME = 8; -function av_find_default_stream_index(s: PAVFormatContext): cint; - cdecl; external av__format; - -(** - * Get the index for a specific timestamp. - * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond - * to the timestamp which is <= the requested one, if backward - * is 0, then it will be >= - * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise - * @return < 0 if no such timestamp could be found - *) -function av_index_search_timestamp(st: PAVStream; timestamp: cint64; flags: cint): cint; - cdecl; external av__format; - -(** - * Ensure the index uses less memory than the maximum specified in - * AVFormatContext.max_index_size by discarding entries if it grows - * too large. - * This function is not part of the public API and should only be called - * by demuxers. - *) -procedure ff_reduce_index(s: PAVFormatContext; stream_index: cint); - cdecl; external av__format; - -(** - * Add an index entry into a sorted list. Update the entry if the list - * already contains it. - * - * @param timestamp timestamp in the timebase of the given stream - *) -function av_add_index_entry(st: PAVStream; pos: cint64; timestamp: cint64; - size: cint; distance: cint; flags: cint): cint; - cdecl; external av__format; - -(** - * Perform a binary search using av_index_search_timestamp() and - * AVInputFormat.read_timestamp(). - * This is not supposed to be called directly by a user application, - * but by demuxers. - * @param target_ts target timestamp in the time base of the given stream - * @param stream_index stream number - *) +{$IFDEF FF_API_SEEK_PUBLIC} function av_seek_frame_binary(s: PAVFormatContext; stream_index: cint; - target_ts: cint64; flags: cint): cint; + target_ts: cint64; flags: cint): cint; {deprecated} cdecl; external av__format; - -(** - * Update cur_dts of all streams based on the given timestamp and AVStream. - * - * Stream ref_st unchanged, others set cur_dts in their native time base. - * Only needed for timestamp wrapping or if (dts not set and pts!=dts). - * @param timestamp new dts expressed in time_base of param ref_st - * @param ref_st reference stream giving time_base of param timestamp - *) procedure av_update_cur_dts(s: PAVFormatContext; ref_st: PAVStream; - timestamp: cint64); + timestamp: cint64); {deprecated} cdecl; external av__format; type TReadTimestampFunc = function (pavfc: PAVFormatContext; arg2: cint; arg3: Pint64; arg4: cint64): cint64; cdecl; -(** - * Perform a binary search using read_timestamp(). - * This is not supposed to be called directly by a user application, - * but by demuxers. - * @param target_ts target timestamp in the time base of the given stream - * @param stream_index stream number - *) function av_gen_search(s: PAVFormatContext; stream_index: cint; target_ts: cint64; pos_min: cint64; pos_max: cint64; pos_limit: cint64; ts_min: cint64; ts_max: cint64; flags: cint; ts_ret: Pint64; - read_timestamp: TReadTimestampFunc): cint64; + read_timestamp: TReadTimestampFunc): cint64; {deprecated} cdecl; external av__format; +{$ENDIF} +{$IFDEF FF_API_FORMAT_PARAMETERS} (** * media file output *) function av_set_parameters(s: PAVFormatContext; ap: PAVFormatParameters): cint; cdecl; external av__format; - +{$ENDIF} + (** - * Split a URL string into components. + * @addtogroup lavf_encoding + * @{ + *) +(** + * Allocate the stream private data and write the stream header to + * an output media file. * - * The pointers to buffers for storing individual components may be null, - * in order to ignore that component. Buffers for components not found are - * set to empty strings. If the port is not found, it is set to a negative - * value. + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already openened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. * - * @param proto the buffer for the protocol - * @param proto_size the size of the proto buffer - * @param authorization the buffer for the authorization - * @param authorization_size the size of the authorization buffer - * @param hostname the buffer for the host name - * @param hostname_size the size of the hostname buffer - * @param port_ptr a pointer to store the port number in - * @param path the buffer for the path - * @param path_size the size of the path buffer - * @param url the URL to split + * @return 0 on success, negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next. *) -procedure av_url_split(proto: PAnsiChar; proto_size: cint; - authorization: PAnsiChar; authorization_size: cint; - hostname: PAnsiChar; hostname_size: cint; - port_ptr: Pcint; - path: PAnsiChar; path_size: cint; - {const} url: PAnsiChar); +function avformat_write_header(s: PAVFormatContext; options: {PPAVDictionary} pointer): cint; cdecl; external av__format; (** @@ -1528,23 +1998,21 @@ procedure av_url_split(proto: PAnsiChar; proto_size: cint; * @param s media file handle * @return 0 if OK, AVERROR_xxx on error *) -function av_write_header(s: PAVFormatContext): cint; - cdecl; external av__format; - +{$IFDEF FF_API_FORMAT_PARAMETERS} (** - * Write a packet to an output media file. - * - * The packet shall contain one audio or video frame. - * The packet must be correctly interleaved according to the container - * specification, if not then av_interleaved_write_frame must be used. + * Allocate the stream private data and write the stream header to an + * output media file. + * @note: this sets stream time-bases, if possible to stream->codec->time_base + * but for some formats it might also be some other time base * * @param s media file handle - * @param pkt The packet, which contains the stream_index, buf/buf_size, - * dts/pts, ... - * @return < 0 on error, = 0 if OK, 1 if end of stream wanted + * @return 0 if OK, AVERROR_xxx on error + * + * @deprecated use avformat_write_header. *) -function av_write_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; +function av_write_header(s: PAVFormatContext): cint; {deprecated} cdecl; external av__format; +{$ENDIF} (** * Write a packet to an output media file ensuring correct interleaving. @@ -1557,9 +2025,18 @@ function av_write_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; * demuxer level. * * @param s media file handle - * @param pkt The packet, which contains the stream_index, buf/buf_size, - * dts/pts, ... - * @return < 0 on error, = 0 if OK, 1 if end of stream wanted + * @param pkt The packet containing the data to be written. Libavformat takes + * ownership of the data and will free it when it sees fit using the packet's + * @ref AVPacket.destruct "destruct" field. The caller must not access the data + * after this function returns, as it may already be freed. + * Packet's @ref AVPacket.stream_index "stream_index" field must be set to the + * index of the corresponding stream in @ref AVFormatContext.streams + * "s.streams". + * It is very strongly recommended that timing information (@ref AVPacket.pts + * "pts", @ref AVPacket.dts "dts" @ref AVPacket.duration "duration") is set to + * correct values. + * + * @return 0 on success, a negative AVERROR on error. *) function av_interleaved_write_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; cdecl; external av__format; @@ -1583,22 +2060,6 @@ function av_interleave_packet_per_dts(s: PAVFormatContext; _out: PAVPacket; pkt: PAVPacket; flush: cint): cint; cdecl; external av__format; -(** - * Add packet to AVFormatContext->packet_buffer list, determining its - * interleaved position using compare() function argument. - * - * This function is not part of the public API and should only be called - * by muxers using their own interleave function. - *) -{ -procedure ff_interleave_add_packet(s: PAVFormatContext; - pkt: PAVPacket; - compare: function(para1: PAVFormatContext; - para2: PAVPacket; - para3: PAVPacket): cint); - cdecl; external av__format; -} - (** * Write the stream trailer to an output media file and free the * file private data. @@ -1611,83 +2072,227 @@ procedure ff_interleave_add_packet(s: PAVFormatContext; function av_write_trailer(s: pAVFormatContext): cint; cdecl; external av__format; -procedure dump_format(ic: PAVFormatContext; index: cint; url: PAnsiChar; - is_output: cint); +(** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + *) +function av_guess_format(short_name: PAnsiChar; + filename: PAnsiChar; + mime_type: PAnsiChar): PAVOutputFormat; cdecl; external av__format; (** - * Parse width and height out of string str. - * @deprecated Use av_parse_video_frame_size instead. + * Guess the codec ID based upon muxer and filename. *) -function parse_image_size(width_ptr: PCint; height_ptr: PCint; - str: PAnsiChar): cint; - cdecl; external av__format; deprecated; +function av_guess_codec(fmt: PAVOutputFormat; short_name: PAnsiChar; + filename: PAnsiChar; mime_type: PAnsiChar; + type_: TCodecType): TCodecID; + cdecl; external av__format; (** - * Convert framerate from a string to a fraction. - * @deprecated Use av_parse_video_frame_rate instead. + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param dts[out] DTS of the last packet output for the stream, in stream + * time_base units + * @param wall[out] absolute time when that packet whas output, + * in microsecond + * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it + * Note: some formats or devices may not allow to measure dts and wall + * atomically. *) -function parse_frame_rate(frame_rate: PCint; frame_rate_base: PCint; - arg: PByteArray): cint; - cdecl; external av__format; deprecated; +function av_get_output_timestamp(s: PAVFormatContext; stream: cint; + dts: Pcint64; wall: Pcint64): cint; + cdecl; external av__format; + (** - * Parse datestr and return a corresponding number of microseconds. - * @param datestr String representing a date or a duration. - * - If a date the syntax is: - * @code - * now|{[{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z|z]} - * @endcode - * If the value is "now" it takes the current time. - * Time is localtime unless Z is appended, in which case it is - * interpreted as UTC. - * If the year-month-day part is not specified it takes the current - * year-month-day. - * Returns the number of microseconds since 1st of January, 1970 up to - * the time of the parsed date or INT64_MIN if datestr cannot be - * successfully parsed. - * - If a duration the syntax is: - * @code - * [-]HH[:MM[:SS[.m...]]] - * [-]S+[.m...] - * @endcode - * @return the number of microseconds contained in a time interval - * with the specified duration or INT64_MIN if datestr cannot be - * successfully parsed. - * @param duration Flag which tells how to interpret datestr, if - * not zero datestr is interpreted as a duration, otherwise as a - * date. + * @} *) -function parse_date(datestr: PAnsiChar; duration: cint): cint64; + + +(** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscelaneous utility functions related to both muxing and demuxing + * (or neither). + *) + +(** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + *) +procedure av_hex_dump(f: PAVFile; buf: PByteArray; size: cint); {<-?FILE} cdecl; external av__format; (** - * Get the current time in microseconds. + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump, av_pkt_dump_log *) -function av_gettime(): cint64; +procedure av_hex_dump_log(avcl: Pointer; level: cint; buf: PByteArray; size: cint); cdecl; external av__format; -(* ffm-specific for ffserver *) -const - FFM_PACKET_SIZE = 4096; +(** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + *) +procedure av_pkt_dump2(f: PAVFile; pkt: PAVPacket; dump_payload: cint; st: PAVStream); + cdecl; external av__format; + +(** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + *) +procedure av_pkt_dump_log2(avcl: pointer; level: cint; pkt: PAVPacket; dump_payload: cint; + st: PAVStream); + cdecl; external av__format; + +(** + * Get the CodecID for the given codec tag tag. + * If no codec id is found returns CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + *) +function av_codec_get_id(var tags: PAVCodecTag; tag: cuint): TCodecID; + cdecl; external av__format; + +(** + * Getsthe codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + *) +function av_codec_get_tag(var tags: PAVCodecTag; id: TCodecID): cuint; + cdecl; external av__format; + +function av_find_default_stream_index(s: PAVFormatContext): cint; + cdecl; external av__format; -function ffm_read_write_index(fd: cint): cint64; +(** + * Get the index for a specific timestamp. + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + *) +function av_index_search_timestamp(st: PAVStream; timestamp: cint64; flags: cint): cint; + cdecl; external av__format; + +(** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the timebase of the given stream + *) +function av_add_index_entry(st: PAVStream; pos: cint64; timestamp: cint64; + size: cint; distance: cint; flags: cint): cint; + cdecl; external av__format; + +(** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + *) +procedure av_url_split(proto: PAnsiChar; proto_size: cint; + authorization: PAnsiChar; authorization_size: cint; + hostname: PAnsiChar; hostname_size: cint; + port_ptr: Pcint; + path: PAnsiChar; path_size: cint; + {const} url: PAnsiChar); cdecl; external av__format; -function ffm_write_write_index(fd: cint; pos: cint64): cint; +{$IFDEF FF_API_DUMP_FORMAT} +(** + * @deprecated Deprecated in favor of av_dump_format(). + *) +procedure dump_format(ic: PAVFormatContext; index: cint; url: PAnsiChar; + is_output: cint); cdecl; external av__format; +{$ENDIF} -procedure ffm_set_write_index(s: PAVFormatContext; pos: cint64; file_size: cint64); +procedure av_dump_format(ic: PAVFormatContext; index: cint; url: PAnsiChar; + is_output: cint); cdecl; external av__format; +{$IFDEF FF_API_PARSE_DATE} (** - * Attempt to find a specific tag in a URL. + * Parse datestr and return a corresponding number of microseconds. * - * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. - * Return 1 if found. + * @param datestr String representing a date or a duration. + * See av_parse_time() for the syntax of the provided string. + * @deprecated in favor of av_parse_time() + *) +function parse_date(datestr: PAnsiChar; duration: cint): cint64; {deprecated} + cdecl; external av__format; +{$ENDIF} + +(** + * Get the current time in microseconds. + *) +function av_gettime(): cint64; + cdecl; external av__format; + +{$IFDEF FF_API_FIND_INFO_TAG} +(** + * @deprecated use av_find_info_tag in libavutil instead. *) function find_info_tag(arg: PAnsiChar; arg_size: cint; tag1: PAnsiChar; info: PAnsiChar): cint; cdecl; external av__format; +{$ENDIF} (** * Return in 'buf' the path with '%d' replaced by a number. @@ -1723,13 +2328,18 @@ function av_filename_number_test(filename: PAnsiChar): cint; * all the contexts in the array (an AVCodecContext per RTP stream) * must contain only one AVStream. * @param n_files number of AVCodecContexts contained in ac - * @param buff buffer where the SDP will be stored (must be allocated by - * the caller) + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) * @param size the size of the buffer * @return 0 if OK, AVERROR_xxx on error *) +function av_sdp_create(ac: pointer; n_files: cint; buf: PAnsiChar; size: cint): cint; + cdecl; external av__format; + +{$IFDEF FF_API_SDP_CREATE} function avf_sdp_create(ac: PPAVFormatContext; n_files: cint; buff: PByteArray; size: cint): cint; cdecl; external av__format; +{$ENDIF} (** * Return a positive value if the given filename has one of the given @@ -1740,6 +2350,47 @@ function avf_sdp_create(ac: PPAVFormatContext; n_files: cint; buff: PByteArray; function av_match_ext(filename: {const} Pchar; extensions: {const} Pchar): cint; cdecl; external av__format; +(** + * Test if the given container can store a codec. + * + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + *) +function avformat_query_codec(ofmt: PAVOutputFormat; codec_id: TCodecID; std_compliance: cint): cint; + cdecl; external av__format; + +(** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec CodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum CodecID id = av_codec_get_id(table, tag); + * @endcode + *) +(** + * @return the table mapping RIFF FourCCs for video to libavcodec CodecID. + *) +function avformat_get_riff_video_tags(): {const} PAVCodecTag; + cdecl; external av__format; +(** + * @return the table mapping RIFF FourCCs for audio to CodecID. + *) +function avformat_get_riff_audio_tags(): {const} PAVCodecTag; + cdecl; external av__format; +(** + * @} + *) + +(** + * @} + *) + implementation end. diff --git a/src/lib/ffmpeg-0.10/avio.pas b/src/lib/ffmpeg-0.10/avio.pas index 426f5f75..30d82f82 100644 --- a/src/lib/ffmpeg-0.10/avio.pas +++ b/src/lib/ffmpeg-0.10/avio.pas @@ -96,8 +96,26 @@ const type TReadWriteFunc = function(opaque: Pointer; buf: PByteArray; buf_size: cint): cint; cdecl; TSeekFunc = function(opaque: Pointer; offset: cint64; whence: cint): cint64; cdecl; + Tcallback = function(p: pointer): cint; cdecl; type +(** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + *) + PAVIOInterruptCB = ^TAVIOInterruptCB; + TAVIOInterruptCB = record + callback: Tcallback; + opaque: pointer; + end; (*TAVIOInterruptCB*) + (** * Bytestream IO Context. * New fields can be added to the end with minor version bumps. @@ -112,6 +130,21 @@ type *) PAVIOContext = ^TAVIOContext; TAVIOContext = record +{$IFNDEF FF_API_OLD_AVIO} + (** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + *) + av_class: PAVClass; +{$ENDIF} buffer: PByteArray; (**< Start of the buffer. *) buffer_size: cint; (**< Maximum buffer size *) buf_ptr: PByteArray; (**< Current position in the buffer *) @@ -151,6 +184,12 @@ type * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. *) seekable: cint; + + (** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + *) + maxsize: cint64; end; (* unbuffered I/O *) @@ -169,9 +208,7 @@ type PPURLContext = ^PURLContext; PURLContext = ^TURLContext; TURLContext = record -{$IF FF_API_URL_CLASS} av_class: {const} PAVClass; ///< information for av_log(). Set by url_open(). -{$ENDIF} prot: PURLProtocol; flags: cint; is_streamed: cint; (**< true if streamed (no seek possible), default = false *) @@ -179,6 +216,7 @@ type priv_data: pointer; filename: PAnsiChar; (**< specified URL *) is_connected: cint; + interrupt_callback: TAVIOInterruptCB; end; (** @@ -216,14 +254,14 @@ function url_poll(poll_table: PURLPollEntry; n: cint; timeout: cint): cint; const (** - * @defgroup open_modes URL open modes + * @name URL open modes * The flags argument to url_open and cosins must be one of the following * constants, optionally ORed with other flags. - * @ + * @{ *) - URL_RDONLY = 0; (**< read-only *) - URL_WRONLY = 1; (**< write-only *) - URL_RDWR = 2; (**< read-write *) + URL_RDONLY = 1; (**< read-only *) + URL_WRONLY = 2; (**< write-only *) + URL_RDWR = {(URL_RDONLY|URL_WRONLY)} 3; (**< read-write *) (** * @ *) @@ -240,7 +278,7 @@ const * Warning: non-blocking protocols is work-in-progress; this flag may be * silently ignored. *) - URL_FLAG_NONBLOCK = 4; + URL_FLAG_NONBLOCK = 8; type PURLInterruptCB = ^TURLInterruptCB; @@ -315,7 +353,8 @@ type function init_put_byte(s: PAVIOContext; buffer: PByteArray; - buffer_size: cint; write_flag: cint; + buffer_size: cint; + write_flag: cint; opaque: pointer; read_packet: TReadWriteFunc; write_packet: TReadWriteFunc; @@ -501,13 +540,11 @@ function url_exist(url: {const} PAnsiChar): cint; * one call to another. Thus you should not trust the returned value, * unless you are sure that no other processes are accessing the * checked resource. - * - * @note This function is slightly broken until next major bump - * because of AVIO_RDONLY == 0. Don't use it until then. *) function avio_check(url: {const} PAnsiChar; flags: cint): cint; cdecl; external av__format; +{$IFDEF FF_API_OLD_INTERRUPT_CB} (** * The callback is called in blocking functions to test regulary if * asynchronous interruption is needed. AVERROR_EXIT is returned @@ -516,28 +553,8 @@ function avio_check(url: {const} PAnsiChar; flags: cint): cint; *) procedure avio_set_interrupt_cb(interrupt_cb: Pointer); cdecl; external av__format; - -{$IF FF_API_REGISTER_PROTOCOL} -{ -var - first_protocol: PURLProtocol; cvar; external av__format; -} {$IFEND} -{$IF FF_API_REGISTER_PROTOCOL} -(** - * @deprecated Use av_register_protocol() instead. - *) -function register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format; deprecated; - -(** - * @deprecated Use av_register_protocol2() instead. - *) -function av_register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format; deprecated; -{$ENDIF} - (** * Allocate and initialize an AVIOContext for buffered I/O. It must be later * freed with av_free(). @@ -728,32 +745,16 @@ function avio_get_str16le(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen function avio_get_str16be(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint; cdecl; external av__format; -{$IF FF_API_URL_RESETBUF} -(** Reset the buffer for reading or writing. - * @note Will drop any data currently in the buffer without transmitting it. - * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY - * to set up the buffer for writing. *) -function url_resetbuf(s: PAVIOContext; flags: cint): cint; - cdecl; external av__format; -{$ENDIF} - (** - * @defgroup open_modes URL open modes + * @name URL open modes * The flags argument to avio_open must be one of the following * constants, optionally ORed with other flags. - * @ + * @{ *) - const -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} - AVIO_RDONLY = 0; (**< read-only *) - AVIO_WRONLY = 1; (**< write-only *) - AVIO_RDWR = 2; (**< read-write *) -{$ELSE} - AVIO_RDONLY = 1; (**< read-only *) - AVIO_WRONLY = 2; (**< write-only *) - AVIO_RDWR = 4; (**< read-write *) -{$ENDIF} + AVIO_FLAG_READ = 1; (**< read-only *) + AVIO_FLAG_WRITE = 2; (**< write-only *) + AVIO_FLAG_READ_WRITE = {(AVIO_FLAG_READ|AVIO_FLAG_WRITE)} 3; (**< read-write pseudo flag *) (** * @ *) @@ -771,11 +772,7 @@ const * silently ignored. *) const -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} - AVIO_FLAG_NONBLOCK = 4; -{$ELSE} AVIO_FLAG_NONBLOCK = 8; -{$ENDIF} (** * Create and initialize a AVIOContext for accessing the @@ -793,6 +790,27 @@ const function avio_open(var s: PAVIOContext; url: {const} PAnsiChar; flags: cint): cint; cdecl; external av__format; +(** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + *) +function avio_open2(s: {PPAVIOContext} pointer; {const} url: PAnsiChar; flags: cint; + {const} int_cb: PAVIOInterruptCB; options: {PPAVDictionary} pointer): cint; + cdecl; external av__format; + (** * Close the resource accessed by the AVIOContext s and free it. * This function can only be used if s was opened by avio_open(). @@ -823,11 +841,6 @@ function avio_open_dyn_buf(var s: PAVIOContext): cint; function avio_close_dyn_buf(s: PAVIOContext; var pbuffer: Pcuint8): cint; cdecl; external av__format; -{$IF FF_API_UDP_GET_FILE} -function udp_get_file_handle(h: PURLContext): cint; - cdecl; external av__format; -{$ENDIF} - (** * Iterate through names of available protocols. * @note it is recommanded to use av_protocol_next() instead of this diff --git a/src/lib/ffmpeg-0.10/avutil.pas b/src/lib/ffmpeg-0.10/avutil.pas index f50bef6e..0d9235e0 100644 --- a/src/lib/ffmpeg-0.10/avutil.pas +++ b/src/lib/ffmpeg-0.10/avutil.pas @@ -71,11 +71,11 @@ const (* Check if linked versions are supported *) {$IF (LIBAVUTIL_VERSION < LIBAVUTIL_MIN_VERSION)} - {$MESSAGE Error 'Linked version of libavutil is too old!'} +// {$MESSAGE Error 'Linked version of libavutil is too old!'} {$IFEND} {$IF (LIBAVUTIL_VERSION > LIBAVUTIL_MAX_VERSION)} - {$MESSAGE Error 'Linked version of libavutil is not yet supported!'} +// {$MESSAGE Error 'Linked version of libavutil is not yet supported!'} {$IFEND} (** @@ -116,7 +116,7 @@ type * Return a string describing the media_type enum, NULL if media_type * is unknown. *) -function av_get_media_type_string(media_type: PAVMediaType): Pchar; +function av_get_media_type_string(media_type: TAVMediaType): Pchar; cdecl; external av__util; const @@ -184,6 +184,7 @@ function av_get_picture_type_char(pict_type: TAVPictureType): Pchar; * Return x default pointer in case p is NULL. *) function av_x_if_null(p: {const} pointer; x: {const} pointer): pointer; + cdecl; external av__util; {$INCLUDE libavutil/cpu.pas} @@ -208,298 +209,17 @@ function av_x_if_null(p: {const} pointer; x: {const} pointer): pointer; function MKTAG (a, b, c, d: AnsiChar): integer; function MKBETAG(a, b, c, d: AnsiChar): integer; -(* libavutil/mem.h *) - -(* memory handling functions *) - -(** - * Allocate a block of size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU). - * @param size Size in bytes for the memory block to be allocated. - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. - * @see av_mallocz() - *) -function av_malloc(size: size_t): pointer; - cdecl; external av__util; {av_malloc_attrib av_alloc_size(1)} - -(** - * Allocate or reallocate a block of memory. - * If ptr is NULL and size > 0, allocate a new block. If - * size is zero, free the memory block pointed to by ptr. - * @param size Size in bytes for the memory block to be allocated or - * reallocated. - * @param ptr Pointer to a memory block already allocated with - * av_malloc(z)() or av_realloc() or NULL. - * @return Pointer to a newly reallocated block or NULL if the block - * cannot be allocated or the function is used to free the memory block. - * @see av_fast_realloc() - *) -function av_realloc(ptr: pointer; size: size_t): pointer; - cdecl; external av__util; {av_alloc_size(2)} - -(** - * Allocate or reallocate a block of memory. - * This function does the same thing as av_realloc, except: - * - It takes two arguments and checks the result of the multiplication for - * integer overflow. - * - It frees the input block in case of failure, thus avoiding the memory - * leak with the classic "buf = realloc(buf); if (!buf) return -1;". - *) -function av_realloc_f(ptr: pointer; nelem: size_t; elsize: size_t): pointer; - cdecl; external av__util; - -(** - * Free a memory block which has been allocated with av_malloc(z)() or - * av_realloc(). - * @param ptr Pointer to the memory block which should be freed. - * @note ptr = NULL is explicitly allowed. - * @note It is recommended that you use av_freep() instead. - * @see av_freep() - *) -procedure av_free(ptr: pointer); - cdecl; external av__util; - -(** - * Allocate a block of size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zeroes all the bytes of the block. - * @param size Size in bytes for the memory block to be allocated. - * @return Pointer to the allocated block, NULL if it cannot be allocated. - * @see av_malloc() - *) -function av_mallocz(size: size_t): pointer; - cdecl; external av__util; {av_malloc_attrib av_alloc_size(1)} - -(** - * Allocate a block of nmemb * size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zero all the bytes of the block. - * The allocation will fail if nmemb * size is greater than or equal - * to INT_MAX. - * @param nmemb - * @param size - * @return Pointer to the allocated block, NULL if it cannot be allocated. - *) -function av_calloc(nmemb: size_t; size: size_t): pointer; - cdecl; external av__util; {av_malloc_attrib} - -(** - * Duplicate the string s. - * @param s string to be duplicated. - * @return Pointer to a newly allocated string containing a - * copy of s or NULL if the string cannot be allocated. - *) -function av_strdup({const} s: PAnsiChar): PAnsiChar; - cdecl; external av__util; {av_malloc_attrib} - -(** - * Free a memory block which has been allocated with av_malloc(z)() or - * av_realloc() and set the pointer pointing to it to NULL. - * @param ptr Pointer to the pointer to the memory block which should - * be freed. - * @see av_free() - *) -procedure av_freep (ptr: pointer); - cdecl; external av__util; - -(** - * Add an element to a dynamic array. - * - * @param tab_ptr Pointer to the array. - * @param nb_ptr Pointer to the number of elements in the array. - * @param elem Element to be added. - *) -procedure av_dynarray_add(tab_ptr: pointer; nb_ptr: PCint; elem: pointer); - cdecl; external av__util; - -(** - * Multiply two size_t values checking for overflow. - * @return 0 if success, AVERROR(EINVAL) if overflow. - *) -function av_size_mult(a: size_t; b: size_t; r: ^size_t): cint; - -(* libavutil/log.h *) - -type -(** - * Describe the class of an AVClass context structure. That is an - * arbitrary struct of which the first field is a pointer to an - * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). - *) - PAVClass = ^TAVClass; - TAVClass = record - (** - * The name of the class; usually it is the same name as the - * context structure type to which the AVClass is associated. - *) - class_name: PAnsiChar; - - (** - * A pointer to a function which returns the name of a context - * instance ctx associated with the class. - *) - item_name: function(): PAnsiChar; cdecl; - - (** - * a pointer to the first option specified in the class if any or NULL - * - * @see av_set_default_options() - *) - option: PAVOption; - - (** - * LIBAVUTIL_VERSION with which this structure was created. - * This is used to allow fields to be added without requiring major - * version bumps everywhere. - *) - version: cint; - - (** - * Offset in the structure where log_level_offset is stored. - * 0 means there is no such variable - *) - log_level_offset_offset: cint; - - (** - * Offset in the structure where a pointer to the parent context for loging is stored. - * for example a decoder that uses eval.c could pass its AVCodecContext to eval as such - * parent context. And a av_log() implementation could then display the parent context - * can be NULL of course - *) - parent_log_context_offset: cint; - - (** - * Return next AVOptions-enabled child or NULL - *) - child_next: function(obj: pointer; prev: pointer): Pointer; cdecl; - - (** - * Return an AVClass corresponding to next potential - * AVOptions-enabled child. - * - * The difference between child_next and this is that - * child_next iterates over _already existing_ objects, while - * child_class_next iterates over _all possible_ children. - *) - child_class_next: function(prev: PAVClass): PAVClass; cdecl; - end; - -const - AV_LOG_QUIET = -8; - -(** - * Something went really wrong and we will crash now. - *) - AV_LOG_PANIC = 0; - -(** - * Something went wrong and recovery is not possible. - * For example, no header was found for a format which depends - * on headers or an illegal combination of parameters is used. - *) - AV_LOG_FATAL = 8; - -(** - * Something went wrong and cannot losslessly be recovered. - * However, not all future data is affected. - *) - AV_LOG_ERROR = 16; - -(** - * Something somehow does not look correct. This may or may not - * lead to problems. An example would be the use of '-vstrict -2'. - *) - AV_LOG_WARNING = 24; - - AV_LOG_INFO = 32; - AV_LOG_VERBOSE = 40; - -(** - * Stuff which is only useful for libav* developers. - *) - AV_LOG_DEBUG = 48; - -(** - * Send the specified message to the log if the level is less than or equal - * to the current av_log_level. By default, all logging messages are sent to - * stderr. This behavior can be altered by setting a different av_vlog callback - * function. - * - * @param avcl A pointer to an arbitrary struct of which the first field is a - * pointer to an AVClass struct. - * @param level The importance level of the message, lower values signifying - * higher importance. - * @param fmt The format string (printf-compatible) that specifies how - * subsequent arguments are converted to output. - * @see av_vlog - *) - -{** to be translated if needed -void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); -**} - -type - va_list = pointer; - -procedure av_vlog(avcl: pointer; level: cint; fmt: {const} PAnsiChar; dummy: va_list); - cdecl; external av__util; -function av_log_get_level(): cint; - cdecl; external av__util; -procedure av_log_set_level(level: cint); - cdecl; external av__util; - -{** to be translated if needed -void av_log_set_callback(void (*)(void*, int, const char*, va_list)); -void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl); -**} - -function av_default_item_name (ctx: pointer): PAnsiChar; - cdecl; external av__util; - -(** - * Format a line of log the same way as the default callback. - * @param line buffer to receive the formated line - * @param line_size size of the buffer - * @param print_prefix used to store whether the prefix must be printed; - * must point to a persistent integer initially set to 1 - *) -procedure av_log_format_line(ptr: pointer; level: cint; fmt: {const} Pchar; vl: va_list; - line: Pchar; line_size: cint; print_prefix: Pcint); - cdecl; external av__util; - -(** - * av_dlog macros - * Useful to print debug messages that shouldn't get compiled in normally. - *) -(** to be translated if needed -#ifdef DEBUG -# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) -#else -# define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) -#endif -**) - -(** - * Skip repeated messages, this requires the user app to use av_log() instead of - * (f)printf as the 2 would otherwise interfere and lead to - * "Last message repeated x times" messages below (f)printf messages with some - * bad luck. - * Also to receive the last, "last repeated" line if any, the user app must - * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end - *) -const - AV_LOG_SKIP_REPEATED = 1; -procedure av_log_set_flags(arg: cint); - cdecl; external av__util; - implementation (* To Be Implemented, March 2012 KMS *) -function av_x_if_null(p: {const} pointer; x: {const} pointer): pointer; -begin - //return (void *)(intptr_t)(p ? p : x); -end; +//function av_x_if_null(p: {const} pointer; x: {const} pointer): pointer; +//begin +// If p = Nil Then +// Result := p +// Else +// Result := x; +// //return (void *)(intptr_t)(p ? p : x); +//end; (* libavutil/common.h *) @@ -513,18 +233,23 @@ begin Result := (ord(d) or (ord(c) shl 8) or (ord(b) shl 16) or (ord(a) shl 24)); end; +type + Psize_t = ^size_t; + +function av_size_mult(a: size_t; b: size_t; r: Psize_t): size_t; + cdecl; external av__util; (* To Be Implemented, March 2012 KMS *) -function av_size_mult(a: size_t; b: size_t; r: ^size_t): cint; -begin - { - size_t t = a * b; - /* Hack inspired from glibc: only try the division if nelem and elsize - * are both greater than sqrt(SIZE_MAX). */ - if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) - return AVERROR(EINVAL); - *r = t; - return 0; -} -end; +//function av_size_mult(a: size_t; b: size_t; r: pointer): size_t; +//begin +// { +// size_t t = a * b; +// /* Hack inspired from glibc: only try the division if nelem and elsize +// * are both greater than sqrt(SIZE_MAX). */ +// if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) +// return AVERROR(EINVAL); +// *r = t; +// return 0; +//} +//end; end. diff --git a/src/lib/ffmpeg-0.10/libavutil/dict.pas b/src/lib/ffmpeg-0.10/libavutil/dict.pas index e2626e50..472168f1 100644 --- a/src/lib/ffmpeg-0.10/libavutil/dict.pas +++ b/src/lib/ffmpeg-0.10/libavutil/dict.pas @@ -27,13 +27,11 @@ const AV_DICT_MATCH_CASE = 1; AV_DICT_IGNORE_SUFFIX = 2; AV_DICT_DONT_STRDUP_KEY = 4; (**< Take ownership of a key that's been - allocated with av_malloc() and children. */ + allocated with av_malloc() and children. *) AV_DICT_DONT_STRDUP_VAL = 8; (**< Take ownership of a value that's been - allocated with av_malloc() and chilren. */ - AV_DICT_DONT_OVERWRITE = 16; ///< Don't overwrite existing entries. - AV_DICT_APPEND = 32; (**< If the entry already exists, append to it. Note that no - delimiter is added, the strings are simply concatenated. *) + allocated with av_malloc() and chilren. *) + AV_DICT_DONT_OVERWRITE = 16; (**< Don't overwrite existing entries. *) type PAVDictionaryEntry = ^TAVDictionaryEntry; diff --git a/src/lib/ffmpeg-0.10/libavutil/mem.pas b/src/lib/ffmpeg-0.10/libavutil/mem.pas index d71dd3d3..d163d9df 100644 --- a/src/lib/ffmpeg-0.10/libavutil/mem.pas +++ b/src/lib/ffmpeg-0.10/libavutil/mem.pas @@ -38,22 +38,22 @@ * be allocated. * @see av_mallocz() *) -function av_malloc(size: FF_INTERNAL_MEM_TYPE): pointer; +function av_malloc(size: size_t): pointer; cdecl; external av__util; {av_malloc_attrib av_alloc_size(1)} (** * Allocate or reallocate a block of memory. * If ptr is NULL and size > 0, allocate a new block. If * size is zero, free the memory block pointed to by ptr. - * @param size Size in bytes for the memory block to be allocated or - * reallocated. * @param ptr Pointer to a memory block already allocated with * av_malloc(z)() or av_realloc() or NULL. + * @param size Size in bytes for the memory block to be allocated or + * reallocated. * @return Pointer to a newly reallocated block or NULL if the block * cannot be allocated or the function is used to free the memory block. * @see av_fast_realloc() *) -function av_realloc(ptr: pointer; size: FF_INTERNAL_MEM_TYPE): pointer; +function av_realloc(ptr: pointer; size: size_t): pointer; cdecl; external av__util; {av_alloc_size(2)} (** @@ -64,10 +64,8 @@ function av_realloc(ptr: pointer; size: FF_INTERNAL_MEM_TYPE): pointer; * - It frees the input block in case of failure, thus avoiding the memory * leak with the classic "buf = realloc(buf); if (!buf) return -1;". *) -{ available only in 0.8.5 - 0.8.10 function av_realloc_f(ptr: pointer; nelem: size_t; size: size_t): pointer; cdecl; external av__util; -} (** * Free a memory block which has been allocated with av_malloc(z)() or @@ -88,7 +86,7 @@ procedure av_free(ptr: pointer); * @return Pointer to the allocated block, NULL if it cannot be allocated. * @see av_malloc() *) -function av_mallocz(size: FF_INTERNAL_MEM_TYPE): pointer; +function av_mallocz(size: size_t): pointer; cdecl; external av__util; {av_malloc_attrib av_alloc_size(1)} (** @@ -101,10 +99,8 @@ function av_mallocz(size: FF_INTERNAL_MEM_TYPE): pointer; * @param size * @return Pointer to the allocated block, NULL if it cannot be allocated. *) -(* available only in 0.8.5 - 0.8.10 function av_calloc(nmemb: size_t; size: size_t): pointer; cdecl; external av__util; {av_malloc_attrib} -*) (** * Duplicate the string s. diff --git a/src/lib/ffmpeg-0.10/libavutil/opt.pas b/src/lib/ffmpeg-0.10/libavutil/opt.pas index 61af0754..16bf0f26 100644 --- a/src/lib/ffmpeg-0.10/libavutil/opt.pas +++ b/src/lib/ffmpeg-0.10/libavutil/opt.pas @@ -23,205 +23,12 @@ * - Changes and updates by the UltraStar Deluxe Team * * Conversion of libavutil/opt.h - * avutil version 51.34.101 + * avutil version 51.9.1 * *) -(** - * @defgroup avoptions AVOptions - * @ingroup lavu_data - * @{ - * AVOptions provide a generic system to declare options on arbitrary structs - * ("objects"). An option can have a help text, a type and a range of possible - * values. Options may then be enumerated, read and written to. - * - * @section avoptions_implement Implementing AVOptions - * This section describes how to add AVOptions capabilities to a struct. - * - * All AVOptions-related information is stored in an AVClass. Therefore - * the first member of the struct must be a pointer to an AVClass describing it. - * The option field of the AVClass must be set to a NULL-terminated static array - * of AVOptions. Each AVOption must have a non-empty name, a type, a default - * value and for number-type AVOptions also a range of allowed values. It must - * also declare an offset in bytes from the start of the struct, where the field - * associated with this AVOption is located. Other fields in the AVOption struct - * should also be set when applicable, but are not required. - * - * The following example illustrates an AVOptions-enabled struct: - * @code - * typedef struct test_struct { - * AVClass *class; - * int int_opt; - * char *str_opt; - * uint8_t *bin_opt; - * int bin_len; - * } test_struct; - * - * static const AVOption options[] = { - * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), - * AV_OPT_TYPE_INT, { -1 }, INT_MIN, INT_MAX }, - * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), - * AV_OPT_TYPE_STRING }, - * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), - * AV_OPT_TYPE_BINARY }, - * { NULL }, - * }; - * - * static const AVClass test_class = { - * .class_name = "test class", - * .item_name = av_default_item_name, - * .option = options, - * .version = LIBAVUTIL_VERSION_INT, - * }; - * @endcode - * - * Next, when allocating your struct, you must ensure that the AVClass pointer - * is set to the correct value. Then, av_opt_set_defaults() must be called to - * initialize defaults. After that the struct is ready to be used with the - * AVOptions API. - * - * When cleaning up, you may use the av_opt_free() function to automatically - * free all the allocated string and binary options. - * - * Continuing with the above example: - * - * @code - * test_struct *alloc_test_struct(void) - * { - * test_struct *ret = av_malloc(sizeof(*ret)); - * ret->class = &test_class; - * av_opt_set_defaults(ret); - * return ret; - * } - * void free_test_struct(test_struct **foo) - * { - * av_opt_free(*foo); - * av_freep(foo); - * } - * @endcode - * - * @subsection avoptions_implement_nesting Nesting - * It may happen that an AVOptions-enabled struct contains another - * AVOptions-enabled struct as a member (e.g. AVCodecContext in - * libavcodec exports generic options, while its priv_data field exports - * codec-specific options). In such a case, it is possible to set up the - * parent struct to export a child's options. To do that, simply - * implement AVClass.child_next() and AVClass.child_class_next() in the - * parent struct's AVClass. - * Assuming that the test_struct from above now also contains a - * child_struct field: - * - * @code - * typedef struct child_struct { - * AVClass *class; - * int flags_opt; - * } child_struct; - * static const AVOption child_opts[] = { - * { "test_flags", "This is a test option of flags type.", - * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX }, - * { NULL }, - * }; - * static const AVClass child_class = { - * .class_name = "child class", - * .item_name = av_default_item_name, - * .option = child_opts, - * .version = LIBAVUTIL_VERSION_INT, - * }; - * - * void *child_next(void *obj, void *prev) - * { - * test_struct *t = obj; - * if (!prev && t->child_struct) - * return t->child_struct; - * return NULL - * } - * const AVClass child_class_next(const AVClass *prev) - * { - * return prev ? NULL : &child_class; - * } - * @endcode - * Putting child_next() and child_class_next() as defined above into - * test_class will now make child_struct's options accessible through - * test_struct (again, proper setup as described above needs to be done on - * child_struct right after it is created). - * - * From the above example it might not be clear why both child_next() - * and child_class_next() are needed. The distinction is that child_next() - * iterates over actually existing objects, while child_class_next() - * iterates over all possible child classes. E.g. if an AVCodecContext - * was initialized to use a codec which has private options, then its - * child_next() will return AVCodecContext.priv_data and finish - * iterating. OTOH child_class_next() on AVCodecContext.av_class will - * iterate over all available codecs with private options. - * - * @subsection avoptions_implement_named_constants Named constants - * It is possible to create named constants for options. Simply set the unit - * field of the option the constants should apply to to a string and - * create the constants themselves as options of type AV_OPT_TYPE_CONST - * with their unit field set to the same string. - * Their default_val field should contain the value of the named - * constant. - * For example, to add some named constants for the test_flags option - * above, put the following into the child_opts array: - * @code - * { "test_flags", "This is a test option of flags type.", - * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX, "test_unit" }, - * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { 16 }, 0, 0, "test_unit" }, - * @endcode - * - * @section avoptions_use Using AVOptions - * This section deals with accessing options in an AVOptions-enabled struct. - * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or - * AVFormatContext in libavformat. - * - * @subsection avoptions_use_examine Examining AVOptions - * The basic functions for examining options are av_opt_next(), which iterates - * over all options defined for one object, and av_opt_find(), which searches - * for an option with the given name. - * - * The situation is more complicated with nesting. An AVOptions-enabled struct - * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag - * to av_opt_find() will make the function search children recursively. - * - * For enumerating there are basically two cases. The first is when you want to - * get all options that may potentially exist on the struct and its children - * (e.g. when constructing documentation). In that case you should call - * av_opt_child_class_next() recursively on the parent struct's AVClass. The - * second case is when you have an already initialized struct with all its - * children and you want to get all options that can be actually written or read - * from it. In that case you should call av_opt_child_next() recursively (and - * av_opt_next() on each result). - * - * @subsection avoptions_use_get_set Reading and writing AVOptions - * When setting options, you often have a string read directly from the - * user. In such a case, simply passing it to av_opt_set() is enough. For - * non-string type options, av_opt_set() will parse the string according to the - * option type. - * - * Similarly av_opt_get() will read any option type and convert it to a string - * which will be returned. Do not forget that the string is allocated, so you - * have to free it with av_free(). - * - * In some cases it may be more convenient to put all options into an - * AVDictionary and call av_opt_set_dict() on it. A specific case of this - * are the format/codec open functions in lavf/lavc which take a dictionary - * filled with option as a parameter. This allows to set some options - * that cannot be set otherwise, since e.g. the input file format is not known - * before the file is actually opened. - *) - type TAVOptionType = ( - AV_OPT_TYPE_FLAGS, - AV_OPT_TYPE_INT, - AV_OPT_TYPE_INT64, - AV_OPT_TYPE_DOUBLE, - AV_OPT_TYPE_FLOAT, - AV_OPT_TYPE_STRING, - AV_OPT_TYPE_RATIONAL, - AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length - AV_OPT_TYPE_CONST = 128 -{$IFDEF FF_API_OLD_AVOPTIONS} FF_OPT_TYPE_FLAGS, FF_OPT_TYPE_INT, FF_OPT_TYPE_INT64, @@ -231,7 +38,6 @@ type FF_OPT_TYPE_RATIONAL, FF_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length FF_OPT_TYPE_CONST = 128 -{$ENDIF} ); const @@ -305,7 +111,6 @@ function av_find_opt(obj: Pointer; {const} name: {const} PAnsiChar; {const} unit cdecl; external av__util; deprecated; {$ENDIF} -{$IFDEF FF_API_OLD_AVOPTIONS} (** * Set the field of obj with the given name to value. * @@ -324,33 +129,34 @@ function av_find_opt(obj: Pointer; {const} name: {const} PAnsiChar; {const} unit * similarly, '-' unsets a flag. * @param[out] o_out if non-NULL put here a pointer to the AVOption * found - * @param alloc this parameter is currently ignored + * @param alloc when 1 then the old value will be av_freed() and the + * new av_strduped() + * when 0 then no av_free() nor av_strdup() will be used * @return 0 if the value has been set, or an AVERROR code in case of * error: - * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ENOENT) if no matching option exists * AVERROR(ERANGE) if the value is out of range * AVERROR(EINVAL) if the value is not valid *) function av_set_string3(obj: Pointer; name: {const} PAnsiChar; val: {const} PAnsiChar; alloc: cint; out o_out: {const} PAVOption): cint; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_set_double(obj: pointer; name: {const} PAnsiChar; n: cdouble): PAVOption; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_set_q(obj: pointer; name: {const} PAnsiChar; n: TAVRational): PAVOption; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_set_int(obj: pointer; name: {const} PAnsiChar; n: cint64): PAVOption; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_get_double(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): cdouble; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_get_q(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): TAVRational; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_get_int(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): cint64; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_get_string(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption; buf: PAnsiChar; buf_len: cint): PAnsiChar; - cdecl; external av__util; deprecated; + cdecl; external av__util; function av_next_option(obj: pointer; last: {const} PAVOption): PAVOption; - cdecl; external av__util; deprecated; -{$ENDIF} + cdecl; external av__util; (** * Show the obj options. @@ -364,18 +170,10 @@ function av_next_option(obj: pointer; last: {const} PAVOption): PAVOption; function av_opt_show2(obj: pointer; av_log_obj: pointer; req_flags: cint; rej_flags: cint): cint; cdecl; external av__util; -(** - * Set the values of all AVOption fields to their default values. - * - * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) - *) procedure av_opt_set_defaults(s: pointer); cdecl; external av__util; - -{$IFDEF FF_API_OLD_AVOPTIONS} procedure av_opt_set_defaults2(s: Pointer; mask: cint; flags: cint); - cdecl; external av__util; deprecated; -{$ENDIF} + cdecl; external av__util; (** * Parse the key/value pairs list in opts. For each key/value pair @@ -432,46 +230,9 @@ function av_opt_flag_is_set(obj: pointer; field_name: {const} PAnsiChar; flag_na function av_opt_set_dict(obj: pointer; var options: PAVDictionary): cint; cdecl; external av__util; -(** - * @defgroup opt_eval_funcs Evaluating option strings - * @{ - * This group of functions can be used to evaluate option strings - * and get numbers out of them. They do the same thing as av_opt_set(), - * except the result is written into the caller-supplied pointer. - * - * @param obj a struct whose first element is a pointer to AVClass. - * @param o an option for which the string is to be evaluated. - * @param val string to be evaluated. - * @param *_out value of the string will be written here. - * - * @return 0 on success, a negative number on failure. - *) -function av_opt_eval_flags (obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; flags_out: Pcint): cint; - cdecl; external av__util; -function av_opt_eval_int (obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; int_out: Pcint): cint; - cdecl; external av__util; -function av_opt_eval_int64 (obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; int64_out: Pint64): cint; - cdecl; external av__util; -function av_opt_eval_float (obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; float_out: Pcfloat): cint; - cdecl; external av__util; -function av_opt_eval_double(obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; double_out: Pcdouble): cint; - cdecl; external av__util; -function av_opt_eval_q (obj: pointer; o: {const} PAVOption; {const} val: PAnsiChar; q_out: PAVRational): cint; - cdecl; external av__util; -(** - * @} - *) - const AV_OPT_SEARCH_CHILDREN = 0001; (**< Search in possible children of the given object first.*) -(** - * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass - * instead of a required pointer to a struct containing AVClass. This is - * useful for searching for options without needing to allocate the corresponding - * object. - *) - AV_OPT_SEARCH_FAKE_OBJ = 0002; (** * Look for an option in an object. Consider only options which @@ -494,140 +255,5 @@ const * flag. *) function av_opt_find(obj: pointer; name: {const} PAnsiChar; unit_: {const} PAnsiChar; - opt_flags: cint; search_flags: cint): PAVOption; + opt_flags: cint; search_flags: cint): PAVOption; cdecl; external av__util; - -(** - * Look for an option in an object. Consider only options which - * have all the specified flags set. - * - * @param[in] obj A pointer to a struct whose first element is a - * pointer to an AVClass. - * Alternatively a double pointer to an AVClass, if - * AV_OPT_SEARCH_FAKE_OBJ search flag is set. - * @param[in] name The name of the option to look for. - * @param[in] unit When searching for named constants, name of the unit - * it belongs to. - * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). - * @param search_flags A combination of AV_OPT_SEARCH_*. - * @param[out] target_obj if non-NULL, an object to which the option belongs will be - * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present - * in search_flags. This parameter is ignored if search_flags contain - * AV_OPT_SEARCH_FAKE_OBJ. - * - * @return A pointer to the option found, or NULL if no option - * was found. - *) -function av_opt_find2(obj: pointer; name: {const} PAnsiChar; unit_: {const} PAnsiChar; - opt_flags: cint; search_flags: cint; target_obj: pointer): PAVOption; - cdecl; external av__util; - -(** - * Iterate over all AVOptions belonging to obj. - * - * @param obj an AVOptions-enabled struct or a double pointer to an - * AVClass describing it. - * @param prev result of the previous call to av_opt_next() on this object - * or NULL - * @return next AVOption or NULL - *) -function av_opt_next(obj: pointer; prev: {const} PAVOption): PAVOption; - cdecl; external av__util; - -(** - * Iterate over AVOptions-enabled children of obj. - * - * @param prev result of a previous call to this function or NULL - * @return next AVOptions-enabled child or NULL - *) -procedure av_opt_child_next(obj: pointer; prev: pointer); - cdecl; external av__util; - -(** - * Iterate over potential AVOptions-enabled children of parent. - * - * @param prev result of a previous call to this function or NULL - * @return AVClass corresponding to next potential child or NULL - *) -(* -function av_opt_child_class_next(parent: {const} PAVClass; prev: {const} PAVClass): PAVClass; - cdecl; external av__util; -*) - -(** - * @defgroup opt_set_funcs Option setting functions - * @{ - * Those functions set the field of obj with the given name to value. - * - * @param[in] obj A struct whose first element is a pointer to an AVClass. - * @param[in] name the name of the field to set - * @param[in] val The value to set. In case of av_opt_set() if the field is not - * of a string type, then the given string is parsed. - * SI postfixes and some named scalars are supported. - * If the field is of a numeric type, it has to be a numeric or named - * scalar. Behavior with more than one scalar and +- infix operators - * is undefined. - * If the field is of a flags type, it has to be a sequence of numeric - * scalars or named flags separated by '+' or '-'. Prefixing a flag - * with '+' causes it to be set without affecting the other flags; - * similarly, '-' unsets a flag. - * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN - * is passed here, then the option may be set on a child of obj. - * - * @return 0 if the value has been set, or an AVERROR code in case of - * error: - * AVERROR_OPTION_NOT_FOUND if no matching option exists - * AVERROR(ERANGE) if the value is out of range - * AVERROR(EINVAL) if the value is not valid - *) -function av_opt_set (obj: pointer; name: {const} PAnsiChar; val: {const} PAnsiChar; search_flags: cint): cint; - cdecl; external av__util; -function av_opt_set_int (obj: pointer; name: {const} PAnsiChar; val: cint64; search_flags: cint): cint; - cdecl; external av__util; -function av_opt_set_double(obj: pointer; name: {const} PAnsiChar; val: cdouble; search_flags: cint): cint; - cdecl; external av__util; -function av_opt_set_q (obj: pointer; name: {const} PAnsiChar; val: PAVRational; search_flags: cint): cint; - cdecl; external av__util; -(** - * @} - *) - -(** - * @defgroup opt_get_funcs Option getting functions - * @{ - * Those functions get a value of the option with the given name from an object. - * - * @param[in] obj a struct whose first element is a pointer to an AVClass. - * @param[in] name name of the option to get. - * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN - * is passed here, then the option may be found in a child of obj. - * @param[out] out_val value of the option will be written here - * @return 0 on success, a negative error code otherwise - *) -(** - * @note the returned string will av_malloc()ed and must be av_free()ed by the caller - *) -function av_opt_get (obj: pointer; name: {const} PAnsiChar; search_flags: cint; out_val: Pcuint8): cint; - cdecl; external av__util; -function av_opt_get_int (obj: pointer; name: {const} PAnsiChar; search_flags: cint; out_val: Pcint64): cint; - cdecl; external av__util; -function av_opt_get_double(obj: pointer; name: {const} PAnsiChar; search_flags: cint; out_val: Pcdouble): cint; - cdecl; external av__util; -function av_opt_get_q (obj: pointer; name: {const} PAnsiChar; search_flags: cint; var out_val: PAVRational): cint; - cdecl; external av__util; -(** - * @} - *) - -(** - * Gets a pointer to the requested field in a struct. - * This function allows accessing a struct even when its fields are moved or - * renamed since the application making the access has been compiled, - * - * @returns a pointer to the field, it can be cast to the correct type and read - * or written to. - *) -(* -procedure av_opt_ptr(avclass: {const} PAVClass; obj: pointer; name: {const} PAnsiChar); - cdecl; external av__util; -*) diff --git a/src/lib/ffmpeg-0.10/libavutil/pixfmt.pas b/src/lib/ffmpeg-0.10/libavutil/pixfmt.pas index 22f91b7d..552d4474 100644 --- a/src/lib/ffmpeg-0.10/libavutil/pixfmt.pas +++ b/src/lib/ffmpeg-0.10/libavutil/pixfmt.pas @@ -19,7 +19,7 @@ * - Changes and updates by the UltraStar Deluxe Team * * Conversion of libavutil/pixfmt.h - * avutil version 51.34.101 + * avutil version 51.9.1 * *) diff --git a/src/lib/ffmpeg-0.10/libavutil/samplefmt.pas b/src/lib/ffmpeg-0.10/libavutil/samplefmt.pas index 5e1207d7..3335fa2d 100644 --- a/src/lib/ffmpeg-0.10/libavutil/samplefmt.pas +++ b/src/lib/ffmpeg-0.10/libavutil/samplefmt.pas @@ -19,7 +19,7 @@ * This is a part of the Pascal port of ffmpeg. * * Conversion of libavutil/samplefmt.h - * avutil version 51.34.101 + * avutil version 50.43.0 * *) diff --git a/src/media/UAudioDecoder_FFmpeg.pas b/src/media/UAudioDecoder_FFmpeg.pas index 6b4f0cba..792655b2 100644 --- a/src/media/UAudioDecoder_FFmpeg.pas +++ b/src/media/UAudioDecoder_FFmpeg.pas @@ -80,7 +80,7 @@ const const // TODO: The factor 3/2 might not be necessary as we do not need extra // space for synchronizing as in the tutorial. - AUDIO_BUFFER_SIZE = (AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) div 2; + AUDIO_BUFFER_SIZE = (192000 * 3) div 2; type TFFmpegDecodeStream = class(TAudioDecodeStream) @@ -290,9 +290,14 @@ begin Self.fFilename := Filename; // use custom 'ufile' protocol for UTF-8 support - if (av_open_input_file(fFormatCtx, PAnsiChar('ufile:'+FileName.ToUTF8), nil, 0, nil) <> 0) then - begin - Log.LogError('av_open_input_file failed: "' + Filename.ToNative + '"', 'UAudio_FFmpeg'); + {$IF LIBAVFORMAT_VERSION >= 53001003)} + AVResult := avformat_open_input(@fFormatCtx, PAnsiChar('ufile:'+FileName.ToUTF8), nil, nil); + {$ELSE} + AVResult := av_open_input_file(fFormatContext, PAnsiChar('ufile:'+FileName.ToUTF8), nil, 0, nil); + {$IFEND} + if (AVResult <> 0) then + begin + Log.LogError('Failed to open file "' + Filename.ToNative + '" ('+FFmpegCore.GetErrorString(AVResult)+')', 'UAudio_FFmpeg'); Exit; end; @@ -300,9 +305,14 @@ begin fFormatCtx^.flags := fFormatCtx^.flags or AVFMT_FLAG_GENPTS; // retrieve stream information - if (av_find_stream_info(fFormatCtx) < 0) then - begin - Log.LogError('av_find_stream_info failed: "' + Filename.ToNative + '"', 'UAudio_FFmpeg'); + {$IF LIBAVFORMAT_VERSION >= 53002000)} + AVResult := avformat_find_stream_info(fFormatCtx, nil); + {$ELSE} + AVResult := av_find_stream_info(fFormatCtx); + {$IFEND} + if (AVResult < 0) then + begin + Log.LogError('No stream info found: "' + Filename.ToNative + '"', 'UAudio_FFmpeg'); Close(); Exit; end; @@ -335,7 +345,7 @@ begin {$IF LIBAVFORMAT_VERSION <= 52111000} // <= 52.111.0 fAudioStream := fFormatCtx.streams[fAudioStreamIndex]; {$ELSE} - fAudioStream := Pointer(fFormatCtx.streams^) + fAudioStreamIndex; + fAudioStream := (fFormatCtx.streams + fAudioStreamIndex)^; {$IFEND} fAudioStreamPos := 0; fCodecCtx := fAudioStream^.codec; @@ -374,7 +384,11 @@ begin // fail if called concurrently by different threads. FFmpegCore.LockAVCodec(); try + {$IF LIBAVCODEC_VERSION >= 5300500} + AVResult := avcodec_open2(fCodecCtx, fCodec, nil); + {$ELSE} AVResult := avcodec_open(fCodecCtx, fCodec); + {$IFEND} finally FFmpegCore.UnlockAVCodec(); end; @@ -448,7 +462,11 @@ begin // Close the video file if (fFormatCtx <> nil) then begin + {$IF LIBAVFORMAT_VERSION >= 53017003)} + avformat_close_input(@fFormatCtx); + {$ELSE} av_close_input_file(fFormatCtx); + {$IFEND} fFormatCtx := nil; end; @@ -672,6 +690,8 @@ var ErrorCode: integer; StartSilence: double; // duration of silence at start of stream StartSilencePtr: PDouble; // pointer for the EMPTY status packet + fs: integer; + ue: integer; // Note: pthreads wakes threads waiting on a mutex in the order of their // priority and not in FIFO order. SDL does not provide any option to @@ -817,7 +837,12 @@ begin end; // check for errors - if (url_ferror(ByteIOCtx) <> 0) then + {$IF (LIBAVFORMAT_VERSION >= 52103000)} + ue := ByteIOCtx^.error; + {$ELSE} + ue := url_ferror(ByteIOCtx); + {$IFEND} + if (ue <> 0) then begin // an error occured -> abort and wait for repositioning or termination fPacketQueue.PutStatus(PKT_STATUS_FLAG_ERROR, nil); @@ -826,8 +851,12 @@ begin // url_feof() does not detect an EOF for some files // so we have to do it this way. - if ((fFormatCtx^.file_size <> 0) and - (ByteIOCtx^.pos >= fFormatCtx^.file_size)) then + {$IF (LIBAVFORMAT_VERSION >= 53009000)} + fs := avio_size(fFormatCtx^.pb); + {$ELSE} + fs := fFormatCtx^.file_size; + {$IFEND} + if ((fs <> 0) and (ByteIOCtx^.pos >= fs)) then begin fPacketQueue.PutStatus(PKT_STATUS_FLAG_EOF, nil); Exit; @@ -887,7 +916,11 @@ begin FFmpegCore.LockAVCodec(); try avcodec_close(fCodecCtx); + {$IF LIBAVCODEC_VERSION >= 5300500} + avcodec_open2(fCodecCtx, fCodec, nil); + {$ELSE} avcodec_open(fCodecCtx, fCodec); + {$IFEND} finally FFmpegCore.UnlockAVCodec(); end; @@ -903,6 +936,10 @@ var {$IFDEF DebugFFmpegDecode} TmpPos: double; {$ENDIF} + {$IF LIBAVCODEC_VERSION >= 5300500} + AVFrame: PAVFrame; + got_frame_ptr: integer; + {$IFEND} begin Result := -1; @@ -928,6 +965,11 @@ begin begin DataSize := BufferSize; +// {$IF LIBAVCODEC_VERSION >= 53025000} // 53.25.0 +// PaketDecodedSize := avcodec_decode_audio4(fCodecCtx, AVFrame, +// @got_frame_ptr, @fAudioPaket); +// DataSize := AVFrame.nb_samples; +// Buffer := PByteArray(AVFrame.data[0]); {$IF LIBAVCODEC_VERSION >= 52122000} // 52.122.0 PaketDecodedSize := avcodec_decode_audio3(fCodecCtx, PSmallint(Buffer), DataSize, @fAudioPaket); diff --git a/src/media/UMediaCore_FFmpeg.pas b/src/media/UMediaCore_FFmpeg.pas index 6abfb16d..dd8ddf07 100644 --- a/src/media/UMediaCore_FFmpeg.pas +++ b/src/media/UMediaCore_FFmpeg.pas @@ -270,9 +270,9 @@ begin {$IF LIBAVFORMAT_VERSION <= 52111000} // <= 52.111.0 Stream := FormatCtx.streams[i]; {$ELSE} - Stream := Pointer(FormatCtx.streams^) + i; + Stream := (FormatCtx.streams + i)^; {$IFEND} - + {$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 if (Stream.codec.codec_type = CODEC_TYPE_VIDEO) and (FirstVideoStream < 0) then @@ -320,7 +320,7 @@ begin {$IF LIBAVFORMAT_VERSION <= 52111000} // <= 52.111.0 Stream := FormatCtx^.streams[i]; {$ELSE} - Stream := Pointer(FormatCtx^.streams^) + i; + Stream := (FormatCtx^.streams + i)^; {$IFEND} {$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 diff --git a/src/media/UVideo.pas b/src/media/UVideo.pas index fe043504..eaffa9ea 100644 --- a/src/media/UVideo.pas +++ b/src/media/UVideo.pas @@ -322,7 +322,11 @@ begin fPboEnabled := PboSupported; // use custom 'ufile' protocol for UTF-8 support + {$IF LIBAVFORMAT_VERSION >= 53001003)} + errnum := avformat_open_input(@fFormatContext, PAnsiChar('ufile:'+FileName.ToUTF8), nil, nil); + {$ELSE} errnum := av_open_input_file(fFormatContext, PAnsiChar('ufile:'+FileName.ToUTF8), nil, 0, nil); + {$IFEND} if (errnum <> 0) then begin Log.LogError('Failed to open file "'+ FileName.ToNative +'" ('+FFmpegCore.GetErrorString(errnum)+')'); @@ -330,7 +334,12 @@ begin end; // update video info - if (av_find_stream_info(fFormatContext) < 0) then + {$IF LIBAVFORMAT_VERSION >= 53002000)} + errnum := avformat_find_stream_info(fFormatContext, nil); + {$ELSE} + errnum := av_find_stream_info(fFormatContext); + {$IFEND} + if (errnum < 0) then begin Log.LogError('No stream info found', 'TVideoPlayback_ffmpeg.Open'); Close(); @@ -350,7 +359,7 @@ begin {$IF LIBAVFORMAT_VERSION <= 52111000} // <= 52.111.0 fStream := fFormatContext^.streams[fStreamIndex]; {$ELSE} - fStream := Pointer(fFormatContext^.streams^) + fStreamIndex; + fStream := (fFormatContext^.streams + fStreamIndex)^; {$IFEND} fCodecContext := fStream^.codec; @@ -377,7 +386,11 @@ begin // fail if called concurrently by different threads. FFmpegCore.LockAVCodec(); try + {$IF LIBAVCODEC_VERSION >= 5300500)} + errnum := avcodec_open2(fCodecContext, fCodec, nil); + {$ELSE} errnum := avcodec_open(fCodecContext, fCodec); + {$IFEND} finally FFmpegCore.UnlockAVCodec(); end; @@ -570,7 +583,11 @@ begin end; if (fFormatContext <> nil) then + {$IF LIBAVFORMAT_VERSION >= 53017003)} + avformat_close_input(@fFormatContext); + {$ELSE} av_close_input_file(fFormatContext); + {$IFEND} fCodecContext := nil; fFormatContext := nil; @@ -616,6 +633,8 @@ var errnum: integer; AVPacket: TAVPacket; pts: double; + fs: integer; + ue: integer; begin Result := false; FrameFinished := 0; @@ -645,7 +664,12 @@ begin end; // check for errors - if (url_ferror(pbIOCtx) <> 0) then + {$IF (LIBAVFORMAT_VERSION >= 52103000)} + ue := pbIOCtx^.error; + {$ELSE} + ue := url_ferror(pbIOCtx); + {$IFEND} + if (ue <> 0) then begin Log.LogError('Video decoding file error', 'TVideoPlayback_FFmpeg.DecodeFrame'); Exit; @@ -653,8 +677,12 @@ begin // url_feof() does not detect an EOF for some mov-files (e.g. deluxe.mov) // so we have to do it this way. - if ((fFormatContext^.file_size <> 0) and - (pbIOCtx^.pos >= fFormatContext^.file_size)) then + {$IF (LIBAVFORMAT_VERSION >= 53009000)} + fs := avio_size(fFormatContext^.pb); + {$ELSE} + fs := fFormatContext^.file_size; + {$IFEND} + if ((fs <> 0) and (pbIOCtx^.pos >= fs)) then begin fEOF := true; Exit; -- cgit v1.2.3