diff options
author | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2010-10-28 14:38:26 +0000 |
---|---|---|
committer | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2010-10-28 14:38:26 +0000 |
commit | f8f21b447558c911bcd4bbaaf45e9d7ba52e8fe1 (patch) | |
tree | bd3b688d3411eff8224ce4db65f17b1159ba288b | |
parent | 40acf26d6752ec031d814dd88136afb6fca966d1 (diff) | |
download | usdx-f8f21b447558c911bcd4bbaaf45e9d7ba52e8fe1.tar.gz usdx-f8f21b447558c911bcd4bbaaf45e9d7ba52e8fe1.tar.xz usdx-f8f21b447558c911bcd4bbaaf45e9d7ba52e8fe1.zip |
removed ffmpeg stuff
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/experimental@2694 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to '')
-rw-r--r-- | mediaplugin/src/base/UConfig.pas | 22 | ||||
-rw-r--r-- | mediaplugin/src/config-darwin.inc | 26 | ||||
-rw-r--r-- | mediaplugin/src/config-win.inc | 26 | ||||
-rw-r--r-- | mediaplugin/src/config.inc.in | 26 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/avcodec.pas | 5002 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/avformat.pas | 2100 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/avio.pas | 796 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/avutil.pas | 504 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/error.pas | 115 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/mathematics.pas | 133 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/opt.pas | 261 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/rational.pas | 170 | ||||
-rw-r--r-- | mediaplugin/src/lib/ffmpeg/swscale.pas | 434 | ||||
-rw-r--r-- | mediaplugin/src/media/UAudioDecoder_FFmpeg.pas | 2 | ||||
-rw-r--r-- | mediaplugin/src/media/UMediaCore_FFmpeg.pas | 343 | ||||
-rw-r--r-- | mediaplugin/src/media/UMediaPlugin.pas | 16 | ||||
-rw-r--r-- | mediaplugin/src/media/UVideoDecoder_FFmpeg.pas | 654 | ||||
-rw-r--r-- | mediaplugin/src/switches.inc | 15 | ||||
-rw-r--r-- | mediaplugin/src/ultrastardx.dpr | 24 |
19 files changed, 60 insertions, 10609 deletions
diff --git a/mediaplugin/src/base/UConfig.pas b/mediaplugin/src/base/UConfig.pas index e48b5493..b7e9d920 100644 --- a/mediaplugin/src/base/UConfig.pas +++ b/mediaplugin/src/base/UConfig.pas @@ -163,28 +163,6 @@ const {$MESSAGE FATAL 'FPC >= 2.2.2 required!'} {$IFEND} - {$IFDEF HaveFFmpeg} - - LIBAVCODEC_VERSION = (LIBAVCODEC_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVCODEC_VERSION_MINOR * VERSION_MINOR) + - (LIBAVCODEC_VERSION_RELEASE * VERSION_RELEASE); - - LIBAVFORMAT_VERSION = (LIBAVFORMAT_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVFORMAT_VERSION_MINOR * VERSION_MINOR) + - (LIBAVFORMAT_VERSION_RELEASE * VERSION_RELEASE); - - LIBAVUTIL_VERSION = (LIBAVUTIL_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVUTIL_VERSION_MINOR * VERSION_MINOR) + - (LIBAVUTIL_VERSION_RELEASE * VERSION_RELEASE); - - {$IFDEF HaveSWScale} - LIBSWSCALE_VERSION = (LIBSWSCALE_VERSION_MAJOR * VERSION_MAJOR) + - (LIBSWSCALE_VERSION_MINOR * VERSION_MINOR) + - (LIBSWSCALE_VERSION_RELEASE * VERSION_RELEASE); - {$ENDIF} - - {$ENDIF} - {$IFDEF HaveProjectM} PROJECTM_VERSION = (PROJECTM_VERSION_MAJOR * VERSION_MAJOR) + (PROJECTM_VERSION_MINOR * VERSION_MINOR) + diff --git a/mediaplugin/src/config-darwin.inc b/mediaplugin/src/config-darwin.inc index 5eb38d76..3dfd061b 100644 --- a/mediaplugin/src/config-darwin.inc +++ b/mediaplugin/src/config-darwin.inc @@ -9,32 +9,6 @@ lua_lib_name = 'lua'; {$IFEND} -{$DEFINE HaveFFmpeg} -{$IF Defined(HaveFFmpeg) and Defined(IncludeConstants)} - av__codec = 'libavcodec'; - LIBAVCODEC_VERSION_MAJOR = 51; - LIBAVCODEC_VERSION_MINOR = 49; - LIBAVCODEC_VERSION_RELEASE = 0; - - av__format = 'libavformat'; - LIBAVFORMAT_VERSION_MAJOR = 52; - LIBAVFORMAT_VERSION_MINOR = 2; - LIBAVFORMAT_VERSION_RELEASE = 0; - - av__util = 'libavutil'; - LIBAVUTIL_VERSION_MAJOR = 49; - LIBAVUTIL_VERSION_MINOR = 6; - LIBAVUTIL_VERSION_RELEASE = 0; -{$IFEND} - -{$DEFINE HaveSWScale} -{$IF Defined(HaveSWScale) and Defined(IncludeConstants)} - sw__scale = 'libswscale'; - LIBSWSCALE_VERSION_MAJOR = 0; - LIBSWSCALE_VERSION_MINOR = 5; - LIBSWSCALE_VERSION_RELEASE = 0; -{$IFEND} - {$UNDEF HaveProjectM} {$IF Defined(HaveProjectM) and Defined(IncludeConstants)} ProjectM_DataDir = ''; diff --git a/mediaplugin/src/config-win.inc b/mediaplugin/src/config-win.inc index 843fdb0e..3ffb0161 100644 --- a/mediaplugin/src/config-win.inc +++ b/mediaplugin/src/config-win.inc @@ -4,32 +4,6 @@ {* Libraries *} -{$DEFINE HaveFFmpeg} -{$IF Defined(HaveFFmpeg) and Defined(IncludeConstants)} - av__codec = 'avcodec-52'; - LIBAVCODEC_VERSION_MAJOR = 52; - LIBAVCODEC_VERSION_MINOR = 67; - LIBAVCODEC_VERSION_RELEASE = 2; - - av__format = 'avformat-52'; - LIBAVFORMAT_VERSION_MAJOR = 52; - LIBAVFORMAT_VERSION_MINOR = 62; - LIBAVFORMAT_VERSION_RELEASE = 0; - - av__util = 'avutil-50'; - LIBAVUTIL_VERSION_MAJOR = 50; - LIBAVUTIL_VERSION_MINOR = 15; - LIBAVUTIL_VERSION_RELEASE = 2; -{$IFEND} - -{$DEFINE HaveSWScale} -{$IF Defined(HaveSWScale) and Defined(IncludeConstants)} - sw__scale = 'swscale-0'; - LIBSWSCALE_VERSION_MAJOR = 0; - LIBSWSCALE_VERSION_MINOR = 10; - LIBSWSCALE_VERSION_RELEASE = 0; -{$IFEND} - {$DEFINE HaveProjectM} {$IF Defined(HaveProjectM) and Defined(IncludeConstants)} ProjectM_DataDir = 'Visuals\projectM'; diff --git a/mediaplugin/src/config.inc.in b/mediaplugin/src/config.inc.in index d57c7ab4..c322b62a 100644 --- a/mediaplugin/src/config.inc.in +++ b/mediaplugin/src/config.inc.in @@ -9,32 +9,6 @@ lua_lib_name = '@lua_LIB_NAME@'; {$IFEND} -{$@DEFINE_HAVE_FFMPEG@ HaveFFmpeg} -{$IF Defined(HaveFFmpeg) and Defined(IncludeConstants)} - av__codec = 'libavcodec'; - LIBAVCODEC_VERSION_MAJOR = @libavcodec_VERSION_MAJOR@; - LIBAVCODEC_VERSION_MINOR = @libavcodec_VERSION_MINOR@; - LIBAVCODEC_VERSION_RELEASE = @libavcodec_VERSION_RELEASE@; - - av__format = 'libavformat'; - LIBAVFORMAT_VERSION_MAJOR = @libavformat_VERSION_MAJOR@; - LIBAVFORMAT_VERSION_MINOR = @libavformat_VERSION_MINOR@; - LIBAVFORMAT_VERSION_RELEASE = @libavformat_VERSION_RELEASE@; - - av__util = 'libavutil'; - LIBAVUTIL_VERSION_MAJOR = @libavutil_VERSION_MAJOR@; - LIBAVUTIL_VERSION_MINOR = @libavutil_VERSION_MINOR@; - LIBAVUTIL_VERSION_RELEASE = @libavutil_VERSION_RELEASE@; -{$IFEND} - -{$@DEFINE_HAVE_SWSCALE@ HaveSWScale} -{$IF Defined(HaveSWScale) and Defined(IncludeConstants)} - sw__scale = 'libswscale'; - LIBSWSCALE_VERSION_MAJOR = @libswscale_VERSION_MAJOR@; - LIBSWSCALE_VERSION_MINOR = @libswscale_VERSION_MINOR@; - LIBSWSCALE_VERSION_RELEASE = @libswscale_VERSION_RELEASE@; -{$IFEND} - {$@DEFINE_HAVE_PROJECTM@ HaveProjectM} {$IF Defined(HaveProjectM) and Defined(IncludeConstants)} ProjectM_DataDir = '@libprojectM_DATADIR@'; diff --git a/mediaplugin/src/lib/ffmpeg/avcodec.pas b/mediaplugin/src/lib/ffmpeg/avcodec.pas deleted file mode 100644 index 0a436a48..00000000 --- a/mediaplugin/src/lib/ffmpeg/avcodec.pas +++ /dev/null @@ -1,5002 +0,0 @@ -(* - * copyright (c) 2001 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavcodec/avcodec.h - * Min. version: 51.16.0, revision 6577, Sat Oct 7 15:30:46 2006 UTC - * Max. version: 52.86.1, revision 24882, Wed Aug 23 07:00:00 2010 CET - * - *) - -unit avcodec; - -{$IFDEF FPC} - {$MODE DELPHI } - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$IFDEF DARWIN} - {$linklib libavcodec} -{$ENDIF} - -interface - -uses - ctypes, - avutil, - rational, - opt, - SysUtils, - {$IFDEF UNIX} - BaseUnix, - {$ENDIF} - UConfig; - -const - (* - * IMPORTANT: The official FFmpeg C headers change very quickly. Often some - * of the data structures are changed so that they become incompatible with - * older header files. The Pascal headers have to be adjusted to those changes, - * otherwise the application might crash randomly or strange bugs (not - * necessarily related to video or audio due to buffer overflows etc.) might - * occur. - * - * In the past users reported problems with USDX that took hours to fix and - * the problem was an unsupported version of FFmpeg. So we decided to disable - * support for future versions of FFmpeg until the headers are revised by us - * for that version as they otherwise most probably will break USDX. - * - * If the headers do not yet support your FFmpeg version you may want to - * adjust the max. version numbers manually but please note: it may work but - * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT - * for the game if the MAX. VERSION WAS CHANGED. - * - * The only safe way to support new versions of FFmpeg is to add the changes - * of the FFmpeg git repository C headers to the Pascal headers. - * You can accelerate this process by posting a patch with the git changes - * translated to Pascal to our bug tracker (please join our IRC chat before - * you start working on it). Simply adjusting the max. versions is NOT a valid - * fix. - *) - (* Max. supported version by this header *) - LIBAVCODEC_MAX_VERSION_MAJOR = 52; - LIBAVCODEC_MAX_VERSION_MINOR = 86; - LIBAVCODEC_MAX_VERSION_RELEASE = 1; - LIBAVCODEC_MAX_VERSION = (LIBAVCODEC_MAX_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVCODEC_MAX_VERSION_MINOR * VERSION_MINOR) + - (LIBAVCODEC_MAX_VERSION_RELEASE * VERSION_RELEASE); - - (* Min. supported version by this header *) - LIBAVCODEC_MIN_VERSION_MAJOR = 51; - LIBAVCODEC_MIN_VERSION_MINOR = 16; - LIBAVCODEC_MIN_VERSION_RELEASE = 0; - LIBAVCODEC_MIN_VERSION = (LIBAVCODEC_MIN_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVCODEC_MIN_VERSION_MINOR * VERSION_MINOR) + - (LIBAVCODEC_MIN_VERSION_RELEASE * VERSION_RELEASE); - -(* Check if linked versions are supported *) -{$IF (LIBAVCODEC_VERSION < LIBAVCODEC_MIN_VERSION)} - {$MESSAGE Error 'Linked version of libavcodec is too old!'} -{$IFEND} - -(* Check if linked version is supported *) -{$IF (LIBAVCODEC_VERSION > LIBAVCODEC_MAX_VERSION)} - {$MESSAGE Error 'Linked version of libavcodec is not yet supported!'} -{$IFEND} - -const - AV_NOPTS_VALUE: cint64 = $8000000000000000; - AV_TIME_BASE = 1000000; - AV_TIME_BASE_Q: TAVRational = (num: 1; den: AV_TIME_BASE); - -(** - * Identify the syntax and semantics of the bitstream. - * The principle is roughly: - * Two decoders with the same ID can decode the same streams. - * Two encoders with the same ID can encode compatible streams. - * There may be slight deviations from the principle due to implementation - * details. - * - * If you add a codec ID to this list, add it so that - * 1. no value of a existing codec ID changes (that would break ABI), - * 2. it is as close as possible to similar codecs. - *) -type - TCodecID = ( - CODEC_ID_NONE, - - (* video codecs *) - CODEC_ID_MPEG1VIDEO, - CODEC_ID_MPEG2VIDEO, //* prefered ID for MPEG Video 1/2 decoding */ - CODEC_ID_MPEG2VIDEO_XVMC, - CODEC_ID_H261, - CODEC_ID_H263, - CODEC_ID_RV10, - CODEC_ID_RV20, - CODEC_ID_MJPEG, - CODEC_ID_MJPEGB, - CODEC_ID_LJPEG, - CODEC_ID_SP5X, - CODEC_ID_JPEGLS, - CODEC_ID_MPEG4, - CODEC_ID_RAWVIDEO, - CODEC_ID_MSMPEG4V1, - CODEC_ID_MSMPEG4V2, - CODEC_ID_MSMPEG4V3, - CODEC_ID_WMV1, - CODEC_ID_WMV2, - CODEC_ID_H263P, - CODEC_ID_H263I, - CODEC_ID_FLV1, - CODEC_ID_SVQ1, - CODEC_ID_SVQ3, - CODEC_ID_DVVIDEO, - CODEC_ID_HUFFYUV, - CODEC_ID_CYUV, - CODEC_ID_H264, - CODEC_ID_INDEO3, - CODEC_ID_VP3, - CODEC_ID_THEORA, - CODEC_ID_ASV1, - CODEC_ID_ASV2, - CODEC_ID_FFV1, - CODEC_ID_4XM, - CODEC_ID_VCR1, - CODEC_ID_CLJR, - CODEC_ID_MDEC, - CODEC_ID_ROQ, - CODEC_ID_INTERPLAY_VIDEO, - CODEC_ID_XAN_WC3, - CODEC_ID_XAN_WC4, - CODEC_ID_RPZA, - CODEC_ID_CINEPAK, - CODEC_ID_WS_VQA, - CODEC_ID_MSRLE, - CODEC_ID_MSVIDEO1, - CODEC_ID_IDCIN, - CODEC_ID_8BPS, - CODEC_ID_SMC, - CODEC_ID_FLIC, - CODEC_ID_TRUEMOTION1, - CODEC_ID_VMDVIDEO, - CODEC_ID_MSZH, - CODEC_ID_ZLIB, - CODEC_ID_QTRLE, - CODEC_ID_SNOW, - CODEC_ID_TSCC, - CODEC_ID_ULTI, - 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, - CODEC_ID_PGM, - CODEC_ID_PGMYUV, - CODEC_ID_PAM, - CODEC_ID_FFVHUFF, - CODEC_ID_RV30, - CODEC_ID_RV40, - CODEC_ID_VC1, - CODEC_ID_WMV3, - CODEC_ID_LOCO, - CODEC_ID_WNV1, - CODEC_ID_AASC, - CODEC_ID_INDEO2, - CODEC_ID_FRAPS, - CODEC_ID_TRUEMOTION2, - CODEC_ID_BMP, - CODEC_ID_CSCD, - CODEC_ID_MMVIDEO, - CODEC_ID_ZMBV, - CODEC_ID_AVS, - CODEC_ID_SMACKVIDEO, - CODEC_ID_NUV, - CODEC_ID_KMVC, - CODEC_ID_FLASHSV, - CODEC_ID_CAVS, - CODEC_ID_JPEG2000, - CODEC_ID_VMNC, - CODEC_ID_VP5, - CODEC_ID_VP6, - CODEC_ID_VP6F, - CODEC_ID_TARGA, - CODEC_ID_DSICINVIDEO, - CODEC_ID_TIERTEXSEQVIDEO, - CODEC_ID_TIFF, - CODEC_ID_GIF, - CODEC_ID_FFH264, - CODEC_ID_DXA, - CODEC_ID_DNXHD, - CODEC_ID_THP, - CODEC_ID_SGI, - CODEC_ID_C93, - CODEC_ID_BETHSOFTVID, - CODEC_ID_PTX, - CODEC_ID_TXD, - CODEC_ID_VP6A, - CODEC_ID_AMV, - CODEC_ID_VB, - CODEC_ID_PCX, - CODEC_ID_SUNRAST, - CODEC_ID_INDEO4, - CODEC_ID_INDEO5, - CODEC_ID_MIMIC, - CODEC_ID_RL2, - CODEC_ID_8SVX_EXP, - CODEC_ID_8SVX_FIB, - CODEC_ID_ESCAPE124, - CODEC_ID_DIRAC, - CODEC_ID_BFI, - CODEC_ID_CMV, - CODEC_ID_MOTIONPIXELS, - CODEC_ID_TGV, - CODEC_ID_TGQ, -{$IF LIBAVCODEC_VERSION >= 52012000} // >= 52.12.0 - CODEC_ID_TQI, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52022002} // >= 52.22.2 - CODEC_ID_AURA, - CODEC_ID_AURA2, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52027000} // >= 52.27.0 - CODEC_ID_V210X, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52028000} // >= 52.28.0 - CODEC_ID_TMV, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52029000} // >= 52.29.0 - CODEC_ID_V210, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52030002} // >= 52.30.2 - CODEC_ID_DPX, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52031002} // >= 52.31.2 - CODEC_ID_MAD, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52037000} // >= 52.37.0 - CODEC_ID_FRWU, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52041000} // >= 52.41.0 - CODEC_ID_FLASHSV2, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52043000} // >= 52.43.0 - CODEC_ID_CDGRAPHICS, - CODEC_ID_R210, -{$IFEND} - CODEC_ID_ANM, -{$IF LIBAVCODEC_VERSION >= 52049000} // >= 52.49.0 - CODEC_ID_BINKVIDEO, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52052000} // >= 52.52.0 - CODEC_ID_IFF_ILBM, - CODEC_ID_IFF_BYTERUN1, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52058000} // >= 52.58.0 - CODEC_ID_KGV1, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52062000} // >= 52.62.0 - CODEC_ID_YOP, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52067002} // >= 52.67.2 - CODEC_ID_VP8, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52075001} // >= 52.75.1 - CODEC_ID_PICTOR, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52084000} // >= 52.84.0 - CODEC_ID_ANSI, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52086001} // >= 52.86.1 - CODEC_ID_A64_MULTI, - CODEC_ID_A64_MULTI5, -{$IFEND} - - //* various PCM "codecs" */ - CODEC_ID_PCM_S16LE= $10000, - CODEC_ID_PCM_S16BE, - CODEC_ID_PCM_U16LE, - CODEC_ID_PCM_U16BE, - CODEC_ID_PCM_S8, - CODEC_ID_PCM_U8, - CODEC_ID_PCM_MULAW, - CODEC_ID_PCM_ALAW, - CODEC_ID_PCM_S32LE, - CODEC_ID_PCM_S32BE, - CODEC_ID_PCM_U32LE, - CODEC_ID_PCM_U32BE, - CODEC_ID_PCM_S24LE, - CODEC_ID_PCM_S24BE, - CODEC_ID_PCM_U24LE, - CODEC_ID_PCM_U24BE, - CODEC_ID_PCM_S24DAUD, - CODEC_ID_PCM_ZORK, - CODEC_ID_PCM_S16LE_PLANAR, - CODEC_ID_PCM_DVD, - CODEC_ID_PCM_F32BE, - CODEC_ID_PCM_F32LE, - CODEC_ID_PCM_F64BE, - CODEC_ID_PCM_F64LE, -{$IF LIBAVCODEC_VERSION >= 52034000} // >= 52.34.0 - CODEC_ID_PCM_BLURAY, -{$IFEND} - - //* various ADPCM codecs */ - CODEC_ID_ADPCM_IMA_QT= $11000, - CODEC_ID_ADPCM_IMA_WAV, - CODEC_ID_ADPCM_IMA_DK3, - CODEC_ID_ADPCM_IMA_DK4, - CODEC_ID_ADPCM_IMA_WS, - CODEC_ID_ADPCM_IMA_SMJPEG, - CODEC_ID_ADPCM_MS, - CODEC_ID_ADPCM_4XM, - CODEC_ID_ADPCM_XA, - CODEC_ID_ADPCM_ADX, - CODEC_ID_ADPCM_EA, - CODEC_ID_ADPCM_G726, - CODEC_ID_ADPCM_CT, - CODEC_ID_ADPCM_SWF, - CODEC_ID_ADPCM_YAMAHA, - CODEC_ID_ADPCM_SBPRO_4, - CODEC_ID_ADPCM_SBPRO_3, - CODEC_ID_ADPCM_SBPRO_2, - CODEC_ID_ADPCM_THP, - CODEC_ID_ADPCM_IMA_AMV, - CODEC_ID_ADPCM_EA_R1, - CODEC_ID_ADPCM_EA_R3, - CODEC_ID_ADPCM_EA_R2, - CODEC_ID_ADPCM_IMA_EA_SEAD, - CODEC_ID_ADPCM_IMA_EA_EACS, - CODEC_ID_ADPCM_EA_XAS, - CODEC_ID_ADPCM_EA_MAXIS_XA, - CODEC_ID_ADPCM_IMA_ISS, - - //* AMR */ - CODEC_ID_AMR_NB= $12000, - CODEC_ID_AMR_WB, - - //* RealAudio codecs*/ - CODEC_ID_RA_144= $13000, - CODEC_ID_RA_288, - - //* various DPCM codecs */ - 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_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 - CODEC_ID_AAC, - {$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 - _CODEC_ID_MPEG4AAC, // will be redefined to CODEC_ID_AAC below - {$IFEND} - CODEC_ID_AC3, - CODEC_ID_DTS, - CODEC_ID_VORBIS, - CODEC_ID_DVAUDIO, - CODEC_ID_WMAV1, - CODEC_ID_WMAV2, - CODEC_ID_MACE3, - CODEC_ID_MACE6, - CODEC_ID_VMDAUDIO, - CODEC_ID_SONIC, - CODEC_ID_SONIC_LS, - CODEC_ID_FLAC, - CODEC_ID_MP3ADU, - CODEC_ID_MP3ON4, - CODEC_ID_SHORTEN, - CODEC_ID_ALAC, - CODEC_ID_WESTWOOD_SND1, - CODEC_ID_GSM, ///< as in Berlin toast format - CODEC_ID_QDM2, - CODEC_ID_COOK, - CODEC_ID_TRUESPEECH, - CODEC_ID_TTA, - CODEC_ID_SMACKAUDIO, - CODEC_ID_QCELP, - CODEC_ID_WAVPACK, - CODEC_ID_DSICINAUDIO, - CODEC_ID_IMC, - CODEC_ID_MUSEPACK7, - CODEC_ID_MLP, - CODEC_ID_GSM_MS, { as found in WAV } - CODEC_ID_ATRAC3, - CODEC_ID_VOXWARE, - CODEC_ID_APE, - CODEC_ID_NELLYMOSER, - CODEC_ID_MUSEPACK8, - CODEC_ID_SPEEX, - CODEC_ID_WMAVOICE, - CODEC_ID_WMAPRO, - CODEC_ID_WMALOSSLESS, - CODEC_ID_ATRAC3P, - CODEC_ID_EAC3, - CODEC_ID_SIPR, - CODEC_ID_MP1, -{$IF LIBAVCODEC_VERSION >= 52020000} // >= 52.20.0 - CODEC_ID_TWINVQ, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52022000} // >= 52.22.0 - CODEC_ID_TRUEHD, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52026000} // >= 52.26.0 - CODEC_ID_MP4ALS, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52035000} // >= 52.35.0 - CODEC_ID_ATRAC1, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52049000} // >= 52.49.0 - CODEC_ID_BINKAUDIO_RDFT, - CODEC_ID_BINKAUDIO_DCT, -{$IFEND} - - //* subtitle codecs */ - CODEC_ID_DVD_SUBTITLE= $17000, - CODEC_ID_DVB_SUBTITLE, - CODEC_ID_TEXT, ///< raw UTF-8 text - CODEC_ID_XSUB, - CODEC_ID_SSA, - CODEC_ID_MOV_TEXT, -{$IF LIBAVCODEC_VERSION >= 52033000} // >= 52.33.0 - CODEC_ID_HDMV_PGS_SUBTITLE, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52037001} // >= 52.37.1 - CODEC_ID_DVB_TELETEXT, -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52084001} // >= 52.84.1 - CODEC_ID_SRT, -{$IFEND} - - (* 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_MPEG2TS= $20000, {*< _FAKE_ codec to indicate a raw MPEG-2 TS - * stream (only used by libavformat) *} - __CODEC_ID_4BYTE = $FFFFF // ensure 4-byte enum - ); - -{$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 -{* CODEC_ID_MP3LAME is obsolete *} -const - CODEC_ID_MP3LAME = CODEC_ID_MP3; - CODEC_ID_MPEG4AAC = CODEC_ID_AAC; -{$IFEND} - -{$IF LIBAVCODEC_VERSION_MAJOR < 53} // < 53.0.0 -type - TCodecType = ( - CODEC_TYPE_UNKNOWN = -1, - CODEC_TYPE_VIDEO, - CODEC_TYPE_AUDIO, - CODEC_TYPE_DATA, - CODEC_TYPE_SUBTITLE, - CODEC_TYPE_ATTACHMENT, - CODEC_TYPE_NB - ); -{$IFEND} - -{ - TAVMediaType moved to avutil in LIBAVUTIL_VERSION 50.14.0 - but moving it in the pascal headers was not really necessary - but caused problems. So, I (KMS) left it here. -} -{$IF LIBAVCODEC_VERSION >= 52064000} // >= 52.64.0 -type - TAVMediaType = ( - AVMEDIA_TYPE_UNKNOWN = -1, - AVMEDIA_TYPE_VIDEO, - AVMEDIA_TYPE_AUDIO, - AVMEDIA_TYPE_DATA, - AVMEDIA_TYPE_SUBTITLE, - AVMEDIA_TYPE_ATTACHMENT, - AVMEDIA_TYPE_NB - ); -{$IFEND} - -{** - * all in native endian - *} -type - TSampleFormat = ( - SAMPLE_FMT_NONE = -1, - SAMPLE_FMT_U8, ///< unsigned 8 bits - SAMPLE_FMT_S16, ///< signed 16 bits - SAMPLE_FMT_S32, ///< signed 32 bits - SAMPLE_FMT_FLT, ///< float - SAMPLE_FMT_DBL, ///< double - SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if dynamically linking to libavcodec - ); - _TSampleFormatArray = array [0 .. MaxInt div SizeOf(TSampleFormat)-1] of TSampleFormat; - PSampleFormatArray = ^_TSampleFormatArray; - -const - {* Audio channel masks *} - CH_FRONT_LEFT = $00000001; - CH_FRONT_RIGHT = $00000002; - CH_FRONT_CENTER = $00000004; - CH_LOW_FREQUENCY = $00000008; - CH_BACK_LEFT = $00000010; - CH_BACK_RIGHT = $00000020; - CH_FRONT_LEFT_OF_CENTER = $00000040; - CH_FRONT_RIGHT_OF_CENTER = $00000080; - CH_BACK_CENTER = $00000100; - CH_SIDE_LEFT = $00000200; - CH_SIDE_RIGHT = $00000400; - CH_TOP_CENTER = $00000800; - CH_TOP_FRONT_LEFT = $00001000; - CH_TOP_FRONT_CENTER = $00002000; - CH_TOP_FRONT_RIGHT = $00004000; - CH_TOP_BACK_LEFT = $00008000; - CH_TOP_BACK_CENTER = $00010000; - CH_TOP_BACK_RIGHT = $00020000; - CH_STEREO_LEFT = $20000000; ///< Stereo downmix. - CH_STEREO_RIGHT = $40000000; ///< See CH_STEREO_LEFT. -{** Channel mask value used for AVCodecContext.request_channel_layout - * to indicate that the user requests the channel order of the decoder output - * to be the native codec channel order. - *} -{$IF LIBAVCODEC_VERSION >= 52038001} // >= 52.38.1 - CH_LAYOUT_NATIVE = $8000000000000000; -{$IFEND} - - {* Audio channel convenience macros *} - CH_LAYOUT_MONO = (CH_FRONT_CENTER); - CH_LAYOUT_STEREO = (CH_FRONT_LEFT or CH_FRONT_RIGHT); - CH_LAYOUT_SURROUND = (CH_LAYOUT_STEREO or CH_FRONT_CENTER); -{$IF LIBAVCODEC_VERSION >= 52027000} // >= 52.27.0 - CH_LAYOUT_2_1 = (CH_LAYOUT_STEREO or CH_BACK_CENTER); - CH_LAYOUT_4POINT0 = (CH_LAYOUT_SURROUND or CH_BACK_CENTER); - CH_LAYOUT_2_2 = (CH_LAYOUT_STEREO or CH_SIDE_LEFT or CH_SIDE_RIGHT); -{$IFEND} - CH_LAYOUT_QUAD = (CH_LAYOUT_STEREO or CH_BACK_LEFT or CH_BACK_RIGHT); - CH_LAYOUT_5POINT0 = (CH_LAYOUT_SURROUND or CH_SIDE_LEFT or CH_SIDE_RIGHT); - CH_LAYOUT_5POINT1 = (CH_LAYOUT_5POINT0 or CH_LOW_FREQUENCY); -{$IF LIBAVCODEC_VERSION >= 52025000} // >= 52.25.0 - CH_LAYOUT_5POINT0_BACK = (CH_LAYOUT_SURROUND or CH_BACK_LEFT or - CH_BACK_RIGHT); - CH_LAYOUT_5POINT1_BACK = (CH_LAYOUT_5POINT0_BACK or CH_LOW_FREQUENCY); -{$IFEND} -{$IF LIBAVCODEC_VERSION >= 52034000} // >= 52.34.0 - CH_LAYOUT_7POINT0 = (CH_LAYOUT_5POINT0 or CH_BACK_LEFT or CH_BACK_RIGHT); -{$IFEND} - CH_LAYOUT_7POINT1 = (CH_LAYOUT_5POINT1 or CH_BACK_LEFT or CH_BACK_RIGHT); -{$IF LIBAVCODEC_VERSION < 52025000} // < 52.25.0 - CH_LAYOUT_7POINT1_WIDE = (CH_LAYOUT_SURROUND or CH_LOW_FREQUENCY or - CH_BACK_LEFT or CH_BACK_RIGHT or -{$ELSE} - CH_LAYOUT_7POINT1_WIDE = (CH_LAYOUT_5POINT1_BACK or -{$IFEND} - CH_FRONT_LEFT_OF_CENTER or - CH_FRONT_RIGHT_OF_CENTER); - CH_LAYOUT_STEREO_DOWNMIX = (CH_STEREO_LEFT or CH_STEREO_RIGHT); - -{* in bytes *} - AVCODEC_MAX_AUDIO_FRAME_SIZE = 192000; // 1 second of 48khz 32bit audio - -{$IF LIBAVCODEC_VERSION <= 52056000} // <= 52.56.0 -{** - * Required number of additionally allocated bytes at the end of the input bitstream for decoding. - * This is mainly needed because some optimized bitstream readers read - * 32 or 64 bit at once and could read over the end.<br> - * 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; -{$ELSEIF LIBAVCODEC_VERSION < 52058000} // < 52.58.0 -{** - * Required number of additionally allocated bytes at the end of the input bitstream for decoding. - * The first 8 bytes are needed because some optimized bitstream readers read - * 32 or 64 bit at once and could read over the end. The remainder is to give - * decoders a reasonable amount of distance to work with before checking for - * buffer overreads.<br> - * 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 = 64; -{$ELSE} // >= 52.58.0} -{** - * Required number of additionally allocated bytes at the end of the input bitstream for decoding. - * This is mainly needed because some optimized bitstream readers read - * 32 or 64 bit at once and could read over the end.<br> - * 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; -{$IFEND} - -{** - * minimum encoding buffer size. - * Used to avoid some checks during header writing. - *} - FF_MIN_BUFFER_SIZE = 16384; - -type -{* - * motion estimation type. - *} - TMotion_Est_ID = ( - ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed - ME_FULL, - ME_LOG, - ME_PHODS, - ME_EPZS, ///< enhanced predictive zonal search - ME_X1, ///< reserved for experiments - ME_HEX, ///< hexagon based search - ME_UMH, ///< uneven multi-hexagon search - ME_ITER, ///< iterative search - ME_TESA ///< transformed exhaustive search algorithm - ); - - TAVDiscard = ( - {* We leave some space between them for extensions (drop some - * keyframes for intra-only or drop just some bidir frames). - *} - AVDISCARD_NONE = -16, ///< discard nothing - AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi - AVDISCARD_NONREF = 8, ///< discard all non reference - AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames - AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes - AVDISCARD_ALL = 48 ///< discard all - ); - -{$IF LIBAVCODEC_VERSION >= 52028000} // >= 52.28.0 - TAVColorPrimaries = ( - AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B - AVCOL_PRI_UNSPECIFIED = 2, - AVCOL_PRI_BT470M = 4, - AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM - AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC - AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above - AVCOL_PRI_FILM = 8, - AVCOL_PRI_NB ///< Not part of ABI - ); - - TAVColorTransferCharacteristic = ( - AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 - 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_TRC_NB ///< Not part of ABI - ); - - TAVColorSpace = ( - AVCOL_SPC_RGB = 0, - AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B - AVCOL_SPC_UNSPECIFIED = 2, - 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_NB ///< Not part of ABI - ); - - TAVColorRange = ( - AVCOL_RANGE_UNSPECIFIED = 0, - AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges - AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges - AVCOL_RANGE_NB ///< Not part of ABI - ); - -(** - * X X 3 4 X X are luma samples, - * 1 2 1-6 are possible chroma positions - * X X 5 6 X 0 is undefined/unknown position - *) - TAVChromaLocation = ( - AVCHROMA_LOC_UNSPECIFIED = 0, - AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4, h264 default - AVCHROMA_LOC_CENTER = 2, ///< mpeg1, jpeg, h263 - AVCHROMA_LOC_TOPLEFT = 3, ///< DV - AVCHROMA_LOC_TOP = 4, - AVCHROMA_LOC_BOTTOMLEFT = 5, - AVCHROMA_LOC_BOTTOM = 6, - AVCHROMA_LOC_NB ///< Not part of ABI - ); -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52083000} // >= 52.83.0 -(** - * LPC analysis type - *) - TAVLPCType = ( - AV_LPC_TYPE_DEFAULT = -1, ///< use the codec default LPC type - AV_LPC_TYPE_NONE = 0, ///< do not use LPC prediction or use all zero coefficients - AV_LPC_TYPE_FIXED = 1, ///< fixed LPC coefficients - AV_LPC_TYPE_LEVINSON = 2, ///< Levinson-Durbin recursion - AV_LPC_TYPE_CHOLESKY = 3, ///< Cholesky factorization - AV_LPC_TYPE_NB ///< Not part of ABI - ); -{$IFEND} - - PRcOverride = ^TRcOverride; - TRcOverride = record {16} - start_frame: cint; - end_frame: cint; - qscale: cint; // if this is 0 then quality_factor will be used instead - quality_factor: cfloat; - end; - -const - FF_MAX_B_FRAMES = 16; - -{* encoding support - These flags can be passed in AVCodecContext.flags before initialization. - Note: Not everything is supported yet. -*} - - CODEC_FLAG_QSCALE = $0002; ///< Use fixed qscale. - CODEC_FLAG_4MV = $0004; ///< 4 MV per MB allowed / advanced prediction for H263. - CODEC_FLAG_QPEL = $0010; ///< use qpel MC. - CODEC_FLAG_GMC = $0020; ///< use GMC. - CODEC_FLAG_MV0 = $0040; ///< always try a MB with MV=<0,0>. - CODEC_FLAG_PART = $0080; ///< Use data partitioning. - {** - * The parent program guarantees that the input for B-frames containing - * streams is not written to for at least s->max_b_frames+1 frames, if - * this is not set the input will be copied. - *} - CODEC_FLAG_INPUT_PRESERVED = $0100; - CODEC_FLAG_PASS1 = $0200; ///< use internal 2pass ratecontrol in first pass mode - CODEC_FLAG_PASS2 = $0400; ///< use internal 2pass ratecontrol in second pass mode - CODEC_FLAG_EXTERN_HUFF = $1000; ///< use external huffman table (for mjpeg) - CODEC_FLAG_GRAY = $2000; ///< only decode/encode grayscale - CODEC_FLAG_EMU_EDGE = $4000; ///< don't draw edges - CODEC_FLAG_PSNR = $8000; ///< error[?] variables will be set during encoding - CODEC_FLAG_TRUNCATED = $00010000; //** input bitstream might be truncated at a random location instead - // of only at frame boundaries */ - CODEC_FLAG_NORMALIZE_AQP = $00020000; ///< normalize adaptive quantization - CODEC_FLAG_INTERLACED_DCT = $00040000; ///< use interlaced dct - CODEC_FLAG_LOW_DELAY = $00080000; ///< force low delay - CODEC_FLAG_ALT_SCAN = $00100000; ///< use alternate scan - {$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 - CODEC_FLAG_TRELLIS_QUANT = $00200000; ///< use trellis quantization - {$IFEND} - CODEC_FLAG_GLOBAL_HEADER = $00400000; ///< place global headers in extradata instead of every keyframe - CODEC_FLAG_BITEXACT = $00800000; ///< use only bitexact stuff (except (i)dct) - {* Fx : Flag for h263+ extra options *} - {$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 - CODEC_FLAG_H263P_AIC = $01000000; ///< H263 Advanced intra coding / MPEG4 AC prediction (remove this) - {$IFEND} - CODEC_FLAG_AC_PRED = $01000000; ///< H263 Advanced intra coding / MPEG4 AC prediction - CODEC_FLAG_H263P_UMV = $02000000; ///< Unlimited motion vector - CODEC_FLAG_CBP_RD = $04000000; ///< use rate distortion optimization for cbp - CODEC_FLAG_QP_RD = $08000000; ///< use rate distortion optimization for qp selectioon - CODEC_FLAG_H263P_AIV = $00000008; ///< H263 Alternative inter vlc - CODEC_FLAG_OBMC = $00000001; ///< OBMC - CODEC_FLAG_LOOP_FILTER = $00000800; ///< loop filter - CODEC_FLAG_H263P_SLICE_STRUCT = $10000000; - CODEC_FLAG_INTERLACED_ME = $20000000; ///< interlaced motion estimation - CODEC_FLAG_SVCD_SCAN_OFFSET = $40000000; ///< will reserve space for SVCD scan offset user data - CODEC_FLAG_CLOSED_GOP = $80000000; - CODEC_FLAG2_FAST = $00000001; ///< allow non spec compliant speedup tricks - 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_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 - CODEC_FLAG2_8X8DCT = $00000080; ///< H.264 high profile 8x8 transform - 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 - {$IF LIBAVCODEC_VERSION >= 52043000} // >= 52.43.0 - CODEC_FLAG2_MBTREE = $00040000; ///< Use macroblock tree ratecontrol (x264 only) - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52061000} // >= 52.61.0 - CODEC_FLAG2_PSY = $00080000; ///< Use psycho visual optimizations. - CODEC_FLAG2_SSIM = $00100000; ///< Compute SSIM during encoding, error[] values are undefined. - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52067000} // >= 52.67.0 - CODEC_FLAG2_INTRA_REFRESH = $00200000; ///< Use periodic insertion of intra blocks instead of keyframes. - {$IFEND} - -(* Unsupported options : - * Syntax Arithmetic coding (SAC) - * Reference Picture Selection - * Independant Segment Decoding *) -(* /Fx *) -(* codec capabilities *) - - CODEC_CAP_DRAW_HORIZ_BAND = $0001; ///< decoder can use draw_horiz_band callback - (** - * Codec uses get_buffer() for allocating buffers and supports custom allocators. - * If not set, it might not use get_buffer() at all or use operations that - * assume the buffer was allocated by avcodec_default_get_buffer. - *) - CODEC_CAP_DR1 = $0002; - (* if 'parse_only' field is true, then avcodec_parse_frame() can be used *) - CODEC_CAP_PARSE_ONLY = $0004; - 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 - *) - CODEC_CAP_DELAY = $0020; - (** - * Codec can be fed a final frame with a smaller size. - * This can be used to prevent truncation of the last audio samples. - *) - CODEC_CAP_SMALL_LAST_FRAME = $0040; - - (** - * Codec can export data for HW decoding (VDPAU). - *) - CODEC_CAP_HWACCEL_VDPAU = $0080; - - {$IF LIBAVCODEC_VERSION >= 52035000} // >= 52.35.0 - (** - * Codec can output multiple frames per AVPacket - * Normally demuxers return one frame at a time, demuxers which do not do - * are connected to a parser to split what they return into proper frames. - * This flag is reserved to the very rare category of codecs which have a - * bitstream that cannot be split into frames without timeconsuming - * operations like full decoding. Demuxers carring such bitstreams thus - * may return multiple frames in a packet. This has many disadvantages like - * prohibiting stream copy in many cases thus it should only be considered - * as a last resort. - *) - CODEC_CAP_SUBFRAMES = $0100; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52071000} // >= 52.71.0 - (** - * Codec is experimental and is thus avoided in favor of non experimental - * encoders - *) - CODEC_CAP_EXPERIMENTAL = $0200; - {$IFEND} - - //the following defines may change, don't expect compatibility if you use them - MB_TYPE_INTRA4x4 = $001; - MB_TYPE_INTRA16x16 = $002; //FIXME h264 specific - MB_TYPE_INTRA_PCM = $004; //FIXME h264 specific - MB_TYPE_16x16 = $008; - MB_TYPE_16x8 = $010; - MB_TYPE_8x16 = $020; - MB_TYPE_8x8 = $040; - MB_TYPE_INTERLACED = $080; - MB_TYPE_DIRECT2 = $100; //FIXME - MB_TYPE_ACPRED = $200; - MB_TYPE_GMC = $400; - MB_TYPE_SKIP = $800; - MB_TYPE_P0L0 = $1000; - MB_TYPE_P1L0 = $2000; - MB_TYPE_P0L1 = $4000; - MB_TYPE_P1L1 = $8000; - MB_TYPE_L0 = (MB_TYPE_P0L0 or MB_TYPE_P1L0); - MB_TYPE_L1 = (MB_TYPE_P0L1 or MB_TYPE_P1L1); - MB_TYPE_L0L1 = (MB_TYPE_L0 or MB_TYPE_L1); - MB_TYPE_QUANT = $0010000; - MB_TYPE_CBP = $0020000; - //Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...) - -type -(** - * Pan Scan area. - * This specifies the area which should be displayed. - * Note there may be multiple such areas for one frame. - *) - PAVPanScan = ^TAVPanScan; - TAVPanScan = record {24} - (*** id. - * - encoding: set by user. - * - decoding: set by libavcodec. *) - id: cint; - - (*** width and height in 1/16 pel - * - encoding: set by user. - * - decoding: set by libavcodec. *) - width: cint; - height: cint; - - (*** position of the top left corner in 1/16 pel for up to 3 fields/frames. - * - encoding: set by user. - * - decoding: set by libavcodec. *) - position: array [0..2] of array [0..1] of smallint; - end; - -const - FF_QSCALE_TYPE_MPEG1 = 0; - FF_QSCALE_TYPE_MPEG2 = 1; - FF_QSCALE_TYPE_H264 = 2; - {$IF LIBAVCODEC_VERSION >= 52049000} // >= 52.49.0 - FF_QSCALE_TYPE_VP56 = 3; - {$IFEND} - - FF_BUFFER_TYPE_INTERNAL = 1; - FF_BUFFER_TYPE_USER = 2; ///< Direct rendering buffers (image is (de)allocated by user) - 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. - - - FF_I_TYPE = 1; ///< Intra - FF_P_TYPE = 2; ///< Predicted - FF_B_TYPE = 3; ///< Bi-dir predicted - FF_S_TYPE = 4; ///< S(GMC)-VOP MPEG4 - FF_SI_TYPE = 5; ///< Switching Intra - FF_SP_TYPE = 6; ///< Switching Predicted - FF_BI_TYPE = 7; - - FF_BUFFER_HINTS_VALID = $01; // Buffer hints value is meaningful (if 0 ignore) - FF_BUFFER_HINTS_READABLE = $02; // Codec will read from buffer - FF_BUFFER_HINTS_PRESERVE = $04; // User must not alter buffer content - FF_BUFFER_HINTS_REUSABLE = $08; // Codec will reuse the buffer (update) - -const - {$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 - DEFAULT_FRAME_RATE_BASE = 1001000; - {$IFEND} - - FF_ASPECT_EXTENDED = 15; - - FF_RC_STRATEGY_XVID = 1; - - FF_BUG_AUTODETECT = 1; ///< autodetection - FF_BUG_OLD_MSMPEG4 = 2; - FF_BUG_XVID_ILACE = 4; - FF_BUG_UMP4 = 8; - FF_BUG_NO_PADDING = 16; - FF_BUG_AMV = 32; - FF_BUG_AC_VLC = 0; ///< will be removed, libavcodec can now handle these non compliant files by default - FF_BUG_QPEL_CHROMA = 64; - FF_BUG_STD_QPEL = 128; - FF_BUG_QPEL_CHROMA2 = 256; - FF_BUG_DIRECT_BLOCKSIZE = 512; - FF_BUG_EDGE = 1024; - FF_BUG_HPEL_CHROMA = 2048; - FF_BUG_DC_CLIP = 4096; - FF_BUG_MS = 8192; ///< workaround various bugs in microsofts broken decoders - {$IF LIBAVCODEC_VERSION >= 52054000} // >= 52.54.0 - FF_BUG_TRUNCATED = 16384; - {$IFEND} - //FF_BUG_FAKE_SCALABILITY = 16 //Autodetection should work 100%. - - 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 LIBAVCODEC_VERSION_MAJOR < 53} // < 53 - FF_COMPLIANCE_INOFFICIAL = -1; ///< Allow inofficial extensions - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52079001} // >= 52.79.1 - FF_COMPLIANCE_UNOFFICIAL = -1; ///< Allow unofficial extensions - {$IFEND} - - FF_COMPLIANCE_EXPERIMENTAL = -2; ///< allow non standarized experimental things - - FF_ER_CAREFUL = 1; - FF_ER_COMPLIANT = 2; - FF_ER_AGGRESSIVE = 3; - FF_ER_VERY_AGGRESSIVE = 4; - - FF_DCT_AUTO = 0; - FF_DCT_FASTINT = 1; - FF_DCT_INT = 2; - FF_DCT_MMX = 3; - FF_DCT_MLIB = 4; - FF_DCT_ALTIVEC = 5; - FF_DCT_FAAN = 6; - - FF_IDCT_AUTO = 0; - FF_IDCT_INT = 1; - FF_IDCT_SIMPLE = 2; - FF_IDCT_SIMPLEMMX = 3; - FF_IDCT_LIBMPEG2MMX = 4; - FF_IDCT_PS2 = 5; - FF_IDCT_MLIB = 6; - FF_IDCT_ARM = 7; - FF_IDCT_ALTIVEC = 8; - FF_IDCT_SH4 = 9; - FF_IDCT_SIMPLEARM = 10; - FF_IDCT_H264 = 11; - FF_IDCT_VP3 = 12; - FF_IDCT_IPP = 13; - FF_IDCT_XVIDMMX = 14; - FF_IDCT_CAVS = 15; - FF_IDCT_SIMPLEARMV5TE= 16; - FF_IDCT_SIMPLEARMV6 = 17; - FF_IDCT_SIMPLEVIS = 18; - FF_IDCT_WMV2 = 19; - FF_IDCT_FAAN = 20; - FF_IDCT_EA = 21; - FF_IDCT_SIMPLENEON = 22; - FF_IDCT_SIMPLEALPHA = 23; - {$IF LIBAVCODEC_VERSION >= 52055000} // >= 52.55.0 - FF_IDCT_BINK = 24; - {$IFEND} - - FF_EC_GUESS_MVS = 1; - FF_EC_DEBLOCK = 2; - - FF_MM_FORCE = $80000000; (* force usage of selected flags (OR) *) - (* lower 16 bits - CPU features *) - FF_MM_MMX = $0001; ///< standard MMX - FF_MM_3DNOW = $0004; ///< AMD 3DNOW - {$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} - FF_MM_MMXEXT = $0002; ///< SSE integer functions or AMD MMX ext - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52024000} // >= 52.24.0 - FF_MM_MMX2 = $0002; ///< SSE integer functions or AMD MMX ext - {$IFEND} - FF_MM_SSE = $0008; ///< SSE functions - FF_MM_SSE2 = $0010; ///< PIV SSE2 functions - {$IF LIBAVCODEC_VERSION >= 52084000} // >= 52.84.0 - FF_MM_SSE2SLOW = $40000000; ///< SSE2 supported, but usually not faster - ///< than regular MMX/SSE (e.g. Core1) - {$IFEND} - FF_MM_3DNOWEXT = $0020; ///< AMD 3DNowExt - FF_MM_SSE3 = $0040; ///< Prescott SSE3 functions - {$IF LIBAVCODEC_VERSION >= 52084000} // >= 52.84.0 - FF_MM_SSE3SLOW = $20000000; ///< SSE3 supported, but usually not faster - ///< than regular MMX/SSE (e.g. Core1) - {$IFEND} - FF_MM_SSSE3 = $0080; ///< Conroe SSSE3 functions - {$IF LIBAVCODEC_VERSION >= 52022003} // >= 52.22.3 - FF_MM_SSE4 = $0100; ///< Penryn SSE4.1 functions - FF_MM_SSE42 = $0200; ///< Nehalem SSE4.2 functions - {$IFEND} - FF_MM_IWMMXT = $0100; ///< XScale IWMMXT - FF_MM_ALTIVEC = $0001; ///< standard AltiVec - - FF_PRED_LEFT = 0; - FF_PRED_PLANE = 1; - FF_PRED_MEDIAN = 2; - - FF_DEBUG_PICT_INFO = 1; - FF_DEBUG_RC = 2; - FF_DEBUG_BITSTREAM = 4; - FF_DEBUG_MB_TYPE = 8; - FF_DEBUG_QP = 16; - FF_DEBUG_MV = 32; - FF_DEBUG_DCT_COEFF = $00000040; - FF_DEBUG_SKIP = $00000080; - FF_DEBUG_STARTCODE = $00000100; - FF_DEBUG_PTS = $00000200; - FF_DEBUG_ER = $00000400; - FF_DEBUG_MMCO = $00000800; - FF_DEBUG_BUGS = $00001000; - FF_DEBUG_VIS_QP = $00002000; - FF_DEBUG_VIS_MB_TYPE = $00004000; - FF_DEBUG_BUFFERS = $00008000; - - FF_DEBUG_VIS_MV_P_FOR = $00000001; //visualize forward predicted MVs of P frames - FF_DEBUG_VIS_MV_B_FOR = $00000002; //visualize forward predicted MVs of B frames - FF_DEBUG_VIS_MV_B_BACK = $00000004; //visualize backward predicted MVs of B frames - - FF_CMP_SAD = 0; - FF_CMP_SSE = 1; - FF_CMP_SATD = 2; - FF_CMP_DCT = 3; - FF_CMP_PSNR = 4; - FF_CMP_BIT = 5; - FF_CMP_RD = 6; - FF_CMP_ZERO = 7; - FF_CMP_VSAD = 8; - FF_CMP_VSSE = 9; - FF_CMP_NSSE = 10; - FF_CMP_W53 = 11; - FF_CMP_W97 = 12; - FF_CMP_DCTMAX = 13; - FF_CMP_DCT264 = 14; - FF_CMP_CHROMA = 256; - - FF_DTG_AFD_SAME = 8; - FF_DTG_AFD_4_3 = 9; - FF_DTG_AFD_16_9 = 10; - FF_DTG_AFD_14_9 = 11; - FF_DTG_AFD_4_3_SP_14_9 = 13; - FF_DTG_AFD_16_9_SP_14_9 = 14; - FF_DTG_AFD_SP_4_3 = 15; - - FF_DEFAULT_QUANT_BIAS = 999999; - - FF_LAMBDA_SHIFT = 7; - FF_LAMBDA_SCALE = (1 shl FF_LAMBDA_SHIFT); - FF_QP2LAMBDA = 118; ///< factor to convert from H.263 QP to lambda - FF_LAMBDA_MAX = (256 * 128 - 1); - - FF_QUALITY_SCALE = FF_LAMBDA_SCALE; //FIXME maybe remove - - FF_CODER_TYPE_VLC = 0; - FF_CODER_TYPE_AC = 1; - FF_CODER_TYPE_RAW = 2; - FF_CODER_TYPE_RLE = 3; - FF_CODER_TYPE_DEFLATE = 4; - - SLICE_FLAG_CODED_ORDER = $0001; ///< draw_horiz_band() is called in coded order instead of display - SLICE_FLAG_ALLOW_FIELD = $0002; ///< allow draw_horiz_band() with field slices (MPEG2 field pics) - SLICE_FLAG_ALLOW_PLANE = $0004; ///< allow draw_horiz_band() with 1 component at a time (SVQ1) - - FF_MB_DECISION_SIMPLE = 0; ///< uses mb_cmp - FF_MB_DECISION_BITS = 1; ///< chooses the one which needs the fewest bits - FF_MB_DECISION_RD = 2; ///< rate distortion - - FF_AA_AUTO = 0; - FF_AA_FASTINT = 1; //not implemented yet - FF_AA_INT = 2; - FF_AA_FLOAT = 3; - - FF_PROFILE_UNKNOWN = -99; - FF_PROFILE_AAC_MAIN = 0; - FF_PROFILE_AAC_LOW = 1; - FF_PROFILE_AAC_SSR = 2; - FF_PROFILE_AAC_LTP = 3; - - FF_LEVEL_UNKNOWN = -99; - - X264_PART_I4X4 = $001; (* Analyse i4x4 *) - X264_PART_I8X8 = $002; (* Analyse i8x8 (requires 8x8 transform) *) - X264_PART_P8X8 = $010; (* Analyse p16x8, p8x16 and p8x8 *) - X264_PART_P4X4 = $020; (* Analyse p8x4, p4x8, p4x4 *) - X264_PART_B8X8 = $100; (* Analyse b16x8, b8x16 and b8x8 *) - - FF_COMPRESSION_DEFAULT = -1; - -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -const - AVPALETTE_SIZE = 1024; - AVPALETTE_COUNT = 256; - -type -(** - * AVPaletteControl - * This structure defines a method for communicating palette changes - * between and demuxer and a decoder. - * - * @deprecated Use AVPacket to send palette changes instead. - * This is totally broken. - *) - PAVPaletteControl = ^TAVPaletteControl; - TAVPaletteControl = record - (* demuxer sets this to 1 to indicate the palette has changed; - * decoder resets to 0 *) - palette_changed: cint; - - (* 4-byte ARGB palette entries, stored in native byte order; note that - * the individual palette components should be on a 8-bit scale; if - * the palette data comes from a IBM VGA native format, the component - * data is probably 6 bits in size and needs to be scaled *) - palette: array [0..AVPALETTE_COUNT - 1] of cuint; - end; {deprecated;} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52023000} // >= 52.23.0 -type - PAVPacket = ^TAVPacket; - TAVPacket = record -(* - * Presentation timestamp in AVStream->time_base units; the time at which - * the decompressed packet will be presented to the user. - * Can be AV_NOPTS_VALUE if it is not stored in the file. - * pts MUST be larger or equal to dts as presentation cannot happen before - * decompression, unless one wants to view hex dumps. Some formats misuse - * the terms dts and pts/cts to mean something different. Such timestamps - * must be converted to true pts/dts before they are stored in AVPacket. - *) - pts: cint64; -(* - * Decompression timestamp in AVStream->time_base units; the time at which - * the packet is decompressed. - * Can be AV_NOPTS_VALUE if it is not stored in the file. - *) - dts: cint64; - data: PByteArray; - size: cint; - stream_index: cint; - flags: cint; -(* - * Duration of this packet in AVStream->time_base units, 0 if unknown. - * Equals next_pts - this_pts in presentation order. - *) - duration: cint; - destruct: procedure (para1: PAVPacket); cdecl; - priv: pointer; - pos: cint64; // byte position in stream, -1 if unknown - -(* - * Time difference in AVStream->time_base units from the pts of this - * packet to the point at which the output from the decoder has converged - * independent from the availability of previous frames. That is, the - * frames are virtually identical no matter if decoding started from - * the very first frame or from this keyframe. - * Is AV_NOPTS_VALUE if unknown. - * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY - * set. - * - * The purpose of this field is to allow seeking in streams that have no - * keyframes in the conventional sense. It corresponds to the - * recovery point SEI in H.264 and match_time_delta in NUT. It is also - * essential for some types of subtitle streams to ensure that all - * subtitles are correctly displayed after seeking. - *) - convergence_duration: cint64; - end; - -const - {$IF LIBAVCODEC_VERSION < 52030002} // < 52.30.2 - PKT_FLAG_KEY = $0001; - {$ELSE} - AV_PKT_FLAG_KEY = $0001; - {$IF LIBAVCODEC_VERSION_MAJOR < 53} - PKT_FLAG_KEY = AV_PKT_FLAG_KEY; - {$IFEND} - {$IFEND} -{$IFEND} - -type - PAVClass = ^TAVClass; {const} - PAVCodecContext = ^TAVCodecContext; - - PAVCodec = ^TAVCodec; - -{$IF LIBAVCODEC_VERSION >= 52018000} // >= 52.18.0 - PAVHWAccel = ^TAVHWAccel; -{$IFEND} - - // int[4] - PQuadIntArray = ^TQuadIntArray; - TQuadIntArray = array [0..3] of cint; - // int (*func)(struct AVCodecContext *c2, void *arg) - TExecuteFunc = function(c2: PAVCodecContext; arg: Pointer): cint; cdecl; -{$IF LIBAVCODEC_VERSION >= 52037000} // >= 52.37.0 - // int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr) - TExecute2Func = function(c2: PAVCodecContext; arg: Pointer; jobnr: cint; threadnr: cint): cint; cdecl; -{$IFEND} - - TAVClass = record - class_name: PAnsiChar; - (* actually passing a pointer to an AVCodecContext - or AVFormatContext, which begin with an AVClass. - Needed because av_log is in libavcodec and has no visibility - of AVIn/OutputFormat *) - item_name: function(): PAnsiChar; cdecl; - option: PAVOption; - -{$IF LIBAVUTIL_VERSION >= 50015000} // 50.15.0 - (** - * 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; -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 50015002} // 50.15.2 - (** - * Offset in the structure where log_level_offset is stored. - * 0 means there is no such variable - *) - log_level_offset_offset: cint; -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 50015003} // 50.15.3 - (** - * 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; -{$IFEND} - end; - - {** - * 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*. - *} - PAVFrame = ^TAVFrame; - TAVFrame = record {200} - (** - * pointer to the picture planes. - * This might be different from the first allocated byte - * - encoding: - * - decoding: - *) - data: array [0..3] of pbyte; - linesize: array [0..3] 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; - (** - * 1 -> keyframe, 0-> not - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - key_frame: cint; - (** - * Picture type of the frame, see ?_TYPE below. - * - encoding: Set by libavcodec. for coded_picture (and set by user for input). - * - decoding: Set by libavcodec. - *) - pict_type: cint; - (** - * presentation timestamp in time_base units (time when frame should be shown to user) - * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed. - * - encoding: MUST be set by user. - * - decoding: Set by libavcodec. - *) - pts: cint64; - (** - * picture number in bitstream order - * - encoding: set by - * - decoding: Set by libavcodec. - *) - coded_picture_number: cint; - (** - * picture number in display order - * - encoding: set by - * - decoding: Set by libavcodec. - *) - display_picture_number: cint; - (** - * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) - * - encoding: Set by libavcodec. for coded_picture (and set by user for input). - * - decoding: Set by libavcodec. - *) - quality: cint; - (** - * 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(). - *) - age: cint; - (** - * is this picture used as reference - * The values for this are the same as the MpegEncContext.picture_structure - * variable, that is 1->top field, 2->bottom field, 3->frame/both fields. - * Set to 4 for delayed, non-reference frames. - * - encoding: unused - * - decoding: Set by libavcodec. (before get_buffer() call)). - *) - reference: cint; - (** - * QP table - * - encoding: unused - * - decoding: Set by libavcodec. - *) - qscale_table: PShortint; - (** - * QP store stride - * - encoding: unused - * - decoding: Set by libavcodec. - *) - qstride: cint; - (** - * mbskip_table[mb]>=1 if MB didn't change - * stride= mb_width = (width+15)>>4 - * - encoding: unused - * - decoding: Set by libavcodec. - *) - mbskip_table: pbyte; - (** - * motion vector table - * @code - * example: - * int mv_sample_log2= 4 - motion_subsample_log2; - * int mb_width= (width+15)>>4; - * int mv_stride= (mb_width << mv_sample_log2) + 1; - * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y]; - * @endcode - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - //int16_t (*motion_val[2])[2]; - motion_val: array [0..1] of pointer; - (** - * macroblock type table - * mb_type_base + mb_width + 2 - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - mb_type: PCuint; - (** - * log2 of the size of the block which a single vector in motion_val represents: - * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2) - * - encoding: unused - * - decoding: Set by libavcodec. - *) - motion_subsample_log2: byte; - (** - * for some private data of the user - * - encoding: unused - * - decoding: Set by user. - *) - opaque: pointer; - (** - * error - * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR. - * - decoding: unused - *) - error: array [0..3] of cuint64; - (** - * type of the buffer (to keep track of who has to deallocate data[*]) - * - encoding: Set by the one who allocates it. - * - decoding: Set by the one who allocates it. - * Note: User allocated (direct rendering) & internal buffers cannot coexist currently. - *) - type_: cint; - (** - * When decoding, this signals how much the picture must be delayed. - * extra_delay = repeat_pict / (2*fps) - * - encoding: unused - * - decoding: Set by libavcodec. - *) - repeat_pict: cint; - (** - * - *) - qscale_type: cint; - (** - * The content of the picture is interlaced. - * - encoding: Set by user. - * - decoding: Set by libavcodec. (default 0) - *) - interlaced_frame: cint; - (** - * If the content is interlaced, is top field displayed first. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - top_field_first: cint; - (** - * Pan scan. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - pan_scan: PAVPanScan; - (** - * Tell user application that palette has changed from previous frame. - * - encoding: ??? (no palette-enabled encoder yet) - * - decoding: Set by libavcodec. (default 0). - *) - palette_has_changed: cint; - (** - * codec suggestion on buffer type if != 0 - * - encoding: unused - * - decoding: Set by libavcodec. (before get_buffer() call)). - *) - buffer_hints: cint; - (** - * DCT coefficients - * - encoding: unused - * - decoding: Set by libavcodec. - *) - dct_coeff: PsmallInt; - (** - * motion reference frame index - * the order in which these are stored can depend on the codec. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - ref_index: array [0..1] of PShortint; - - {$IF LIBAVCODEC_VERSION >= 51068000} // >= 51.68.0 - (** - * reordered opaque 64bit number (generally a PTS) from AVCodecContext.reordered_opaque - * output in AVFrame.reordered_opaque - * - encoding: unused - * - decoding: Read by user. - *) - reordered_opaque: cint64; - {$IFEND} - - {$IF LIBAVCODEC_VERSION = 52021000} // = 52.21.0 - (** - * hardware accelerator private data (FFmpeg allocated) - * - encoding: unused - * - decoding: Set by libavcodec - *) - hwaccel_data_private: pointer; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52022000} // >= 52.22.0 - hwaccel_picture_private: pointer; - {$IFEND} - - end; - - (** - * 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. - * sizeof(AVCodecContext) must not be used outside libav*. - *) - TAVCodecContext = record {720} - (** - * information on struct for av_log - * - set by avcodec_alloc_context - *) - av_class: PAVClass; - (** - * the average bitrate - * - encoding: Set by user; unused for constant quantizer encoding. - * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the stream. - *) - bit_rate: cint; - - (** - * number of bits the bitstream is allowed to diverge from the reference. - * the reference can be CBR (for CBR pass1) or VBR (for pass2) - * - encoding: Set by user; unused for constant quantizer encoding. - * - decoding: unused - *) - bit_rate_tolerance: cint; - - (** - * CODEC_FLAG_*. - * - encoding: Set by user. - * - decoding: Set by user. - *) - flags: cint; - - (** - * 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. - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. (FIXME: Is this OK?) - *) - sub_id: cint; - - (** - * Motion estimation algorithm used for video coding. - * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex), - * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific] - * - encoding: MUST be set by user. - * - decoding: unused - *) - me_method: cint; - - (** - * some codecs need / can use extradata like Huffman tables. - * mjpeg: Huffman tables - * rv10: additional flags - * mpeg4: global headers (they can be in the bitstream or here) - * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger - * than extradata_size to avoid prolems if it is read with the bitstream reader. - * The bytewise contents of extradata must not depend on the architecture or CPU endianness. - * - encoding: Set/allocated/freed by libavcodec. - * - decoding: Set/allocated/freed by user. - *) - extradata: pbyte; - extradata_size: cint; - - (** - * This is the fundamental unit of time (in seconds) in terms - * of which frame timestamps are represented. For fixed-fps content, - * timebase should be 1/framerate and timestamp increments should be - * identically 1. - * - encoding: MUST be set by user. - * - decoding: Set by libavcodec. - *) - time_base: TAVRational; - - (* video only *) - (** - * picture width / height. - * - encoding: MUST be set by user. - * - decoding: Set by libavcodec. - * Note: For compatibility it is possible to set this instead of - * coded_width/height before decoding. - *) - width, height: cint; - - (** - * the number of pictures in a group of pictures, or 0 for intra_only - * - encoding: Set by user. - * - decoding: unused - *) - gop_size: cint; - - (** - * Pixel format, see PIX_FMT_xxx. - * May be set by the demuxer if known from headers. - * May be overriden by the decoder if it knows better. - * - encoding: Set by user. - * - decoding: Set by user if known, overridden by libavcodec if known - *) - pix_fmt: TAVPixelFormat; - - (** - * 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; - - (** - * If non NULL, 'draw_horiz_band' is called by the libavcodec - * decoder to draw a horizontal band. It improves cache usage. Not - * all codecs can do that. You must check the codec capabilities - * beforehand. - * The function is also used by hardware acceleration APIs. - * It is called at least once during frame decoding to pass - * the data needed for hardware render. - * In that mode instead of pixel data, AVFrame points to - * a structure specific to the acceleration API. The application - * reads the structure and can change some fields to indicate progress - * or mark state. - * - encoding: unused - * - decoding: Set by user. - * @param height the height of the slice - * @param y the y position of the slice - * @param type 1->top field, 2->bottom field, 3->frame - * @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; - y: cint; type_: cint; height: cint); cdecl; - - (* audio only *) - sample_rate: cint; ///< samples per second - channels: cint; ///< number of audio channels - - (** - * audio sample format - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - sample_fmt: TSampleFormat; ///< sample format - - (* The following data should not be initialized. *) - (** - * Samples per packet, initialized when calling 'init'. - *) - 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 - *) - delay: cint; - - (* - encoding parameters *) - qcompress: cfloat; ///< amount of qscale change between easy & hard scenes (0.0-1.0) - qblur: cfloat; ///< amount of qscale smoothing over time (0.0-1.0) - - (** - * minimum quantizer - * - encoding: Set by user. - * - decoding: unused - *) - qmin: cint; - - (** - * maximum quantizer - * - encoding: Set by user. - * - decoding: unused - *) - qmax: cint; - - (** - * maximum quantizer difference between frames - * - encoding: Set by user. - * - decoding: unused - *) - max_qdiff: cint; - - (** - * maximum number of B-frames between non-B-frames - * Note: The output will be delayed by max_b_frames+1 relative to the input. - * - encoding: Set by user. - * - decoding: unused - *) - max_b_frames: cint; - - (** - * qscale factor between IP and B-frames - * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). - * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). - * - encoding: Set by user. - * - decoding: unused - *) - b_quant_factor: cfloat; - - (** obsolete FIXME remove *) - rc_strategy: cint; - - b_frame_strategy: cint; - - (** - * 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; - - codec: PAVCodec; - - priv_data: pointer; - - {$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 - (* unused, FIXME remove*) - rtp_mode: cint; - {$IFEND} - - rtp_payload_size: cint; (* The size of the RTP payload: the coder will *) - (* do it's best to deliver a chunk with size *) - (* below rtp_payload_size, the chunk will start *) - (* with a start code on some codecs like H.263 *) - (* This doesn't take account of any particular *) - (* headers inside the transmited RTP payload *) - - - (* The RTP callback: This function is called *) - (* every time the encoder has a packet to send *) - (* Depends on the encoder if the data starts *) - (* with a Start Code (it should) H.263 does. *) - (* mb_nb contains the number of macroblocks *) - (* encoded in the RTP payload *) - rtp_callback: procedure (avctx: PAVCodecContext; data: pointer; - size: cint; mb_nb: cint); cdecl; - - (* statistics, used for 2-pass encoding *) - mv_bits: cint; - header_bits: cint; - i_tex_bits: cint; - p_tex_bits: cint; - i_count: cint; - p_count: cint; - skip_count: cint; - misc_bits: cint; - - (** - * number of bits used for the previously encoded frame - * - encoding: Set by libavcodec. - * - decoding: unused - *) - frame_bits: cint; - - (** - * Private data of the user, can be used to carry app specific stuff. - * - encoding: Set by user. - * - decoding: Set by user. - *) - opaque: pointer; - - codec_name: array [0..31] of AnsiChar; -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 - codec_type: TCodecType; (* see CODEC_TYPE_xxx *) -{$ELSE} - codec_type: TAVMediaType; (* see AVMEDIA_TYPE_xxx *) -{$IFEND} - codec_id: TCodecID; (* see CODEC_ID_xxx *) - - (** - * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). - * This is used to work around some encoder bugs. - * 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 - * 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. - * - encoding: Set by user, if not then the default based on codec_id will be used. - * - decoding: Set by user, will be converted to uppercase by libavcodec during init. - *) - codec_tag: cuint; - - (** - * Work around bugs in encoders which sometimes cannot be detected automatically. - * - encoding: Set by user - * - decoding: Set by user - *) - workaround_bugs: cint; - - (** - * luma single coefficient elimination threshold - * - encoding: Set by user. - * - decoding: unused - *) - luma_elim_threshold: cint; - - (** - * chroma single coeff elimination threshold - * - encoding: Set by user. - * - decoding: unused - *) - chroma_elim_threshold: cint; - - (** - * strictly follow the standard (MPEG4, ...). - * - encoding: Set by user. - * - decoding: Set by user. - * Setting this to STRICT or higher means the encoder and decoder will - * generally do stupid things, whereas setting it to unofficial or lower - * will mean the encoder might produce output that is not supported by all - * spec-compliant decoders. Decoders don't differentiate between normal, - * unofficial and experimental (that is, they always try to decode things - * when they can) unless they are explicitly asked to behave stupidly - * (=strictly conform to the specs) - *) - strict_std_compliance: cint; - - (** - * qscale offset between IP and B-frames - * - encoding: Set by user. - * - decoding: unused - *) - b_quant_offset: cfloat; - - (** - * Error recognization; 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; - - (** - * 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. - * 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. - * - encoding: unused - * - decoding: Set by libavcodec, user can override. - *) - get_buffer: function (c: PAVCodecContext; pic: PAVFrame): cint; cdecl; - - (** - * Called to release buffers which were allocated with get_buffer. - * A released buffer can be reused in get_buffer(). - * pic.data[*] must be set to NULL. - * - encoding: unused - * - decoding: Set by libavcodec, user can override. - *) - release_buffer: procedure (c: PAVCodecContext; pic: PAVFrame); cdecl; - - (** - * Size of the frame reordering buffer in the decoder. - * For MPEG-2 it is 1 IPB or 0 low delay IP. - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - has_b_frames: cint; - - (** - * number of bytes per packet if constant and known or 0 - * Used by some WAV based audio codecs. - *) - 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. *) - - (** - * 0-> h263 quant 1-> mpeg quant - * - encoding: Set by user. - * - decoding: unused - *) - mpeg_quant: cint; - - (** - * pass1 encoding statistics output buffer - * - encoding: Set by libavcodec. - * - decoding: unused - *) - stats_out: PByteArray; - - (** - * pass2 encoding statistics input buffer - * Concatenated stuff from stats_out of pass1 should be placed here. - * - encoding: Allocated/set/freed by user. - * - decoding: unused - *) - stats_in: PByteArray; - - (** - * ratecontrol qmin qmax limiting method - * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax. - * - encoding: Set by user. - * - decoding: unused - *) - rc_qsquish: cfloat; - - rc_qmod_amp: cfloat; - rc_qmod_freq: cint; - - (** - * ratecontrol override, see RcOverride - * - encoding: Allocated/set/freed by user. - * - decoding: unused - *) - rc_override: PRcOverride; - rc_override_count: cint; - - (** - * rate control equation - * - encoding: Set by user - * - decoding: unused - *) - rc_eq: {const} PByteArray; - - (** - * maximum bitrate - * - encoding: Set by user. - * - decoding: unused - *) - rc_max_rate: cint; - - (** - * minimum bitrate - * - encoding: Set by user. - * - decoding: unused - *) - rc_min_rate: cint; - - (** - * decoder bitstream buffer size - * - encoding: Set by user. - * - decoding: unused - *) - rc_buffer_size: cint; - rc_buffer_aggressivity: cfloat; - - (** - * qscale factor between P and I-frames - * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset). - * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). - * - encoding: Set by user. - * - decoding: unused - *) - i_quant_factor: cfloat; - - (** - * qscale offset between P and I-frames - * - encoding: Set by user. - * - decoding: unused - *) - i_quant_offset: cfloat; - - (** - * initial complexity for pass1 ratecontrol - * - encoding: Set by user. - * - decoding: unused - *) - rc_initial_cplx: cfloat; - - (** - * DCT algorithm, see FF_DCT_* below - * - encoding: Set by user. - * - decoding: unused - *) - dct_algo: cint; - - (** - * luminance masking (0-> disabled) - * - encoding: Set by user. - * - decoding: unused - *) - lumi_masking: cfloat; - - (** - * temporary complexity masking (0-> disabled) - * - encoding: Set by user. - * - decoding: unused - *) - temporal_cplx_masking: cfloat; - - (** - * spatial complexity masking (0-> disabled) - * - encoding: Set by user. - * - decoding: unused - *) - spatial_cplx_masking: cfloat; - - (** - * p block masking (0-> disabled) - * - encoding: Set by user. - * - decoding: unused - *) - p_masking: cfloat; - - (** - * darkness masking (0-> disabled) - * - encoding: Set by user. - * - decoding: unused - *) - dark_masking: cfloat; - - {$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 - (* for binary compatibility *) - unused: cint; - {$IFEND} - - (** - * IDCT algorithm, see FF_IDCT_* below. - * - encoding: Set by user. - * - decoding: Set by user. - *) - idct_algo: cint; - - (** - * slice count - * - encoding: Set by libavcodec. - * - decoding: Set by user (or 0). - *) - slice_count: cint; - - (** - * slice offsets in the frame in bytes - * - encoding: Set/allocated by libavcodec. - * - decoding: Set/allocated by user (or NULL). - *) - slice_offset: PCint; - - (** - * error concealment flags - * - encoding: unused - * - decoding: Set by user. - *) - error_concealment: cint; - - (** - * dsp_mask could be add used to disable unwanted CPU features - * CPU features (i.e. MMX, SSE. ...) - * - * With the FORCE flag you may instead enable given CPU features. - * (Dangerous: Usable in case of misdetection, improper usage however will - * result into program crash.) - *) - dsp_mask: cuint; - - (** - * bits per sample/pixel from the demuxer (needed for huffyuv). - * - encoding: Set by libavcodec. - * - decoding: Set by user. - *) - bits_per_coded_sample: cint; - - (** - * prediction method (needed for huffyuv) - * - encoding: Set by user. - * - decoding: unused - *) - prediction_method: cint; - - (** - * sample aspect ratio (0 if unknown) - * That is the width of a pixel divided by the height of the pixel. - * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - sample_aspect_ratio: TAVRational; - - (** - * the picture in the bitstream - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - coded_frame: PAVFrame; - - (** - * debug - * - encoding: Set by user. - * - decoding: Set by user. - *) - debug: cint; - - (** - * debug - * - encoding: Set by user. - * - decoding: Set by user. - *) - debug_mv: cint; - - (** - * error - * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR. - * - decoding: unused - *) - error: array [0..3] of cuint64; - - (** - * minimum MB quantizer - * - encoding: unused - * - decoding: unused - *) - mb_qmin: cint; - - (** - * maximum MB quantizer - * - encoding: unused - * - decoding: unused - *) - mb_qmax: cint; - - (** - * motion estimation comparison function - * - encoding: Set by user. - * - decoding: unused - *) - me_cmp: cint; - - (** - * subpixel motion estimation comparison function - * - encoding: Set by user. - * - decoding: unused - *) - me_sub_cmp: cint; - (** - * macroblock comparison function (not supported yet) - * - encoding: Set by user. - * - decoding: unused - *) - mb_cmp: cint; - (** - * interlaced DCT comparison function - * - encoding: Set by user. - * - decoding: unused - *) - ildct_cmp: cint; - - (** - * ME diamond size & shape - * - encoding: Set by user. - * - decoding: unused - *) - dia_size: cint; - - (** - * amount of previous MV predictors (2a+1 x 2a+1 square) - * - encoding: Set by user. - * - decoding: unused - *) - last_predictor_count: cint; - - (** - * prepass for motion estimation - * - encoding: Set by user. - * - decoding: unused - *) - pre_me: cint; - - (** - * motion estimation prepass comparison function - * - encoding: Set by user. - * - decoding: unused - *) - me_pre_cmp: cint; - - (** - * ME prepass diamond size & shape - * - encoding: Set by user. - * - decoding: unused - *) - pre_dia_size: cint; - - (** - * subpel ME quality - * - encoding: Set by user. - * - decoding: unused - *) - me_subpel_quality: cint; - - (** - * callback to negotiate the pixelFormat - * @param fmt is the list of formats which are supported by the codec, - * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. - * The first is always the native one. - * @return the chosen format - * - encoding: unused - * - decoding: Set by user, if not set the native format will be chosen. - *) - get_format: function (s: PAVCodecContext; fmt: {const} PAVPixelFormat): TAVPixelFormat; cdecl; - - (** - * DTG active format information (additional aspect ratio - * information only used in DVB MPEG-2 transport streams) - * 0 if not set. - * - * - encoding: unused - * - decoding: Set by decoder. - *) - dtg_active_format: cint; - - (** - * maximum motion estimation search range in subpel units - * If 0 then no limit. - * - * - encoding: Set by user. - * - decoding: unused - *) - me_range: cint; - - (** - * intra quantizer bias - * - encoding: Set by user. - * - decoding: unused - *) - intra_quant_bias: cint; - - (** - * inter quantizer bias - * - encoding: Set by user. - * - decoding: unused - *) - inter_quant_bias: cint; - - (** - * color table ID - * - encoding: unused - * - decoding: Which clrtable should be used for 8bit RGB images. - * Tables have to be stored somewhere. FIXME - *) - color_table_id: cint; - - (** - * internal_buffer count - * Don't touch, used by libavcodec default_get_buffer(). - *) - internal_buffer_count: cint; - - (** - * internal_buffers - * Don't touch, used by libavcodec default_get_buffer(). - *) - internal_buffer: pointer; - - (** - * Global quality for codecs which cannot change it per frame. - * This should be proportional to MPEG-1/2/4 qscale. - * - encoding: Set by user. - * - decoding: unused - *) - global_quality: cint; - - (** - * coder type - * - encoding: Set by user. - * - decoding: unused - *) - coder_type: cint; - - (** - * context model - * - encoding: Set by user. - * - decoding: unused - *) - context_model: cint; - - { - (** - * - * - encoding: unused - * - decoding: Set by user. - *) - realloc: function (s: PAVCodecContext; buf: Pbyte; buf_size: cint): Pbyte; cdecl; - } - - (** - * slice flags - * - encoding: unused - * - decoding: Set by user. - *) - slice_flags: cint; - - (** - * XVideo Motion Acceleration - * - encoding: forbidden - * - decoding: set by decoder - *) - xvmc_acceleration: cint; - - (** - * macroblock decision mode - * - encoding: Set by user. - * - decoding: unused - *) - mb_decision: cint; - - (** - * custom intra quantization matrix - * - encoding: Set by user, can be NULL. - * - decoding: Set by libavcodec. - *) - intra_matrix: PWord; - - (** - * custom inter quantization matrix - * - encoding: Set by user, can be NULL. - * - decoding: Set by libavcodec. - *) - inter_matrix: PWord; - - (** - * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). - * This is used to work around some encoder bugs. - * - encoding: unused - * - decoding: Set by user, will be converted to uppercase by libavcodec during init. - *) - stream_codec_tag: array [0..3] of AnsiChar; //cuint; - - (** - * scene change detection threshold - * 0 is default, larger means fewer detected scene changes. - * - encoding: Set by user. - * - decoding: unused - *) - scenechange_threshold: cint; - - (** - * minimum Lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - lmin: cint; - - (** - * maximum Lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - lmax: cint; - - (** - * palette control structure - * - encoding: ??? (no palette-enabled encoder yet) - * - decoding: Set by user. - *) - palctrl: PAVPaletteControl; - - (** - * noise reduction strength - * - encoding: Set by user. - * - decoding: unused - *) - noise_reduction: cint; - - (** - * Called at the beginning of a frame to get cr buffer for it. - * Buffer type (size, hints) must be the same. libavcodec won't check it. - * libavcodec will pass previous buffer in pic, function should return - * same buffer or new buffer with old frame "painted" into it. - * If pic.data[0] == NULL must behave like get_buffer(). - * if CODEC_CAP_DR1 is not set then reget_buffer() must call - * avcodec_default_reget_buffer() instead of providing buffers allocated by - * some other means. - * - encoding: unused - * - decoding: Set by libavcodec, user can override - *) - reget_buffer: function (c: PAVCodecContext; pic: PAVFrame): cint; cdecl; - - (** - * Number of bits which should be loaded into the rc buffer before decoding starts. - * - encoding: Set by user. - * - decoding: unused - *) - rc_initial_buffer_occupancy: cint; - - (** - * - * - encoding: Set by user. - * - decoding: unused - *) - inter_threshold: cint; - - (** - * CODEC_FLAG2_* - * - encoding: Set by user. - * - decoding: Set by user. - *) - flags2: cint; - - (** - * Simulates errors in the bitstream to test error concealment. - * - encoding: Set by user. - * - decoding: unused - *) - error_rate: cint; - - (** - * MP3 antialias algorithm, see FF_AA_* below. - * - encoding: unused - * - decoding: Set by user. - *) - antialias_algo: cint; - - (** - * quantizer noise shaping - * - encoding: Set by user. - * - decoding: unused - *) - quantizer_noise_shaping: cint; - - (** - * thread count - * is used to decide how many independent tasks should be passed to execute() - * - encoding: Set by user. - * - decoding: Set by user. - *) - thread_count: cint; - - (** - * The codec may call this to execute several independent things. - * It will return only after finishing all tasks. - * The user may replace this with some multithreaded implementation, - * the default implementation will execute the parts serially. - * @param count the number of things to execute - * - encoding: Set by libavcodec, user can override. - * - decoding: Set by libavcodec, user can override. - *) - {$IF LIBAVCODEC_VERSION < 52004000} // < 52.4.0 - execute: function (c: PAVCodecContext; func: TExecuteFunc; arg: PPointer; ret: PCint; count: cint): cint; cdecl; - {$ELSE} - execute: function (c: PAVCodecContext; func: TExecuteFunc; arg: Pointer; ret: PCint; count: cint; size: cint): cint; cdecl; - {$IFEND} - - (** - * thread opaque - * Can be used by execute() to store some per AVCodecContext stuff. - * - encoding: set by execute() - * - decoding: set by execute() - *) - thread_opaque: pointer; - - (** - * Motion estimation threshold below which no motion estimation is - * performed, but instead the user specified motion vectors are used. - * - * - encoding: Set by user. - * - decoding: unused - *) - me_threshold: cint; - - (** - * Macroblock threshold below which the user specified macroblock types will be used. - * - encoding: Set by user. - * - decoding: unused - *) - mb_threshold: cint; - - (** - * precision of the intra DC coefficient - 8 - * - encoding: Set by user. - * - decoding: unused - *) - intra_dc_precision: cint; - - (** - * noise vs. sse weight for the nsse comparsion function - * - encoding: Set by user. - * - decoding: unused - *) - nsse_weight: cint; - - (** - * Number of macroblock rows at the top which are skipped. - * - encoding: unused - * - decoding: Set by user. - *) - skip_top: cint; - - (** - * Number of macroblock rows at the bottom which are skipped. - * - encoding: unused - * - decoding: Set by user. - *) - skip_bottom: cint; - - (** - * profile - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - profile: cint; - - (** - * level - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - level: cint; - - (** - * low resolution decoding, 1-> 1/2 size, 2->1/4 size - * - encoding: unused - * - decoding: Set by user. - *) - lowres: cint; - - (** - * Bitstream width / height, may be different from width/height if lowres - * or other things are used. - * - encoding: unused - * - decoding: Set by user before init if known. Codec should override / dynamically change if needed. - *) - coded_width, coded_height: cint; - - (** - * frame skip threshold - * - encoding: Set by user. - * - decoding: unused - *) - frame_skip_threshold: cint; - - (** - * frame skip factor - * - encoding: Set by user. - * - decoding: unused - *) - frame_skip_factor: cint; - - (** - * frame skip exponent - * - encoding: Set by user. - * - decoding: unused - *) - frame_skip_exp: cint; - - (** - * frame skip comparison function - * - encoding: Set by user. - * - decoding: unused - *) - frame_skip_cmp: cint; - - (** - * Border processing masking, raises the quantizer for mbs on the borders - * of the picture. - * - encoding: Set by user. - * - decoding: unused - *) - border_masking: cfloat; - - (** - * minimum MB lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - mb_lmin: cint; - - (** - * maximum MB lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - mb_lmax: cint; - - (** - * - * - encoding: Set by user. - * - decoding: unused - *) - me_penalty_compensation: cint; - - (** - * - * - encoding: unused - * - decoding: Set by user. - *) - skip_loop_filter: TAVDiscard; - - (** - * - * - encoding: unused - * - decoding: Set by user. - *) - skip_idct: TAVDiscard; - - (** - * - * - encoding: unused - * - decoding: Set by user. - *) - skip_frame: TAVDiscard; - - (** - * - * - encoding: Set by user. - * - decoding: unused - *) - bidir_refine: cint; - - (** - * - * - encoding: Set by user. - * - decoding: unused - *) - brd_scale: cint; - - (** - * constant rate factor - quality-based VBR - values ~correspond to qps - * - encoding: Set by user. - * - decoding: unused - *) - {$IF LIBAVCODEC_VERSION >= 51021000} // 51.21.0 - crf: cfloat; - {$ELSE} - crf: cint; - {$IFEND} - - (** - * constant quantization parameter rate control method - * - encoding: Set by user. - * - decoding: unused - *) - cqp: cint; - - (** - * minimum GOP size - * - encoding: Set by user. - * - decoding: unused - *) - keyint_min: cint; - - (** - * number of reference frames - * - encoding: Set by user. - * - decoding: Set by lavc. - *) - refs: cint; - - (** - * chroma qp offset from luma - * - encoding: Set by user. - * - decoding: unused - *) - chromaoffset: cint; - - (** - * Influences how often B-frames are used. - * - encoding: Set by user. - * - decoding: unused - *) - bframebias: cint; - - (** - * trellis RD quantization - * - encoding: Set by user. - * - decoding: unused - *) - trellis: cint; - - (** - * Reduce fluctuations in qp (before curve compression). - * - encoding: Set by user. - * - decoding: unused - *) - complexityblur: cfloat; - - (** - * in-loop deblocking filter alphac0 parameter - * alpha is in the range -6...6 - * - encoding: Set by user. - * - decoding: unused - *) - deblockalpha: cint; - - (** - * in-loop deblocking filter beta parameter - * beta is in the range -6...6 - * - encoding: Set by user. - * - decoding: unused - *) - deblockbeta: cint; - - (** - * macroblock subpartition sizes to consider - p8x8, p4x4, b8x8, i8x8, i4x4 - * - encoding: Set by user. - * - decoding: unused - *) - partitions: cint; - - (** - * direct MV prediction mode - 0 (none), 1 (spatial), 2 (temporal), 3 (auto) - * - encoding: Set by user. - * - decoding: unused - *) - directpred: cint; - - (** - * Audio cutoff bandwidth (0 means "automatic") - * - encoding: Set by user. - * - decoding: unused - *) - cutoff: cint; - - (** - * Multiplied by qscale for each frame and added to scene_change_score. - * - encoding: Set by user. - * - decoding: unused - *) - scenechange_factor: cint; - - (** - * - * Note: Value depends upon the compare function used for fullpel ME. - * - encoding: Set by user. - * - decoding: unused - *) - mv0_threshold: cint; - - (** - * Adjusts sensitivity of b_frame_strategy 1. - * - encoding: Set by user. - * - decoding: unused - *) - b_sensitivity: cint; - - (** - * - encoding: Set by user. - * - decoding: unused - *) - compression_level: cint; - - {$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} - (** - * 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; - {$IFEND} - - (** - * LPC coefficient precision - used by FLAC encoder - * - encoding: Set by user. - * - decoding: unused - *) - lpc_coeff_precision: cint; - - (** - * - encoding: Set by user. - * - decoding: unused - *) - min_prediction_order: cint; - - (** - * - encoding: Set by user. - * - decoding: unused - *) - max_prediction_order: cint; - - (** - * search method for selecting prediction order - * - encoding: Set by user. - * - decoding: unused - *) - prediction_order_method: cint; - - (** - * - encoding: Set by user. - * - decoding: unused - *) - min_partition_order: cint; - - (** - * - encoding: Set by user. - * - decoding: unused - *) - max_partition_order: cint; - - {$IF LIBAVCODEC_VERSION >= 51026000} // 51.26.0 - (** - * GOP timecode frame start number, in non drop frame format - * - encoding: Set by user. - * - decoding: unused - *) - timecode_frame_start: cint64; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 51042000} // 51.42.0 - {$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} - (** - * Decoder should decode to this many channels if it can (0 for default) - * - encoding: unused - * - decoding: Set by user. - * @deprecated Deprecated in favor of request_channel_layout. - *) - request_channels: cint; - {$IFEND} - {$IFEND} - - {$IF LIBAVCODEC_VERSION > 51049000} // > 51.49.0 - (** - * 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; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 51068000} // 51.68.0 - (** - * opaque 64bit number (generally a PTS) that will be reordered and - * output in AVFrame.reordered_opaque - * - encoding: unused - * - decoding: Set by user. - *) - reordered_opaque: cint64; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 51069000} // 51.69.0 - (** - * 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. - *) - bits_per_raw_sample: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52002000} // 52.2.0 - (** - * Audio channel layout. - * - encoding: set by user. - * - decoding: set by libavcodec. - *) - channel_layout: cint64; - - (** - * Request decoder to use this channel layout if it can (0 for default) - * - encoding: unused - * - decoding: Set by user. - *) - request_channel_layout: cint64; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52004000} // >= 52.4.0 - (** - * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow. - * - encoding: Set by user. - * - decoding: unused. - *) - rc_max_available_vbv_use: cfloat; - - (** - * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow. - * - encoding: Set by user. - * - decoding: unused. - *) - rc_min_vbv_overflow_use: cfloat; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52018000} // >= 52.18.0 - (** - * Hardware accelerator in use - * - encoding: unused. - * - decoding: Set by libavcodec - *) - hwaccel: PAVHWAccel; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52020000} // >= 52.20.0 - (** - * For some codecs, the time base is closer to the field rate than the frame rate. - * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration - * if no telecine is used ... - * - * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. - *) - ticks_per_frame: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52021000} // >= 52.21.0 - (** - * Hardware accelerator context. - * For some hardware accelerators, a global context needs to be - * provided by the user. In that case, this holds display-dependent - * data FFmpeg cannot instantiate itself. Please refer to the - * FFmpeg HW accelerator documentation to know how to fill this - * is. e.g. for VA API, this is a struct vaapi_context. - * - encoding: unused - * - decoding: Set by user - *) - hwaccel_context: pointer; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52028000} // >= 52.28.0 - (** - * Chromaticity coordinates of the source primaries. - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - color_primaries: TAVColorPrimaries; - - (** - * Color Transfer Characteristic. - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - color_trc: TAVColorTransferCharacteristic; - - (** - * YUV colorspace type. - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - colorspace: TAVColorSpace; - - (** - * MPEG vs JPEG YUV range. - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - color_range: TAVColorRange; - - (** - * This defines the location of chroma samples. - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - chroma_sample_location: TAVChromaLocation; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52037000} // >= 52.37.0 - (** - * The codec may call this to execute several independent things. - * It will return only after finishing all tasks. - * The user may replace this with some multithreaded implementation, - * the default implementation will execute the parts serially. - * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. - * @param c context passed also to func - * @param count the number of things to execute - * @param arg2 argument passed unchanged to func - * @param ret return values of executed functions, must have space for "count" values. May be NULL. - * @param func function that will be called count times, with jobnr from 0 to count-1. - * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no - * two instances of func executing at the same time will have the same threadnr. - * @return always 0 currently, but code should handle a future improvement where when any call to func - * returns < 0 no further calls to func may be done and < 0 is returned. - * - encoding: Set by libavcodec, user can override. - * - decoding: Set by libavcodec, user can override. - *) - execute2: function (c: PAVCodecContext; func: TExecute2Func; arg2: Pointer; ret: Pcint; count: cint): cint; cdecl; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52042000} // >= 52.42.0 - (** - * explicit P-frame weighted prediction analysis method - * 0: off - * 1: fast blind weighting (one reference duplicate with -1 offset) - * 2: smart weighting (full fade detection analysis) - * - encoding: Set by user. - * - decoding: unused - *) - weighted_p_pred: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52061000} // >= 52.61.0 - (** - * AQ mode - * 0: Disabled - * 1: Variance AQ (complexity mask) - * 2: Auto-variance AQ (experimental) - * - encoding: Set by user - * - decoding: unused - *) - aq_mode: cint; - - (** - * AQ strength - * Reduces blocking and blurring in flat and textured areas. - * - encoding: Set by user - * - decoding: unused - *) - aq_strength: cfloat; - - (** - * PSY RD - * Strength of psychovisual optimization - * - encoding: Set by user - * - decoding: unused - *) - psy_rd: cfloat; - - (** - * PSY trellis - * Strength of psychovisual optimization - * - encoding: Set by user - * - decoding: unused - *) - psy_trellis: cfloat; - - (** - * RC lookahead - * Number of frames for frametype and ratecontrol lookahead - * - encoding: Set by user - * - decoding: unused - *) - rc_lookahead: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52067000} // >= 52.67.0 - (** - * Constant rate factor maximum - * With CRF encoding mode and VBV restrictions enabled, prevents quality from being worse - * than crf_max, even if doing so would violate VBV restrictions. - * - encoding: Set by user. - * - decoding: unused - *) - crf_max: cfloat; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52067002} // >= 52.67.2 - log_level_offset: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52083000} // >= 52.83.0 - (** - * Determines which LPC analysis algorithm to use. - * - encoding: Set by user - * - decoding: unused - *) - lpc_type: TAVLPCType; - - (** - * Number of passes to use for Cholesky factorization during LPC analysis - * - encoding: Set by user - * - decoding: unused - *) - lpc_passes: cint; - {$IFEND} - end; {TAVCodecContext} - -(** - * AVCodec. - *) - TAVCodec = record - name: PAnsiChar; -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 - type_: TCodecType; -{$ELSE} - type_: TAVMediaType; -{$IFEND} - id: TCodecID; - priv_data_size: cint; - init: function (avctx: PAVCodecContext): cint; cdecl; (* typo corretion by the Creative CAT *) - encode: function (avctx: PAVCodecContext; buf: PByteArray; buf_size: cint; data: pointer): cint; cdecl; - close: function (avctx: PAVCodecContext): cint; cdecl; - decode: function (avctx: PAVCodecContext; outdata: pointer; var outdata_size: cint; - {$IF LIBAVCODEC_VERSION < 52025000} // 52.25.0 - buf: {const} PByteArray; buf_size: cint): cint; cdecl; - {$ELSE} - avpkt: PAVPacket): cint; cdecl; - {$IFEND} - (** - * Codec capabilities. - * see CODEC_CAP_* - *) - capabilities: cint; - next: PAVCodec; - (** - * Flush buffers. - * Will be called when seeking - *) - flush: procedure (avctx: PAVCodecContext); cdecl; - supported_framerates: {const} PAVRational; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} - pix_fmts: {const} PAVPixelFormat; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 - {$IF LIBAVCODEC_VERSION >= 51055000} // 51.55.0 - (** - * Descriptive name for the codec, meant to be more human readable than name. - * You should use the NULL_IF_CONFIG_SMALL() macro to define it. - *) - long_name: {const} PAnsiChar; - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 51056000} // 51.56.0 - supported_samplerates: {const} PCint; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 51062000} // 51.62.0 - sample_fmts: {const} PSampleFormatArray; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52002000} // 52.2.0 - channel_layouts: {const} PCint64; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52080000} // 52.80.0 - max_lowres: byte; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 - {$IFEND} - end; - -{$IF LIBAVCODEC_VERSION >= 52018000} // 52.18.0 -(** - * AVHWAccel. - *) - TAVHWAccel = record - (** - * Name of the hardware accelerated codec. - * The name is globally unique among encoders and among decoders (but an - * encoder and a decoder can share the same name). - *) - name: PAnsiChar; - -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 - (** - * Type of codec implemented by the hardware accelerator. - * - * See CODEC_TYPE_xxx - *) - type_: TCodecType; -{$ELSE} - (** - * Type of codec implemented by the hardware accelerator. - * - * See AVMediaType_xxx - *) - type_: TAVMediaType; -{$IFEND} - - - (** - * Codec implemented by the hardware accelerator. - * - * See CODEC_ID_xxx - *) - id: TCodecID; - - (** - * Supported pixel format. - * - * Only hardware accelerated formats are supported here. - *) - pix_fmt: {const} PAVPixelFormat; - - (** - * Hardware accelerated codec capabilities. - * see FF_HWACCEL_CODEC_CAP_* - *) - capabilities: cint; - - next: PAVCodec; - - (** - * Called at the beginning of each frame or field picture. - * - * Meaningful frame information (codec specific) is guaranteed to - * be parsed at this point. This function is mandatory. - * - * Note that buf can be NULL along with buf_size set to 0. - * Otherwise, this means the whole frame is available at this point. - * - * @param avctx the codec context - * @param buf the frame data buffer base - * @param buf_size the size of the frame in bytes - * @return zero if successful, a negative value otherwise - *) - start_frame: function (avctx: PAVCodecContext; - buf: PByteArray; - buf_size: cint): cint; cdecl; - - (** - * Callback for each slice. - * - * Meaningful slice information (codec specific) is guaranteed to - * be parsed at this point. This function is mandatory. - * - * @param avctx the codec context - * @param buf the slice data buffer base - * @param buf_size the size of the slice in bytes - * @return zero if successful, a negative value otherwise - *) - decode_slice: function (avctx: PAVCodecContext; - buf: PByteArray; - buf_size: cint): cint; cdecl; - - (** - * Called at the end of each frame or field picture. - * - * The whole picture is parsed at this point and can now be sent - * to the hardware accelerator. This function is mandatory. - * - * @param avctx the codec context - * @return zero if successful, a negative value otherwise - *) - end_frame: function (avctx: PAVCodecContext): cint; cdecl; - -{$IF LIBAVCODEC_VERSION >= 52021000} // >= 52.21.0 - (** - * Size of HW accelerator private data. - * - * Private data is allocated with av_mallocz() before - * AVCodecContext.get_buffer() and deallocated after - * AVCodecContext.release_buffer(). - *) - priv_data_size: cint; -{$IFEND} - - end; -{$IFEND} - -(** - * four components are given, that's all. - * the last component is alpha - *) - PAVPicture = ^TAVPicture; - TAVPicture = record - data: array [0..3] of PByteArray; - linesize: array [0..3] of cint; ///< number of bytes per line - end; - -type - TAVSubtitleType = ( - SUBTITLE_NONE, - - SUBTITLE_BITMAP, ///< A bitmap, pict will be set - - (** - * Plain text, the text field must be set by the decoder and is - * authoritative. ass and pict fields may contain approximations. - *) - SUBTITLE_TEXT, - - (** - * Formatted text, the ass field must be set by the decoder and is - * authoritative. pict and text fields may contain approximations. - *) - SUBTITLE_ASS - ); - -type - PPAVSubtitleRect = ^PAVSubtitleRect; - PAVSubtitleRect = ^TAVSubtitleRect; - {$IF LIBAVCODEC_VERSION < 52010000} // < 52.10.0 - TAVSubtitleRect = record - x: cuint16; - y: cuint16; - w: cuint16; - h: cuint16; - nb_colors: cuint16; - linesize: cint; - rgba_palette: PCuint32; - bitmap: PCuint8; - end; - {$ELSE} - TAVSubtitleRect = record - x: cint; ///< top left corner of pict, undefined when pict is not set - y: cint; ///< top left corner of pict, undefined when pict is not set - w: cint; ///< width of pict, undefined when pict is not set - h: cint; ///< height of pict, undefined when pict is not set - nb_colors: cint; ///< number of colors in pict, undefined when pict is not set - - (** - * data+linesize for the bitmap of this subtitle. - * can be set for text/ass as well once they where rendered - *) - pict: TAVPicture; - type_: TAVSubtitleType; - - text: PAnsiChar; ///< 0 terminated plain UTF-8 text - - (** - * 0 terminated ASS/SSA compatible event line. - * The pressentation of this is unaffected by the other values in this - * struct. - *) - ass: PByteArray; - end; - {$IFEND} - - PPAVSubtitle = ^PAVSubtitle; - PAVSubtitle = ^TAVSubtitle; - TAVSubtitle = record - format: cuint16; (* 0 = graphics *) - start_display_time: cuint32; (* relative to packet pts, in ms *) - end_display_time: cuint32; (* relative to packet pts, in ms *) - num_rects: cuint; - {$IF LIBAVCODEC_VERSION < 52010000} // < 52.10.0 - rects: PAVSubtitleRect; - {$ELSE} - rects: PPAVSubtitleRect; - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52032000} // >= 52.32.0 - pts: cint64; ///< Same as packet pts, in AV_TIME_BASE - {$IFEND} - end; - -{$IF LIBAVCODEC_VERSION >= 52025000} // 52.25.0 -{ packet functions } - -(** - * @deprecated use NULL instead - *) -procedure av_destruct_packet_nofree(pkt: PAVPacket); - cdecl; external av__codec; - -(* - * Default packet destructor. - *) -procedure av_destruct_packet(pkt: PAVPacket); - cdecl; external av__codec; - -(* - * Initialize optional fields of a packet with default values. - * - * @param pkt packet - *) -procedure av_init_packet(var pkt: TAVPacket); - cdecl; external av__codec; - -(* - * Allocate the payload of a packet and initialize its fields with - * default values. - * - * @param pkt packet - * @param size wanted payload size - * @return 0 if OK, AVERROR_xxx otherwise - *) -function av_new_packet(pkt: PAVPacket; size: cint): cint; - cdecl; external av__codec; - -(* - * Reduce packet size, correctly zeroing padding - * - * @param pkt packet - * @param size new size - *) -procedure av_shrink_packet(pkt: PAVPacket; size: cint); - cdecl; external av__codec; - -(* - * @warning This is a hack - the packet memory allocation stuff is broken. The - * packet is allocated if it was not really allocated. - *) -function av_dup_packet(pkt: PAVPacket): cint; - cdecl; external av__codec; - -(* - * Free a packet. - * - * @param pkt packet to free - *) -procedure av_free_packet(pkt: PAVPacket); -{$IF LIBAVCODEC_VERSION >= 52028000} // 52.28.0 - cdecl; external av__codec; -{$IFEND} -{$IFEND} - -(* resample.c *) -type - PReSampleContext = pointer; - PAVResampleContext = pointer; - PImgReSampleContext = pointer; - -function audio_resample_init (output_channels: cint; input_channels: cint; - output_rate: cint; input_rate: cint): PReSampleContext; - cdecl; external av__codec; - -function audio_resample (s: PReSampleContext; output: PSmallint; input: PSmallint; nb_samples: cint): cint; - cdecl; external av__codec; - -procedure audio_resample_close (s: PReSampleContext); - cdecl; external av__codec; - -(** - * Initialize an audio resampler. - * Note, if either rate is not an integer then simply scale both rates up so they are. - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq - * @param log2_phase_count log2 of the number of entries in the polyphase filterbank - * @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 - *) -function av_resample_init (out_rate: cint; in_rate: cint; filter_length: cint; - log2_phase_count: cint; linear: cint; cutoff: cdouble): PAVResampleContext; - cdecl; external av__codec; - -(** - * Resample an array of samples using a previously configured context. - * @param src an array of unconsumed samples - * @param consumed the number of samples of src which have been consumed are returned here - * @param src_size the number of unconsumed samples available - * @param dst_size the amount of space in samples available in dst - * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. - * @return the number of samples written in dst or -1 if an error occurred - *) -function av_resample (c: PAVResampleContext; dst: PSmallint; src: PSmallint; var consumed: cint; - src_size: cint; dst_size: cint; update_ctx: cint): cint; - cdecl; external av__codec; - -(** - * Compensate samplerate/timestamp drift. The compensation is done by changing - * the resampler parameters, so no audible clicks or similar distortions occur - * @param compensation_distance distance in output samples over which the compensation should be performed - * @param sample_delta number of output samples which should be output less - * - * example: av_resample_compensate(c, 10, 500) - * here instead of 510 samples only 500 samples would be output - * - * note, due to rounding the actual compensation might be slightly different, - * especially if the compensation_distance is large and the in_rate used during init is small - *) -procedure av_resample_compensate (c: PAVResampleContext; sample_delta: cint; - compensation_distance: cint); - cdecl; external av__codec; - -procedure av_resample_close (c: PAVResampleContext); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 -(* YUV420 format is assumed ! *) - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -function img_resample_init (output_width: cint; output_height: cint; - input_width: cint; input_height: cint): PImgReSampleContext; - cdecl; external av__codec; deprecated; - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -function img_resample_full_init (owidth: cint; oheight: cint; - iwidth: cint; iheight: cint; - topBand: cint; bottomBand: cint; - leftBand: cint; rightBand: cint; - padtop: cint; padbottom: cint; - padleft: cint; padright: cint): PImgReSampleContext; - cdecl; external av__codec; deprecated; - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -procedure img_resample (s: PImgReSampleContext; output: PAVPicture; input: {const} PAVPicture); - cdecl; external av__codec; deprecated; - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -procedure img_resample_close (s: PImgReSampleContext); - cdecl; external av__codec; deprecated; -{$IFEND} - -(** - * Allocate memory for a picture. Call avpicture_free to free it. - * - * @param picture the picture to be filled in. - * @param pix_fmt the format of the picture. - * @param width the width of the picture. - * @param height the height of the picture. - * @return Zero if successful, a negative value if not. - *) -function avpicture_alloc (picture: PAVPicture; pix_fmt: TAVPixelFormat; - width: cint; height: cint): cint; - cdecl; external av__codec; - -(** - * Free a picture previously allocated by avpicture_alloc(). - * - * @param picture the AVPicture to be freed - *) -procedure avpicture_free (picture: PAVPicture); - cdecl; external av__codec; - -(** - * Fill in the AVPicture fields. - * The fields of the given AVPicture are filled in by using the 'ptr' address - * which points to the image data buffer. Depending on the specified picture - * format, one or multiple image data pointers and line sizes will be set. - * If a planar format is specified, several pointers will be set pointing to - * the different picture planes and the line sizes of the different planes - * will be stored in the lines_sizes array. - * Call with ptr == NULL to get the required size for the ptr buffer. - * - * @param picture AVPicture whose fields are to be filled in - * @param ptr Buffer which will contain or contains the actual image data - * @param pix_fmt The format in which the picture data is stored. - * @param width the width of the image in pixels - * @param height the height of the image in pixels - * @return size of the image data in bytes - *) -function avpicture_fill (picture: PAVPicture; ptr: pointer; - pix_fmt: TAVPixelFormat; width: cint; height: cint): cint; - cdecl; external av__codec; - -function avpicture_layout (src: {const} PAVPicture; pix_fmt: TAVPixelFormat; - width: cint; height: cint; - dest: PByteArray; dest_size: cint): cint; - cdecl; external av__codec; - -(** - * Calculate the size in bytes that a picture of the given width and height - * would occupy if stored in the given picture format. - * Note that this returns the size of a compact representation as generated - * by avpicture_layout, which can be smaller than the size required for e.g. - * avpicture_fill. - * - * @param pix_fmt the given picture format - * @param width the width of the image - * @param height the height of the image - * @return Image data size in bytes or -1 on error (e.g. too large dimensions). - *) -function avpicture_get_size (pix_fmt: TAVPixelFormat; width: cint; height: cint): cint; - cdecl; external av__codec; - -procedure avcodec_get_chroma_sub_sample (pix_fmt: TAVPixelFormat; var h_shift: cint; var v_shift: cint); - cdecl; external av__codec; - -(** - * Return the pixel format corresponding to the name name. - * - * If there is no pixel format with name name, then look for a - * pixel format with the name corresponding to the native endian - * format of name. - * For example in a little-endian system, first look for "gray16", - * then for "gray16le". - * - * Finally if no pixel format has been found, return PIX_FMT_NONE. - *) -function avcodec_get_pix_fmt_name(pix_fmt: TAVPixelFormat): PAnsiChar; - cdecl; external av__codec; - -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; -{$IF LIBAVCODEC_VERSION >= 52049000} // >= 52.49.0 - deprecated; -{$IFEND} -{$IFEND} - -(** - * Return a value representing the fourCC code associated to the - * pixel format pix_fmt, or 0 if no associated fourCC code can be - * found. - *) -function avcodec_pix_fmt_to_codec_tag(pix_fmt: TAVPixelFormat): cuint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 52073000} // 52.73.0 -(** - * Put a string representing the codec tag codec_tag in buf. - * - * @param buf_size size in bytes of buf - * @return the length of the string that would have been generated if - * enough space had been available, excluding the trailing null - *) -function av_get_codec_tag_string(buf: PAnsiChar; buf_size: size_t; codec_tag: cuint): size_t; - cdecl; external av__codec; -{$IFEND} - -const - FF_LOSS_RESOLUTION = $0001; {**< loss due to resolution change *} - FF_LOSS_DEPTH = $0002; {**< loss due to color depth change *} - FF_LOSS_COLORSPACE = $0004; {**< loss due to color space conversion *} - FF_LOSS_ALPHA = $0008; {**< loss of alpha bits *} - FF_LOSS_COLORQUANT = $0010; {**< loss due to color quantization *} - FF_LOSS_CHROMA = $0020; {**< loss of chroma (e.g. RGB to gray conversion) *} - -(** - * Compute what kind of losses will occur when converting from one specific - * pixel format to another. - * When converting from one pixel format to another, information loss may occur. - * For example, when converting from RGB24 to GRAY, the color information will - * be lost. Similarly, other losses occur when converting from some formats to - * other formats. These losses can involve loss of chroma, but also loss of - * resolution, loss of color depth, loss due to the color space conversion, loss - * of the alpha bits or loss due to color quantization. - * avcodec_get_fix_fmt_loss() informs you about the various types of losses - * which will occur when converting from one pixel format to another. - * - * @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. - *) -function avcodec_get_pix_fmt_loss (dst_pix_fmt: TAVPixelFormat; src_pix_fmt: TAVPixelFormat; - has_alpha: cint): cint; - cdecl; external av__codec; - -(** - * Find the best pixel format to convert to given a certain source pixel - * format. When converting from one pixel format to another, information loss - * may occur. For example, when converting from RGB24 to GRAY, the color - * information will be lost. Similarly, other losses occur when converting from - * some formats to other formats. avcodec_find_best_pix_fmt() searches which of - * the given pixel formats should be used to suffer the least amount of loss. - * The pixel formats from which it chooses one, are determined by the - * pix_fmt_mask parameter. - * - * @code - * src_pix_fmt = PIX_FMT_YUV420P; - * 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 - * - * @param[in] pix_fmt_mask bitmask determining which pixel format to choose from - * @param[in] src_pix_fmt source pixel format - * @param[in] has_alpha Whether the source pixel format alpha channel is used. - * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. - * @return The best pixel format to convert to or -1 if none was found. - *) -{$IF LIBAVCODEC_VERSION >= 52000000} // 52.0.0 -function avcodec_find_best_pix_fmt(pix_fmt_mask: cint64; src_pix_fmt: TAVPixelFormat; - has_alpha: cint; loss_ptr: PCint): cint; - cdecl; external av__codec; -{$ELSEIF LIBAVCODEC_VERSION < 52022001} -function avcodec_find_best_pix_fmt(pix_fmt_mask: cint; src_pix_fmt: TAVPixelFormat; - has_alpha: cint; loss_ptr: PCint): cint; - cdecl; external av__codec; -{$ELSE} -function avcodec_find_best_pix_fmt(pix_fmt_mask: cint; src_pix_fmt: TAVPixelFormat; - has_alpha: cint; loss_ptr: PCint): TAVPixelFormat; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 51041000} // 51.41.0 -(** - * Print in buf the string corresponding to the pixel format with - * number pix_fmt, or an header if pix_fmt is negative. - * - * @param[in] buf the buffer where to write the string - * @param[in] buf_size the size of buf - * @param[in] pix_fmt the number of the pixel format to print the corresponding info string, or - * a negative value to print the corresponding header. - * Meaningful values for obtaining a pixel format info vary from 0 to PIX_FMT_NB -1. - *) -{$IF LIBAVCODEC_VERSION < 52022001} // 52.22.1 -procedure avcodec_pix_fmt_string (buf: PAnsiChar; buf_size: cint; pix_fmt: cint); - cdecl; external av__codec; -{$ELSE} -procedure avcodec_pix_fmt_string (buf: PAnsiChar; buf_size: cint; pix_fmt: TAVPixelFormat); - cdecl; external av__codec; -{$IFEND} -{$IFEND} - -const - FF_ALPHA_TRANSP = $0001; {* image has some totally transparent pixels *} - FF_ALPHA_SEMI_TRANSP = $0002; {* image has some transparent pixels *} - -(** - * Tell if an image really has transparent alpha values. - * @return ored mask of FF_ALPHA_xxx constants - *) -function img_get_alpha_info (src: {const} PAVPicture; - pix_fmt: TAVPixelFormat; - width: cint; - height: cint): cint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 -(** - * convert among pixel formats - * @deprecated Use the software scaler (swscale) instead. - *) -function img_convert (dst: PAVPicture; dst_pix_fmt: TAVPixelFormat; - src: {const} PAVPicture; pix_fmt: TAVPixelFormat; - width: cint; height: cint): cint; - cdecl; external av__codec; deprecated; -{$IFEND} - -(* deinterlace a picture *) -(* deinterlace - if not supported return -1 *) -function avpicture_deinterlace (dst: PAVPicture; - src: {const} PAVPicture; - pix_fmt: TAVPixelFormat; - width: cint; - height: cint): cint; - cdecl; external av__codec; - -{* external high level API *} - -{$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 -{ -var - first_avcodec: PAVCodec; external av__codec; -} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 51049000} // 51.49.0 -(** - * If c is NULL, returns the first registered codec, - * if c is non-NULL, returns the next registered codec after c, - * or NULL if c is the last one. - *) -function av_codec_next(c: PAVCodec): PAVCodec; - cdecl; external av__codec; -{$IFEND} - -(** - * Return the LIBAVCODEC_VERSION_INT constant. - *) -function avcodec_version(): cuint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION < 52008000} // 52.8.0 -(* returns LIBAVCODEC_BUILD constant *) -function avcodec_build(): cuint; - cdecl; external av__codec; deprecated; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52041000} // 52.41.0 -(** - * Return the libavcodec build-time configuration. - *) -function avcodec_configuration(): PAnsiChar; - cdecl; external av__codec; - -(** - * Return the libavcodec license. - *) -function avcodec_license(): PAnsiChar; - cdecl; external av__codec; -{$IFEND} - -(** - * Initialize libavcodec. - * - * @warning This function must be called before any other libavcodec - * function. - *) -procedure avcodec_init(); - cdecl; external av__codec; - -(** - * Register the codec codec and initialize libavcodec. - * - * @see avcodec_init() - *) -{$IF LIBAVCODEC_VERSION >= 52014000} // 52.14.0 -procedure avcodec_register(codec: PAVCodec); - cdecl; external av__codec; -// Deprecated in favor of avcodec_register. -procedure register_avcodec(codec: PAVCodec); - cdecl; external av__codec; deprecated; -{$ELSEIF LIBAVCODEC_VERSION_MAJOR < 53} -procedure register_avcodec(codec: PAVCodec); - cdecl; external av__codec; -{$IFEND} -(** - * Find a registered encoder with a matching codec ID. - * - * @param id CodecID of the requested encoder - * @return An encoder if one was found, NULL otherwise. - *) -function avcodec_find_encoder(id: TCodecID): PAVCodec; - cdecl; external av__codec; - -(** - * Find a registered encoder with the specified name. - * - * @param name name of the requested encoder - * @return An encoder if one was found, NULL otherwise. - *) -function avcodec_find_encoder_by_name(name: PAnsiChar): PAVCodec; - cdecl; external av__codec; - -(** - * Findsa registered decoder with a matching codec ID. - * - * @param id CodecID of the requested decoder - * @return A decoder if one was found, NULL otherwise. - *) -function avcodec_find_decoder(id: TCodecID): PAVCodec; - cdecl; external av__codec; - -(** - * Find a registered decoder with the specified name. - * - * @param name name of the requested decoder - * @return A decoder if one was found, NULL otherwise. - *) -function avcodec_find_decoder_by_name(name: PAnsiChar): PAVCodec; - cdecl; external av__codec; -procedure avcodec_string(buf: PAnsiChar; buf_size: cint; enc: PAVCodecContext; encode: cint); - cdecl; external av__codec; - -(** - * Set the fields of the given AVCodecContext to default values. - * - * @param s The AVCodecContext of which the fields should be set to default values. - *) -procedure avcodec_get_context_defaults(s: PAVCodecContext); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 51039000} // 51.39.0 -(** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! - * we WILL change its arguments and name a few times! *) -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 -procedure avcodec_get_context_defaults2(s: PAVCodecContext; ctype: TCodecType); - cdecl; external av__codec; -{$ELSE} -procedure avcodec_get_context_defaults2(s: PAVCodecContext; ctype: TAVMediaType); - cdecl; external av__codec; -{$IFEND} -{$IFEND} - -(** - * Allocate an AVCodecContext and sets it fields to default values. The - * resulting struct can be deallocated by simply calling av_free(). - * - * @return An AVCodecContext filled with default values or NULL on failure. - * @see avcodec_get_context_defaults - *) -function avcodec_alloc_context(): PAVCodecContext; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 51039000} // 51.39.0 -(** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! - * we WILL change its arguments and name a few times! *) -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 -function avcodec_alloc_context2(ctype: TCodecType): PAVCodecContext; - cdecl; external av__codec; -{$ELSE} -function avcodec_alloc_context2(ctype: TAVMediaType): PAVCodecContext; - cdecl; external av__codec; -{$IFEND} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52065000} // >= 52.65.0 -(** - * 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 - * 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 - * @param src source codec context - * @return AVERROR() on error (e.g. memory allocation error), 0 on success - *) -function avcodec_copy_context(dest: PAVCodecContext; src: {const} PAVCodecContext): cint; - cdecl; external av__codec; -{$IFEND} - -(** - * Set the fields of the given AVFrame to default values. - * - * @param pic The AVFrame of which the fields should be set to default values. - *) -procedure avcodec_get_frame_defaults (pic: PAVFrame); - cdecl; external av__codec; - -(** - * Allocate an AVFrame and set its fields to default values. The resulting - * struct can be deallocated by simply calling av_free(). - * - * @return An AVFrame filled with default values or NULL on failure. - * @see avcodec_get_frame_defaults - *) -function avcodec_alloc_frame(): PAVFrame; - cdecl; external av__codec; - -function avcodec_default_get_buffer (s: PAVCodecContext; pic: PAVFrame): cint; - cdecl; external av__codec; -procedure avcodec_default_release_buffer (s: PAVCodecContext; pic: PAVFrame); - cdecl; external av__codec; -function avcodec_default_reget_buffer (s: PAVCodecContext; pic: PAVFrame): cint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 52066000} // >= 52.66.0 -(** - * Return the amount of padding in pixels which the get_buffer callback must - * provide around the edge of the image for codecs which do not have the - * CODEC_FLAG_EMU_EDGE flag. - * - * @return Required padding in pixels. - *) -function avcodec_get_edge_width(): cuint; - cdecl; external av__codec; -{$IFEND} - -(** - * Modify width and height values so that they will result in a memory - * buffer that is acceptable for the codec if you do not use any horizontal - * padding. - * - * May only be used if a codec with CODEC_CAP_DR1 has been opened. - * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased - * according to avcodec_get_edge_width() before. - *) -procedure avcodec_align_dimensions(s: PAVCodecContext; width: PCint; height: PCint); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION_MAJOR < 53} // < 53 -{$IF LIBAVCODEC_VERSION >= 52055000} // >= 52.55.0 -(** -{$IF LIBAVCODEC_VERSION >= 52084003} // >= 52.84.3 - * @deprecated Deprecated in favor of av_check_image_size(). -{$ELSE} - * Modifiy width and height values so that they will result in a memory - * buffer that is acceptable for the codec if you also ensure that all - * line sizes are a multiple of the respective linesize_align[i]. - * - * May only be used if a codec with CODEC_CAP_DR1 has been opened. - * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased - * according to avcodec_get_edge_width() before. -{$IFEND} - *) -procedure avcodec_align_dimensions2(s: PAVCodecContext; width: PCint; height: PCint; - linesize_align: PQuadIntArray); - cdecl; external av__codec; -{$IF LIBAVCODEC_VERSION >= 52084003} // >= 52.84.3 - deprecated; -{$IFEND} -{$IFEND} -{$IFEND} - -(** - * Check if the given dimension of a picture is valid, meaning that all - * bytes of the picture can be addressed with a signed int. - * - * @param[in] w Width of the picture. - * @param[in] h Height of the picture. - * @return Zero if valid, a negative value if invalid. - *) -function avcodec_check_dimensions(av_log_ctx: pointer; w: cuint; h: cuint): cint; - cdecl; external av__codec; - - -function avcodec_default_get_format(s: PAVCodecContext; fmt: {const} PAVPixelFormat): TAVPixelFormat; - cdecl; external av__codec; - -function avcodec_thread_init(s: PAVCodecContext; thread_count: cint): cint; - cdecl; external av__codec; -procedure avcodec_thread_free(s: PAVCodecContext); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION < 52004000} // < 52.4.0 -function avcodec_thread_execute(s: PAVCodecContext; func: TExecuteFunc; arg: PPointer; var ret: cint; count: cint): cint; - cdecl; external av__codec; -{$ELSEIF LIBAVCODEC_VERSION < 52059000} // < 52.59.0 -function avcodec_thread_execute(s: PAVCodecContext; func: TExecuteFunc; arg: Pointer; var ret: cint; count: cint; size: cint): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION < 52004000} // < 52.4.0 -function avcodec_default_execute(s: PAVCodecContext; func: TExecuteFunc; arg: PPointer; var ret: cint; count: cint): cint; - cdecl; external av__codec; -{$ELSE} -function avcodec_default_execute(s: PAVCodecContext; func: TExecuteFunc; arg: Pointer; var ret: cint; count: cint; size: cint): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52037000} // >= 52.37.0 -function avcodec_default_execute2(s: PAVCodecContext; func: TExecuteFunc; arg: Pointer; var ret: cint; count: cint): cint; - cdecl; external av__codec; -{$IFEND} -//FIXME func typedef - -(** - * Initialize the AVCodecContext to use the given AVCodec. Prior to using this - * function the context has to be allocated. - * - * 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(); - * codec = avcodec_find_decoder(CODEC_ID_H264); - * if (!codec) - * exit(1); - * - * context = avcodec_alloc_context(); - * - * if (avcodec_open(context, codec) < 0) - * exit(1); - * @endcode - * - * @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 - *) -function avcodec_open(avctx: PAVCodecContext; codec: PAVCodec): cint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION < 52000000} // < 52.0.0 -(** - * @deprecated Use avcodec_decode_audio2 instead. - *) -function avcodec_decode_audio(avctx: PAVCodecContext; samples: PSmallint; - var frame_size_ptr: cint; - buf: {const} PByteArray; buf_size: cint): cint; - cdecl; external av__codec; {deprecated;} -{$IFEND} - -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -{$IF LIBAVCODEC_VERSION >= 51030000} // 51.30.0 -(** - * Decode an audio frame from buf into samples. - * Wrapper function which calls avcodec_decode_audio3. - * - * @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. - *) -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} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52025000} // 52.25.0 -(** - * 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, - * avcodec_decode_audio3 has to be called again with an AVPacket that contains - * the remaining data in order to decode the second frame etc. - * If no frame - * could be outputted, frame_size_ptr is zero. Otherwise, it is the - * decompressed frame size in bytes. - * - * @warning You must set frame_size_ptr to the allocated size of the - * output buffer before calling avcodec_decode_audio3(). - * - * @warning The input buffer 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. - * - * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that - * no overreading happens for damaged MPEG streams. - * - * @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 - * * it will work but it will have an impact on performance. - * - * In practice, avpkt->data should have 4 byte alignment at minimum and - * 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. - * - * @param avctx the codec context - * @param[out] samples the output buffer - * @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 - * data and size, some decoders might in addition need other fields. - * All decoders are designed to use the least fields possible though. - * @return On error a negative value is returned, otherwise the number of bytes - * used or zero if no frame data was decompressed (used) from the input AVPacket. - *) -function avcodec_decode_audio3(avctx: PAVCodecContext; samples: PSmallint; - var frame_size_ptr: cint; - avpkt: PAVPacket): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -(** - * Decode a video frame from buf into picture. - * Wrapper function which calls avcodec_decode_video2. - * - * @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. - * - * @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. - *) -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} - -{$IF LIBAVCODEC_VERSION >= 52025000} // 52.25.0 -(** - * Decode the video frame of size avpkt->size from avpkt->data into picture. - * Some decoders may support multiple frames in a single AVPacket, such - * decoders would then just decode the first frame. - * - * @warning The input buffer 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. - * - * @warning The end of the input buffer buf should be set to 0 to ensure that - * no overreading happens for damaged MPEG streams. - * - * @note You might have to align the input buffer avpkt->data. - * 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 - * it will work but it will have an impact on performance. - * - * In practice, avpkt->data should have 4 byte alignment at minimum. - * - * @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. - * You can create such packet with av_init_packet() and by then setting - * data and size, some decoders might in addition need other fields like - * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least - * fields possible. - * @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. - *) -function avcodec_decode_video2(avctx: PAVCodecContext; picture: PAVFrame; - var got_picture_ptr: cint; - avpkt: PAVPacket): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_MAX_VERSION_MAJOR < 53} -(* 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. - *) -function avcodec_decode_subtitle(avctx: PAVCodecContext; sub: PAVSubtitle; - var got_sub_ptr: cint; - buf: {const} PByteArray; buf_size: cint): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52025000} // 52.25.0 -(* Decode a subtitle message. - * Return a negative value on 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. - * Note that CODEC_CAP_DR1 is not available for subtitle codecs. This is for - * simplicity, because the performance difference is expect to be negligible - * and reusing a get_buffer written for video codecs would probably perform badly - * due to a potentially very different allocation pattern. - * - * @param avctx the codec context - * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be - freed with avsubtitle_free if *got_sub_ptr is set. - * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. - * @param[in] avpkt The input AVPacket containing the input buffer. - *) -function avcodec_decode_subtitle2(avctx: PAVCodecContext; sub: PAVSubtitle; - var got_sub_ptr: cint; - avpkt: PAVPacket): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52082000} // 52.82.0 -(** - * Frees all allocated data in the given subtitle struct. - * - * @param sub AVSubtitle to free. - *) -procedure avsubtitle_free(sub: PAVSubtitle); - cdecl; external av__codec; -{$IFEND} - -function avcodec_parse_frame(avctx: PAVCodecContext; pdata: PPointer; - data_size_ptr: PCint; - buf: PByteArray; buf_size: cint): cint; - cdecl; external av__codec; - -(** - * Encode an audio frame from samples into buf. - * - * @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. - * - * @param avctx the codec context - * @param[out] buf the output buffer - * @param[in] buf_size the output buffer size - * @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. - * @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; - cdecl; external av__codec; - -(** - * Encode a video frame from pict into buf. - * The input picture should be - * stored using a specific format, namely avctx.pix_fmt. - * - * @param avctx the codec context - * @param[out] buf the output buffer for the bitstream of encoded frame - * @param[in] buf_size the size of the output buffer in bytes - * @param[in] pict the input picture to encode - * @return On error a negative value is returned, on success zero or the number - * of bytes used from the output buffer. - *) -function avcodec_encode_video(avctx: PAVCodecContext; buf: PByte; - buf_size: cint; pict: PAVFrame): cint; - cdecl; external av__codec; -function avcodec_encode_subtitle(avctx: PAVCodecContext; buf: PByteArray; - buf_size: cint; sub: {const} PAVSubtitle): cint; - cdecl; external av__codec; - -function avcodec_close(avctx: PAVCodecContext): cint; - cdecl; external av__codec; - -(** - * Register all the codecs, parsers and bitstream filters which were enabled at - * configuration time. If you do not call this function you can select exactly - * which formats you want to support, by using the individual registration - * functions. - * - * @see register_avcodec - * @see avcodec_register - * @see av_register_codec_parser - * @see av_register_bitstream_filter - *) -procedure avcodec_register_all(); - cdecl; external av__codec; - -(** - * Flush buffers, should be called when seeking or when switching to a different stream. - *) -procedure avcodec_flush_buffers(avctx: PAVCodecContext); - cdecl; external av__codec; - -procedure avcodec_default_free_buffers(s: PAVCodecContext); - cdecl; external av__codec; - -(* misc useful functions *) - -(** - * Return a single letter to describe the given picture type pict_type. - * - * @param[in] pict_type the picture type - * @return A single character representing the picture type. - *) -function av_get_pict_type_char(pict_type: cint): AnsiChar; - cdecl; external av__codec; - -(** - * Return codec bits per sample. - * - * @param[in] codec_id the codec - * @return Number of bits per sample or zero if unknown for the given codec. - *) -function av_get_bits_per_sample(codec_id: TCodecID): cint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 51041000} // 51.41.0 -(** - * Return sample format bits per sample. - * - * @param[in] sample_fmt the sample format - * @return Number of bits per sample or zero if unknown for the given sample format. - *) -function av_get_bits_per_sample_format(sample_fmt: TSampleFormat): cint; - cdecl; external av__codec; -{$IFEND} - -const - AV_PARSER_PTS_NB = 4; - PARSER_FLAG_COMPLETE_FRAMES = $0001; -{$IF LIBAVCODEC_VERSION >= 52070000} // 52.70.0 - PARSER_FLAG_ONCE = $0002; -{$IFEND} - -type - {* frame parsing *} - PAVCodecParserContext = ^TAVCodecParserContext; - PAVCodecParser = ^TAVCodecParser; - - TAVCodecParserContext = record - priv_data: pointer; - parser: PAVCodecParser; - frame_offset: cint64; (* offset of the current frame *) - cur_offset: cint64; (* current offset (incremented by each av_parser_parse()) *) - next_frame_offset: cint64; (* offset of the next frame *) - (* video info *) - pict_type: cint; (* XXX: put it back in AVCodecContext *) - (** - * This field is used for proper frame duration computation in lavf. - * It signals, how much longer the frame duration of the current frame - * is compared to normal frame duration. - * - * frame_duration = (1 + repeat_pict) * time_base - * - * It is used by codecs like H.264 to display telecined material. - *) - repeat_pict: cint; (* XXX: put it back in AVCodecContext *) - pts: cint64; (* pts of the current frame *) - dts: cint64; (* dts of the current frame *) - - (* private data *) - last_pts: cint64; - last_dts: cint64; - fetch_timestamp: cint; - - cur_frame_start_index: cint; - cur_frame_offset: array [0..AV_PARSER_PTS_NB - 1] of cint64; - cur_frame_pts: array [0..AV_PARSER_PTS_NB - 1] of cint64; - cur_frame_dts: array [0..AV_PARSER_PTS_NB - 1] of cint64; - - flags: cint; - - {$IF LIBAVCODEC_VERSION >= 51040003} // 51.40.3 - offset: cint64; ///< byte offset from starting packet start - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 51057001} // 51.57.1 - cur_frame_end: array [0..AV_PARSER_PTS_NB - 1] of cint64; - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52016000} // 52.16.0 - (*! - * 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 - * will be used. - *) - key_frame: cint; - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52018000} // 52.18.0 - (** - * Time difference in stream time base units from the pts of this - * packet to the point at which the output from the decoder has converged - * independent from the availability of previous frames. That is, the - * frames are virtually identical no matter if decoding started from - * the very first frame or from this keyframe. - * Is AV_NOPTS_VALUE if unknown. - * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY - * set. - * - * The purpose of this field is to allow seeking in streams that have no - * keyframes in the conventional sense. It corresponds to the - * recovery point SEI in H.264 and match_time_delta in NUT. It is also - * essential for some types of subtitle streams to ensure that all - * subtitles are correctly displayed after seeking. - *) - convergence_duration: cint64; - {$IFEND} - {$IF LIBAVCODEC_VERSION >= 52019000} // 52.19.0 - // Timestamp generation support: - (** - * Synchronization point for start of timestamp generation. - * - * Set to >0 for sync point, 0 for no sync point and <0 for undefined - * (default). - * - * For example, this corresponds to presence of H.264 buffering period - * SEI message. - *) - dts_sync_point: cint; - - (** - * Offset of the current timestamp against last timestamp sync point in - * units of AVCodecContext.time_base. - * - * Set to INT_MIN when dts_sync_point unused. Otherwise, it must - * contain a valid timestamp offset. - * - * Note that the timestamp of sync point has usually a nonzero - * dts_ref_dts_delta, which refers to the previous sync point. Offset of - * the next frame after timestamp sync point will be usually 1. - * - * For example, this corresponds to H.264 cpb_removal_delay. - *) - dts_ref_dts_delta: cint; - - (** - * Presentation delay of current frame in units of AVCodecContext.time_base. - * - * Set to INT_MIN when dts_sync_point unused. Otherwise, it must - * contain valid non-negative timestamp delta (presentation time of a frame - * must not lie in the past). - * - * This delay represents the difference between decoding and presentation - * time of the frame. - * - * For example, this corresponds to H.264 dpb_output_delay. - *) - pts_dts_delta: cint; - {$IFEND} - - {$IF LIBAVCODEC_VERSION >= 52021000} // 52.21.0 - (** - * Position of the packet in file. - * - * Analogous to cur_frame_pts/dts - *) - cur_frame_pos: array [0..AV_PARSER_PTS_NB - 1] of cint64; - - (** - * Byte position of currently parsed frame in stream. - *) - pos: cint64; - - (** - * Previous frame byte position. - *) - last_pos: cint64; - {$IFEND} - end; - - TAVCodecParser = record - codec_ids: array [0..4] of cint; (* several codec IDs are permitted *) - priv_data_size: cint; - parser_init: function(s: PAVCodecParserContext): cint; cdecl; - parser_parse: function(s: PAVCodecParserContext; - avctx: PAVCodecContext; - poutbuf: {const} PPointer; poutbuf_size: PCint; - buf: {const} PByteArray; buf_size: cint): cint; cdecl; - parser_close: procedure(s: PAVCodecParserContext); cdecl; - split: function(avctx: PAVCodecContext; buf: {const} PByteArray; - buf_size: cint): cint; cdecl; - next: PAVCodecParser; - end; - - -{$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 -{ -var - av_first_parser: PAVCodecParser; external av__codec; -} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 51049000} // 51.49.0 -function av_parser_next(c: PAVCodecParser): PAVCodecParser; - cdecl; external av__codec; -{$IFEND} - -procedure av_register_codec_parser(parser: PAVCodecParser); - cdecl; external av__codec; - -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} - -{$IF LIBAVCODEC_VERSION >= 52021000} // 52.21.0 -(** - * Parse a packet. - * - * @param s parser context. - * @param avctx codec context. - * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. - * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. - * @param buf input buffer. - * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output). - * @param pts input presentation timestamp. - * @param dts input decoding timestamp. - * @param pos input byte position in stream. - * @return the number of bytes of the input bitstream used. - * - * Example: - * @code - * while (in_len) do - * begin - * len := av_parser_parse2(myparser, AVCodecContext, data, size, - * in_data, in_len, - * pts, dts, pos); - * in_data := in_data + len; - * in_len := in_len - len; - * - * if (size) then - * decode_frame(data, size); - * end; - * @endcode - *) -function av_parser_parse2(s: PAVCodecParserContext; - avctx: PAVCodecContext; - poutbuf: PPointer; - poutbuf_size: PCint; - buf: {const} PByteArray; - buf_size: cint; - pts: cint64; - dts: cint64; - pos: cint64): cint; - cdecl; external av__codec; -{$IFEND} - -function av_parser_change(s: PAVCodecParserContext; - avctx: PAVCodecContext; - poutbuf: PPointer; poutbuf_size: PCint; - buf: {const} PByteArray; buf_size: cint; keyframe: cint): cint; - cdecl; external av__codec; -procedure av_parser_close(s: PAVCodecParserContext); - cdecl; external av__codec; - -type - PAVBitStreamFilterContext = ^TAVBitStreamFilterContext; - PAVBitStreamFilter = ^TAVBitStreamFilter; - - TAVBitStreamFilterContext = record - priv_data: pointer; - filter: PAVBitStreamFilter; - parser: PAVCodecParserContext; - next: PAVBitStreamFilterContext; - end; - - TAVBitStreamFilter = record - name: PAnsiChar; - priv_data_size: cint; - filter: function(bsfc: PAVBitStreamFilterContext; - avctx: PAVCodecContext; args: PByteArray; - poutbuf: PPointer; poutbuf_size: PCint; - buf: PByte; buf_size: cint; keyframe: cint): cint; cdecl; - {$IF LIBAVCODEC_VERSION >= 51043000} // 51.43.0 - close: procedure(bsfc: PAVBitStreamFilterContext); - {$IFEND} - next: PAVBitStreamFilter; - end; - -procedure av_register_bitstream_filter(bsf: PAVBitStreamFilter); - cdecl; external av__codec; - -function av_bitstream_filter_init(name: PAnsiChar): PAVBitStreamFilterContext; - cdecl; external av__codec; - -function av_bitstream_filter_filter(bsfc: PAVBitStreamFilterContext; - avctx: PAVCodecContext; args: PByteArray; - poutbuf: PPointer; poutbuf_size: PCint; - buf: PByte; buf_size: cint; keyframe: cint): cint; - cdecl; external av__codec; - -procedure av_bitstream_filter_close(bsf: PAVBitStreamFilterContext); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 51049000} // 51.49.0 -function av_bitstream_filter_next(f: PAVBitStreamFilter): PAVBitStreamFilter; - cdecl; external av__codec; -{$IFEND} - -(* memory *) - -(** - * Reallocate the given block if it is not large enough, otherwise do nothing. - * - * @see av_realloc - *) -procedure av_fast_realloc(ptr: pointer; size: PCuint; min_size: cuint); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 52025000} // >= 52.25.0 -(** - * Allocate a buffer, reusing the given one if large enough. - * - * Contrary to av_fast_realloc the current buffer contents might not be - * preserved and on error the old buffer is freed, thus no special - * handling to avoid memleaks is necessary. - * - * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer - * @param size size of the buffer *ptr points to - * @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: cuint); - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION < 51057000} // 51.57.0 -(* for static data only *) - -(** - * Frees all static arrays and resets their pointers to 0. - * Call this function to release all statically allocated tables. - * - * @deprecated. Code which uses av_free_static is broken/misdesigned - * and should correctly use static arrays - * - *) -procedure av_free_static(); - cdecl; external av__codec; deprecated; - -(** - * Allocation of static arrays. - * - * @warning Do not use for normal allocation. - * - * @param[in] size The amount of memory you need in bytes. - * @return block of memory of the requested size - * @deprecated. Code which uses av_mallocz_static is broken/misdesigned - * and should correctly use static arrays - *) -procedure av_mallocz_static(size: cuint); - cdecl; external av__codec; deprecated; {av_malloc_attrib av_alloc_size(1)} -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52085000} // 52.85.0 -(** - * Copy image data in src_data to dst_data. - * - * @param dst_linesize linesizes for the image in dst_data - * @param src_linesize linesizes for the image in src_data - *) -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; -{$IFEND} - -{$IF LIBAVCODEC_VERSION < 51035000} // 51.35.0 -procedure av_realloc_static(ptr: pointer; size: cuint); - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 51039000} // 51.39.0 -(** - * Copy image src to dst. Wraps av_picture_data_copy() above. - *) -procedure av_picture_copy(dst: PAVPicture; - src: {const} PAVPicture; -{$IF LIBAVCODEC_VERSION < 52022001} // 52.22.1 - pix_fmt: cint; -{$ELSE} - pix_fmt: TAVPixelFormat; -{$IFEND} - width: cint; - height: cint); - cdecl; external av__codec; - -(** - * Crop image top and left side. - *) -function av_picture_crop(dst: PAVPicture; - src: {const} PAVPicture; -{$IF LIBAVCODEC_VERSION < 52022001} // 52.22.1 - pix_fmt: cint; -{$ELSE} - pix_fmt: TAVPixelFormat; -{$IFEND} - top_band: cint; - left_band: cint): cint; - cdecl; external av__codec; - -(** - * Pad image. - *) -function av_picture_pad(dst: PAVPicture; - src: {const} PAVPicture; - height: cint; - width: cint; -{$IF LIBAVCODEC_VERSION < 52022001} // 52.22.1 - pix_fmt: cint; -{$ELSE} - pix_fmt: TAVPixelFormat; -{$IFEND} - padtop: cint; - padbottom: cint; - padleft: cint; - padright: - cint; - color: PCint): cint; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION < 52000000} // 52.0.0 -(** - * @deprecated Use the software scaler (swscale) instead. - *) -procedure img_copy(dst: PAVPicture; src: {const} PAVPicture; - pix_fmt: TAVPixelFormat; width: cint; height: cint); - cdecl; external av__codec; deprecated; - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -function img_crop(dst: PAVPicture; src: {const} PAVPicture; - pix_fmt: TAVPixelFormat; top_band, left_band: cint): cint; - cdecl; external av__codec; deprecated; - -(** - * @deprecated Use the software scaler (swscale) instead. - *) -function img_pad(dst: PAVPicture; src: {const} PAVPicture; height, width: cint; - pix_fmt: TAVPixelFormat; padtop, padbottom, padleft, padright: cint; - color: PCint): cint; - cdecl; external av__codec; deprecated; -{$IFEND} - -(** - * Encode extradata length to a buffer. Used by xiph codecs. - * - * @param s buffer to write to; must be at least (v/255+1) bytes long - * @param v size of extradata in bytes - * @return number of bytes written to the buffer. - *) -function av_xiphlacing(s: PByte; v: cuint): cuint; - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION_MAJOR < 53} // < 53 -{$IF LIBAVCODEC_VERSION >= 51041000} // >= 51.41.0 -(** - * Parse str and put in width_ptr and height_ptr the detected values. - * -{$IF LIBAVCODEC_VERSION >= 52084001} // >= 52.84.1 - * @deprecated Deprecated in favor of av_parse_video_size(). -{$ELSE} - * @return 0 in case of a successful parsing, a negative value otherwise - * @param[in] str the string to parse: it has to be a string in the format - * width x height or a valid video frame size abbreviation. - * @param[in,out] width_ptr pointer to the variable which will contain the detected - * frame width value - * @param[in,out] height_ptr pointer to the variable which will contain the detected - * frame height value -{$IFEND} - *) -function av_parse_video_frame_size(width_ptr: PCint; height_ptr: PCint; str: {const} PAnsiChar): cint; - cdecl; external av__codec; -{$IF LIBAVCODEC_VERSION >= 52084001} // >= 52.84.1 - deprecated; -{$IFEND} - -(** - * Parse str and store the detected values in *frame_rate. - * -{$IF LIBAVCODEC_VERSION >= 52084001} // >= 52.84.1 - * @deprecated Deprecated in favor of av_parse_video_rate(). -{$ELSE} - * @return 0 in case of a successful parsing, a negative value otherwise - * @param[in] str the string to parse: it has to be a string in the format - * frame_rate_num / frame_rate_den, a float number or a valid video rate abbreviation - * @param[in,out] frame_rate pointer to the AVRational which will contain the detected - * frame rate -{$IFEND} - *) -function av_parse_video_frame_rate(frame_rate: PAVRational; str: {const} PAnsiChar): cint; - cdecl; external av__codec; -{$IF LIBAVCODEC_VERSION >= 52084001} // >= 52.84.1 - deprecated; -{$IFEND} -{$IFEND} -{$IFEND} - -{$IF LIBAVCODEC_VERSION < 52059000} // <52.59.0 - -{ - The following error codes are moved to libavutil/error.h on - revision 22501 Mar 13 2010 -} - -{* error handling *} - -const -{$IFDEF UNIX} - ENOENT = ESysENOENT; - EIO = ESysEIO; - ENOMEM = ESysENOMEM; - EINVAL = ESysEINVAL; - EDOM = ESysEDOM; - ENOSYS = ESysENOSYS; - EILSEQ = ESysEILSEQ; - EPIPE = ESysEPIPE; -{$ELSE} - ENOENT = 2; - EIO = 5; - ENOMEM = 12; - EINVAL = 22; - EPIPE = 32; // just an assumption. needs to be checked. - EDOM = 33; - {$IFDEF MSWINDOWS} - // Note: we assume that ffmpeg was compiled with MinGW. - // This must be changed if DLLs were compiled with cygwin. - ENOSYS = 40; // MSVC/MINGW: 40, CYGWIN: 88, LINUX/FPC: 38 - EILSEQ = 42; // MSVC/MINGW: 42, CYGWIN: 138, LINUX/FPC: 84 - {$ENDIF} -{$ENDIF} - -(** - * We need the sign of the error, because some platforms have - * E* and errno already negated. The previous version failed - * with Delphi, because it needed EINVAL defined. - * Warning: This code is platform dependent and assumes constants - * to be 32 bit. - * This version does the following steps: - * 1) shr 30: shifts the sign bit to bit position 2 - * 2) and $00000002: sets all other bits to zero - * positive EINVAL gives 0, negative gives 2 - * 3) - 1: positive EINVAL gives -1, negative 1 - *) -const - AVERROR_SIGN = (EINVAL shr 30) and $00000002 - 1; - -(* -#if EINVAL > 0 -#define AVERROR(e) (-(e)) {**< Returns a negative error code from a POSIX error code, to return from library functions. *} -#define AVUNERROR(e) (-(e)) {**< Returns a POSIX error code from a library function error return value. *} -#else -{* Some platforms have E* and errno already negated. *} -#define AVERROR(e) (e) -#define AVUNERROR(e) (e) -#endif -*) - -const - AVERROR_UNKNOWN = AVERROR_SIGN * EINVAL; (**< unknown error *) - AVERROR_IO = AVERROR_SIGN * EIO; (**< I/O error *) - AVERROR_NUMEXPECTED = AVERROR_SIGN * EDOM; (**< Number syntax expected in filename. *) - AVERROR_INVALIDDATA = AVERROR_SIGN * EINVAL; (**< invalid data found *) - AVERROR_NOMEM = AVERROR_SIGN * ENOMEM; (**< not enough memory *) - AVERROR_NOFMT = AVERROR_SIGN * EILSEQ; (**< unknown format *) - AVERROR_NOTSUPP = AVERROR_SIGN * ENOSYS; (**< Operation not supported. *) - AVERROR_NOENT = AVERROR_SIGN * ENOENT; (**< No such file or directory. *) -{$IF LIBAVCODEC_VERSION >= 52017000} // 52.17.0 - AVERROR_EOF = AVERROR_SIGN * EPIPE; (**< End of file. *) -{$IFEND} - // Note: function calls as constant-initializers are invalid - //AVERROR_PATCHWELCOME = -MKTAG('P','A','W','E'); {**< Not yet implemented in FFmpeg. Patches welcome. *} - AVERROR_PATCHWELCOME = -(ord('P') or (ord('A') shl 8) or (ord('W') shl 16) or (ord('E') shl 24)); -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52032000} // >= 52.32.0 -(** - * Log a generic warning message about a missing feature. This function is - * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) - * only, and would normally not be used by applications. - * @param[in] avc a pointer to an arbitrary struct of which the first field is - * a pointer to an AVClass struct - * @param[in] feature string containing the name of the missing feature - * @param[in] want_sample indicates if samples are wanted which exhibit this feature. - * If want_sample is non-zero, additional verbage will be added to the log - * message which tells the user how to report samples to the development - * mailing list. - *) -procedure av_log_missing_feature(avc: Pointer; feature: {const} Pchar; want_sample: cint); - cdecl; external av__codec; - -(** - * Log a generic warning message asking for a sample. This function is - * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) - * only, and would normally not be used by applications. - * @param[in] avc a pointer to an arbitrary struct of which the first field is - * 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} Pchar); - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52018000} // 52.18.0 -(** - * Register the hardware accelerator hwaccel. - *) -procedure av_register_hwaccel (hwaccel: PAVHWAccel) - cdecl; external av__codec; - -(** - * If hwaccel is NULL, returns the first registered hardware accelerator, - * if hwaccel is non-NULL, returns the next registered hardware accelerator - * after hwaccel, or NULL if hwaccel is the last one. - *) -function av_hwaccel_next (hwaccel: PAVHWAccel): PAVHWAccel; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52030000} // 52.30.0 -(** - * Lock operation used by lockmgr - *) -type - TAVLockOp = ( - AV_LOCK_CREATE, ///< Create a mutex - AV_LOCK_OBTAIN, ///< Lock the mutex - AV_LOCK_RELEASE, ///< Unlock the mutex - AV_LOCK_DESTROY ///< Free mutex resources - ); - -(** - * Register a user provided lock manager supporting the operations - * specified by AVLockOp. mutex points to a (void) where the - * lockmgr should store/get a pointer to a user allocated mutex. It's - * NULL upon AV_LOCK_CREATE and != NULL for all other ops. - * - * @param cb User defined callback. Note: FFmpeg may invoke calls to this - * callback during the call to av_lockmgr_register(). - * Thus, the application must be prepared to handle that. - * If cb is set to NULL the lockmgr will be unregistered. - * Also note that during unregistration the previously registered - * lockmgr callback may also be invoked. - *) -// ToDo: Implement and test this -//function av_lockmgr_register(cb: function (mutex: pointer; op: TAVLockOp)): cint; -// cdecl; external av__codec; -{$IFEND} - -implementation - -{$IF (LIBAVCODEC_VERSION >= 52025000) and (LIBAVCODEC_VERSION <= 52027000)} // 52.25.0 - 52.27.0 -procedure av_free_packet(pkt: PAVPacket);{$IFDEF HASINLINE} inline; {$ENDIF} -begin - if assigned(pkt) then - begin - if assigned(pkt^.destruct) then - pkt^.destruct(pkt); - pkt^.data := NIL; - pkt^.size := 0; - end; -end; -{$IFEND} - -end. diff --git a/mediaplugin/src/lib/ffmpeg/avformat.pas b/mediaplugin/src/lib/ffmpeg/avformat.pas deleted file mode 100644 index bd13c70e..00000000 --- a/mediaplugin/src/lib/ffmpeg/avformat.pas +++ /dev/null @@ -1,2100 +0,0 @@ -(* - * copyright (c) 2001 Fabrice Bellard - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavformat/avformat.h - * Min. version: 50.5.0 , revision 6577, Sat Oct 7 15:30:46 2006 UTC - * Max. version: 52.78.3, revision 24841, Thu Aug 26 02:00:00 2010 CET - *) - -unit avformat; - -{$IFDEF FPC} - {$MODE DELPHI } - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$I switches.inc} (* for the HasInline define *) - -{$IFDEF DARWIN} - {$linklib libavformat} -{$ENDIF} - -interface - -uses - ctypes, - avcodec, - avutil, - avio, - rational, - SysUtils, - UConfig; - -const - (* - * IMPORTANT: The official FFmpeg C headers change very quickly. Often some - * of the data structures are changed so that they become incompatible with - * older header files. The Pascal headers have to be adjusted to those changes, - * otherwise the application might crash randomly or strange bugs (not - * necessarily related to video or audio due to buffer overflows etc.) might - * occur. - * - * In the past users reported problems with USDX that took hours to fix and - * the problem was an unsupported version of FFmpeg. So we decided to disable - * support for future versions of FFmpeg until the headers are revised by us - * for that version as they otherwise most probably will break USDX. - * - * If the headers do not yet support your FFmpeg version you may want to - * adjust the max. version numbers manually but please note: it may work but - * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT - * for the game if the MAX. VERSION WAS CHANGED. - * - * The only safe way to support new versions of FFmpeg is to add the changes - * of the FFmpeg git repository C headers to the Pascal headers. - * You can accelerate this process by posting a patch with the git changes - * translated to Pascal to our bug tracker (please join our IRC chat before - * you start working on it). Simply adjusting the max. versions is NOT a valid - * fix. - *) - (* Max. supported version by this header *) - LIBAVFORMAT_MAX_VERSION_MAJOR = 52; - LIBAVFORMAT_MAX_VERSION_MINOR = 78; - LIBAVFORMAT_MAX_VERSION_RELEASE = 3; - LIBAVFORMAT_MAX_VERSION = (LIBAVFORMAT_MAX_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVFORMAT_MAX_VERSION_MINOR * VERSION_MINOR) + - (LIBAVFORMAT_MAX_VERSION_RELEASE * VERSION_RELEASE); - - (* Min. supported version by this header *) - LIBAVFORMAT_MIN_VERSION_MAJOR = 50; - LIBAVFORMAT_MIN_VERSION_MINOR = 5; - LIBAVFORMAT_MIN_VERSION_RELEASE = 0; - LIBAVFORMAT_MIN_VERSION = (LIBAVFORMAT_MIN_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVFORMAT_MIN_VERSION_MINOR * VERSION_MINOR) + - (LIBAVFORMAT_MIN_VERSION_RELEASE * VERSION_RELEASE); - -(* Check if linked versions are supported *) -{$IF (LIBAVFORMAT_VERSION < LIBAVFORMAT_MIN_VERSION)} - {$MESSAGE Error 'Linked version of libavformat is too old!'} -{$IFEND} - -(* Check if linked versions are supported *) -{$IF (LIBAVFORMAT_VERSION > LIBAVFORMAT_MAX_VERSION)} - {$MESSAGE Error 'Linked version of libavformat is not yet supported!'} -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52078003} // >= 52.78.3 -(** - * Those FF_API_* defines are not part of public API. - * They may change, break or disappear at any time. - *) -const - {$IF LIBAVFORMAT_VERSION_MAJOR < 53} - FF_API_MAX_STREAMS = (LIBAVFORMAT_VERSION_MAJOR < 53); - FF_API_OLD_METADATA = (LIBAVFORMAT_VERSION_MAJOR < 53); - FF_API_REGISTER_PROTOCOL = (LIBAVFORMAT_VERSION_MAJOR < 53); - FF_API_URL_RESETBUF = (LIBAVFORMAT_VERSION_MAJOR < 53); - {$ELSE} - FF_API_URL_CLASS = (LIBAVFORMAT_VERSION_MAJOR >= 53); - {$IFEND} -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52020000} // 52.20.0 -(** - * I return the LIBAVFORMAT_VERSION_INT constant. You got - * a fucking problem with that, douchebag? - *) -function avformat_version(): cuint; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52039002} // 52.39.2 -(** - * Return the libavformat build-time configuration. - *) -function avformat_configuration(): {const} PansiChar; - cdecl; external av__format; - -(** - * Return the libavformat license. - *) -function avformat_license(): {const} PansiChar; - cdecl; external av__format; -{$IFEND} - -type - PAVFile = Pointer; - -(* - * Public Metadata API. - * 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 - * 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 - * 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 - * 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. A tag whose value is localized for a particular language is appended - * with a dash character ('-') and 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. - *) -const - AV_METADATA_MATCH_CASE = 1; - AV_METADATA_IGNORE_SUFFIX = 2; -{$IF LIBAVFORMAT_VERSION >= 52043000} // >= 52.43.0 - AV_METADATA_DONT_STRDUP_KEY = 4; - AV_METADATA_DONT_STRDUP_VAL = 8; -{$IFEND} -{$IF LIBAVFORMAT_VERSION >= 52061000} // >= 52.61.0 - AV_METADATA_DONT_OVERWRITE = 16; -{$IFEND} - -type - PAVMetadataTag = ^TAVMetadataTag; - TAVMetadataTag = record - key: PAnsiChar; - value: PAnsiChar; - end; - - PAVMetadata = Pointer; - -{$IF LIBAVFORMAT_VERSION > 52024001} // > 52.24.1 -(** - * Get a metadata element with matching key. - * - * @param prev Set to the previous matching element to find the next. - * If set to NULL the first matching element is returned. - * @param flags Allows case as well as suffix-insensitive comparisons. - * @return Found tag or NULL, changing key or value leads to undefined behavior. - *) -function av_metadata_get(m: PAVMetadata; key: {const} PAnsiChar; - prev: {const} PAVMetadataTag ; flags: cint): PAVMetadataTag; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 -(** - * 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; - {$IF LIBAVFORMAT_VERSION >= 52061000} // >= 52.61.0 - deprecated; - {$IFEND} -{$ELSE} - {$IFDEF 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} -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52043000} // >= 52.43.0 -(** - * 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 depending on flags) - * @param value tag value to add to *pm (will be av_strduped depending on flags). - * Passing a NULL value will cause an existing tag to be deleted. - * @return >= 0 on success otherwise an error code <0 - *) -function av_metadata_set2(var pm: PAVMetadata; key: {const} PAnsiChar; value: {const} PAnsiChar; flags: cint): cint; - cdecl; external av__format; -{$IFEND} - -(** - * Free all the memory allocated for an AVMetadata struct. - *) -procedure av_metadata_free(var m: PAVMetadata); - cdecl; external av__format; -{$IFEND} - -(* packet functions *) - -{$IF LIBAVFORMAT_VERSION < 52032000} // < 52.32.0 -type - PAVPacket = ^TAVPacket; - TAVPacket = record - (** - * Presentation timestamp in time_base units; the time at which the - * decompressed packet will be presented to the user. - * Can be AV_NOPTS_VALUE if it is not stored in the file. - * pts MUST be larger or equal to dts as presentation can not happen before - * decompression, unless one wants to view hex dumps. Some formats misuse - * the terms dts and pts/cts to mean something different. Such timestamps - * must be converted to true pts/dts before they are stored in AVPacket. - *) - pts: cint64; - (** - * Decompression timestamp in time_base units; the time at which the - * packet is decompressed. - * Can be AV_NOPTS_VALUE if it is not stored in the file. - *) - dts: cint64; - data: PByteArray; - size: cint; - stream_index: cint; - flags: cint; - (** - * Duration of this packet in time_base units, 0 if unknown. - * Equals next_pts - this_pts in presentation order. - *) - duration: cint; - destruct: procedure (p: PAVPacket); cdecl; - priv: pointer; - pos: cint64; ///< byte position in stream, -1 if unknown - - {$IF LIBAVFORMAT_VERSION >= 52022000} // 52.22.0 - (** - * Time difference in stream time base units from the pts of this - * packet to the point at which the output from the decoder has converged - * independent from the availability of previous frames. That is, the - * frames are virtually identical no matter if decoding started from - * the very first frame or from this keyframe. - * Is AV_NOPTS_VALUE if unknown. - * This field is not the display duration of the current packet. - * - * The purpose of this field is to allow seeking in streams that have no - * keyframes in the conventional sense. It corresponds to the - * recovery point SEI in H.264 and match_time_delta in NUT. It is also - * essential for some types of subtitle streams to ensure that all - * subtitles are correctly displayed after seeking. - *) - convergence_duration: cint64; - {$IFEND} - end; - -const - PKT_FLAG_KEY = $0001; - -procedure av_destruct_packet_nofree(var pkt: TAVPacket); - cdecl; external av__format; - -(** - * Default packet destructor. - *) -procedure av_destruct_packet(var pkt: TAVPacket); - cdecl; external av__format; - -(** - * Initialize optional fields of a packet with default values. - * - * @param pkt packet - *) -procedure av_init_packet(var pkt: TAVPacket); -{$IF LIBAVFORMAT_VERSION >= 51012002} // 51.12.2 - cdecl; external av__format; -{$IFEND} - -(** - * Allocate the payload of a packet and initialize its fields with - * default values. - * - * @param pkt packet - * @param size wanted payload size - * @return 0 if OK, AVERROR_xxx otherwise - *) -function av_new_packet(var pkt: TAVPacket; size: cint): cint; - cdecl; external av__format; -{$IFEND} - -(** - * Allocate and read the payload of a packet and initialize its fields with - * default values. - * - * @param pkt packet - * @param size desired payload size - * @return >0 (read size) if OK, AVERROR_xxx otherwise - *) -function av_get_packet(s: PByteIOContext; var pkt: TAVPacket; size: cint): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION < 52032000} // < 52.32.0 -(** - * @warning This is a hack - the packet memory allocation stuff is broken. The - * packet is allocated if it was not really allocated. - *) -function av_dup_packet(pkt: PAVPacket): cint; - cdecl; external av__format; - -(** - * Free a packet. - * - * @param pkt packet to free - *) -procedure av_free_packet(pkt: PAVPacket); {$IFDEF HasInline}inline;{$ENDIF} -{$IFEND} - -(*************************************************) -(* fractional numbers for exact pts handling *) - -type - (** - * The exact value of the fractional number is: 'val + num / den'. - * num is assumed to be 0 <= num < den. - *) - PAVFrac = ^TAVFrac; - TAVFrac = record - val, num, den: cint64; - end; - -(*************************************************) -(* input/output formats *) - -type - (** - * This structure contains the data a format has to probe a file. - *) - TAVProbeData = record - filename: PAnsiChar; - buf: PByteArray; (**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. *) - buf_size: cint; (**< Size of buf except extra allocated bytes *) - end; - -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. - AVFMT_NOFILE = $0001; - AVFMT_NEEDNUMBER = $0002; (**< Needs '%d' in filename. *) - AVFMT_SHOW_IDS = $0008; (**< Show format stream IDs numbers. *) - AVFMT_RAWPICTURE = $0020; (**< Format wants AVPicture structure for - raw picture data. *) - AVFMT_GLOBALHEADER = $0040; (**< Format wants global header. *) - AVFMT_NOTIMESTAMPS = $0080; (**< Format does not need / have any timestamps. *) - AVFMT_GENERIC_INDEX = $0100; (**< Use generic index building code. *) - AVFMT_TS_DISCONT = $0200; (**< Format allows timestamp discontinuities. *) - {$IF LIBAVFORMAT_VERSION >= 52029002} // 52.29.2 - AVFMT_VARIABLE_FPS = $0400; (**< Format allows variable fps. *) - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52052000} // 52.52.0 - AVFMT_NODIMENSIONS = $0800; (**< Format does not need width/height *) - {$IFEND} - - // used by AVIndexEntry - AVINDEX_KEYFRAME = $0001; - - AVFMTCTX_NOHEADER = $0001; (**< signal that no header is present - (streams are added dynamically) *) - -{$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - {$IF LIBAVFORMAT_VERSION_MAJOR < 53} - MAX_STREAMS = 20; - {$ELSE} - {$IF LIBAVFORMAT_VERSION < 52068000} // < 52.68.0 - MAX_STREAMS = 100; - {$IFEND} - {$IFEND} -{$ELSE} - {$IFDEF FF_API_MAX_STREAMS} - MAX_STREAMS = 20; - {$ENDIF} -{$IFEND} - - - AVFMT_NOOUTPUTLOOP = -1; - AVFMT_INFINITEOUTPUTLOOP = 0; - AVFMT_FLAG_GENPTS = $0001; ///< Generate missing pts even if it requires parsing future frames. - AVFMT_FLAG_IGNIDX = $0002; ///< Ignore index. - AVFMT_FLAG_NONBLOCK = $0004; ///< Do not block when reading packets from input. -{$IF LIBAVFORMAT_VERSION >= 52048000} // >= 52.48.0 - AVFMT_FLAG_IGNDTS = $0008; ///< Ignore DTS on frames that contain both DTS & PTS -{$IFEND} -{$IF LIBAVFORMAT_VERSION >= 52060000} // >= 52.60.0 - AVFMT_FLAG_NOFILLIN = $0010; ///< Do not infer any values from other values, just return what is stored in the container - 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 -{$IFEND} -{$IF LIBAVFORMAT_VERSION >= 52063000} // >= 52.63.0 - AVFMT_FLAG_RTP_HINT = $0040; ///< Add RTP hinting to the output file -{$IFEND} - - // used by AVStream - MAX_REORDER_DELAY = 16; - - // used by TAVProgram - AV_PROGRAM_RUNNING = 1; - - - AV_DISPOSITION_DEFAULT = $0001; - AV_DISPOSITION_DUB = $0002; - AV_DISPOSITION_ORIGINAL = $0004; - AV_DISPOSITION_COMMENT = $0008; - AV_DISPOSITION_LYRICS = $0010; - AV_DISPOSITION_KARAOKE = $0020; - - {$IF LIBAVFORMAT_VERSION >= 52073000} // >= 52.73.0 - (** - * Track should be used during playback by default. - * Useful for subtitle track that should be displayed - * even when user did not explicitly ask for subtitles. - *) - AV_DISPOSITION_FORCED = $0040; - {$IFEND} - - // used by TAVFormatContext.debug - FF_FDEBUG_TS = 0001; - - {$IF LIBAVFORMAT_VERSION >= 52034000} // >= 52.34.0 - {$IF LIBAVFORMAT_VERSION < 52039000} // < 52.39.0 - MAX_PROBE_PACKETS = 100; - {$ELSE} - MAX_PROBE_PACKETS = 2500; - {$IFEND} - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52035000} // >= 52.35.0 - {$IF LIBAVFORMAT_VERSION < 52039000} // < 52.39.0 - RAW_PACKET_BUFFER_SIZE = 32000; - {$ELSE} - RAW_PACKET_BUFFER_SIZE = 2500000; - {$IFEND} - {$IFEND} - -type - PPAVCodecTag = ^PAVCodecTag; - PAVCodecTag = Pointer; - - PPAVFormatContext = ^PAVFormatContext; - PAVFormatContext = ^TAVFormatContext; - - PAVFormatParameters = ^TAVFormatParameters; - - PAVOutputFormat = ^TAVOutputFormat; - PAVProbeData = ^TAVProbeData; - - PAVInputFormat = ^TAVInputFormat; - PAVIndexEntry = ^TAVIndexEntry; - - PAVStream = ^TAVStream; - PAVPacketList = ^TAVPacketList; - - PPAVProgram = ^PAVProgram; - PAVProgram = ^TAVProgram; - - {$IF LIBAVFORMAT_VERSION < 51006000} // 51.6.0 - PAVImageFormat = ^TAVImageFormat; - PAVImageInfo = ^TAVImageInfo; - {$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52030001} // >= 52.30.1 -(** - * Convert all the metadata sets from ctx according to the source and - * destination conversion tables. - * - * @param d_conv destination tags format conversion table - * @param s_conv source tags format conversion table - *) - PAVMetadataConv = ^TAVMetadataConv; - TAVMetadataConv = record - ctx: PAVFormatContext; - d_conv: {const} PAVMetadataConv; - s_conv: {const} PAVMetadataConv; - end; -{$IFEND} - - 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 LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - title: PAnsiChar; ///< chapter title - {$ELSE} - {$IFDEF FF_API_OLD_METADATA} - title: PAnsiChar; ///< chapter title - {$ENDIF} - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52024001} // 52.24.1 - metadata: PAVMetadata; - {$IFEND} - end; - TAVChapterArray = array[0..(MaxInt div SizeOf(TAVChapter))-1] of TAVChapter; - PAVChapterArray = ^TAVChapterArray; - - TAVFormatParameters = record - time_base: TAVRational; - sample_rate: cint; - channels: cint; - width: cint; - height: cint; - pix_fmt: TAVPixelFormat; - {$IF LIBAVFORMAT_VERSION < 51006000} // 51.6.0 - image_format: PAVImageFormat; - {$IFEND} - channel: cint; (**< Used to select DV channel. *) - {$IF LIBAVFORMAT_VERSION_MAJOR < 52} - device: PAnsiChar; (* video, audio or DV device, if LIBAVFORMAT_VERSION_INT < (52<<16) *) - {$IFEND} - standard: PAnsiChar; (**< TV standard, NTSC, PAL, SECAM *) - { Delphi does not support bit fields -> use bf_flags instead - unsigned int mpeg2ts_raw:1; (**< Force raw MPEG-2 transport stream output, if possible. *) - unsigned int mpeg2ts_compute_pcr:1; (**< Compute exact PCR for each transport - stream packet (only meaningful if - mpeg2ts_raw is TRUE). *) - unsigned int initial_pause:1; (**< Do not begin to play the stream - immediately (RTSP only). *) - unsigned int prealloced_context:1; - } - bf_flags: byte; // 0:mpeg2ts_raw/1:mpeg2ts_compute_pcr/2:initial_pause/3:prealloced_context - {$IF LIBAVFORMAT_VERSION_MAJOR < 53} - video_codec_id: TCodecID; - audio_codec_id: TCodecID; - {$IFEND} - end; - - TAVOutputFormat = record - name: PAnsiChar; - (** - * Descriptive name for the format, meant to be more human-readable - * than name. You should use the NULL_IF_CONFIG_SMALL() macro - * to define it. - *) - long_name: PAnsiChar; - mime_type: PAnsiChar; - extensions: PAnsiChar; (**< comma-separated filename extensions *) - (** - * size of private data so that it can be allocated in the wrapper - *) - priv_data_size: cint; - (* output support *) - audio_codec: TCodecID; (**< default audio codec *) - video_codec: TCodecID; (**< default video codec *) - write_header: function (c: PAVFormatContext): cint; cdecl; - 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. - *) - set_parameters: function (c: PAVFormatContext; f: PAVFormatParameters): cint; cdecl; - interleave_packet: function (s: PAVFormatContext; out_: PAVPacket; - in_: PAVPacket; flush: cint): cint; cdecl; - - {$IF LIBAVFORMAT_VERSION >= 51008000} // 51.8.0 - (** - * List of supported codec_id-codec_tag pairs, ordered by "better - * choice first". The arrays are all terminated by CODEC_ID_NONE. - *) - codec_tag: {const} PPAVCodecTag; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 51012002} // 51.12.2 - subtitle_codec: TCodecID; (**< default subtitle codec *) - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52030001} // 52.30.1 - {const} metadata_conv: PAVMetadataConv; - {$IFEND} - - (* private fields *) - next: PAVOutputFormat; - end; - - TAVInputFormat = record - (** - * A comma separated list of short names for the format. New names - * may be appended with a minor bump. - *) - name: PAnsiChar; - - (** - * Descriptive name for the format, meant to be more human-readable - * than name. You should use the NULL_IF_CONFIG_SMALL() macro - * to define it. - *) - long_name: PAnsiChar; - - (** - * Size of private data so that it can be allocated in the wrapper. - *) - priv_data_size: cint; - - (** - * Tell if a given file has a chance of being parsed as this format. - * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes - * big so you do not have to check for that unless you need more. - *) - read_probe: function (p: PAVProbeData): cint; cdecl; - - (** - * Read the format header and initialize the AVFormatContext - * structure. Return 0 if OK. 'ap' if non-NULL contains - * additional parameters. Only used in raw format right - * now. 'av_new_stream' should be called to create new streams. - *) - read_header: function (c: PAVFormatContext; ap: PAVFormatParameters): cint; cdecl; - - (** - * Read one packet and put it in 'pkt'. pts and flags are also - * set. 'av_new_stream' can be called only if the flag - * AVFMTCTX_NOHEADER is used. - * @return 0 on success, < 0 on error. - * When returning an error, pkt must not have been allocated - * or must be freed before returning - *) - read_packet: function (c: PAVFormatContext; var pkt: TAVPacket): cint; cdecl; - - (** - * Close the stream. The AVFormatContext and AVStreams are not - * freed by this function - *) - read_close: function (c: PAVFormatContext): cint; cdecl; - -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} - (** - * Seek to a given timestamp relative to the frames in - * stream component stream_index. - * @param stream_index Must not be -1. - * @param flags Selects which direction should be preferred if no exact - * match is available. - * @return >= 0 on success (but not necessarily the new offset) - *) - read_seek: function (c: PAVFormatContext; stream_index: cint; - timestamp: cint64; flags: cint): cint; cdecl; -{$IFEND} - - (** - * Gets 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. - *) - flags: cint; - - (** - * If extensions are defined, then no probe is done. You should - * usually not use extension format guessing because it is not - * reliable enough - *) - extensions: PAnsiChar; - - (** - * General purpose read-only value that the format can use. - *) - value: cint; - - (** - * Start/resume playing - only meaningful if using a network-based format - * (RTSP). - *) - read_play: function (c: PAVFormatContext): cint; cdecl; - - (** - * Pause playing - only meaningful if using a network-based format - * (RTSP). - *) - read_pause: function (c: PAVFormatContext): cint; cdecl; - - {$IF LIBAVFORMAT_VERSION >= 51008000} // 51.8.0 - codec_tag: {const} PPAVCodecTag; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52030000} // 52.30.0 - (** - * 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. - *) - read_seek2: function (s: PAVFormatContext; - stream_index: cint; - min_ts: cint64; - ts: cint64; - max_ts: cint64; - flags: cint): cint; cdecl; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52030001} // 52.30.1 - {const} metadata_conv: PAVMetadataConv; - {$IFEND} - - (* private fields *) - next: PAVInputFormat; - end; - - TAVStreamParseType = ( - AVSTREAM_PARSE_NONE, - AVSTREAM_PARSE_FULL, (**< full parsing and repack *) - AVSTREAM_PARSE_HEADERS, (**< Only parse headers, do not repack. *) - AVSTREAM_PARSE_TIMESTAMPS (**< full parsing and interpolation of timestamps for frames not starting on a packet boundary *) - {$IF LIBAVFORMAT_VERSION >= 52066000} // 52.66.0 - , AVSTREAM_PARSE_FULL_ONCE (**< full parsing and repack of the first frame only, only implemented for H.264 currently *) - {$IFEND} - ); - - TAVIndexEntry = record - pos: cint64; - timestamp: cint64; - { 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). - } - flags_size: cint; // 0..1: flags, 2..31: size - min_distance: cint; (**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. *) - end; - - (** - * Stream 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. - * sizeof(AVStream) must not be used outside libav*. - *) - TAVStream = record - index: cint; (**< stream index in AVFormatContext *) - id: cint; (**< format-specific stream ID *) - codec: PAVCodecContext; (**< codec context *) - (** - * Real base framerate of the stream. - * This is the lowest framerate with which all timestamps can be - * represented accurately (it is the least common multiple of all - * framerates in the stream). Note, this value is just a guess! - * For example, if the time base is 1/90000 and all frames have either - * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. - *) - r_frame_rate: TAVRational; - priv_data: pointer; - - (* internal data used in av_find_stream_info() *) - first_dts: cint64; - {$IF LIBAVFORMAT_VERSION_MAJOR < 52} - codec_info_nb_frames: cint; - {$IFEND} - - (** - * 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. - *) - time_base: TAVRational; - pts_wrap_bits: cint; (* number of bits in pts (used for wrapping control) *) - (* ffmpeg.c private use *) - stream_copy: cint; (**< If set, just copy stream. *) - discard: TAVDiscard; ///< Selects which packets can be discarded at will and do not need to be demuxed. - //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; - - (** - * Decoding: pts of the first frame of the stream, 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). - * @note The ASF header does NOT contain a correct start_time the ASF - * demuxer must NOT set this. - *) - start_time: cint64; - - (** - * Decoding: duration of the stream, in stream time base. - * If a source file does not specify a duration, but does specify - * a bitrate, this value will be estimated from bitrate and file size. - *) - duration: cint64; - - {$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - language: array [0..3] of PAnsiChar; (**< ISO 639-2/B 3-letter language code (empty string if undefined) *) - {$ELSE} - {$IFDEF FF_API_OLD_METADATA} - language: array [0..3] of PAnsiChar; (**< ISO 639-2/B 3-letter language code (empty string if undefined) *) - {$ENDIF} - {$IFEND} - - (* av_read_frame() support *) - need_parsing: TAVStreamParseType; - parser: PAVCodecParserContext; - - cur_dts: cint64; - last_IP_duration: cint; - last_IP_pts: cint64; - (* av_seek_frame() support *) - index_entries: PAVIndexEntry; (**< Only used if the format does not - support seeking natively. *) - nb_index_entries: cint; - index_entries_allocated_size: cuint; - - nb_frames: cint64; ///< number of frames in this stream if known or 0 - - {$IF (LIBAVFORMAT_VERSION >= 50006000) and (LIBAVFORMAT_VERSION_MAJOR < 53)} // 50.6.0 - 53.0.0 - unused: array [0..4] of cint64; - {$IFEND} - - {$IF (LIBAVFORMAT_VERSION >= 52006000) and (LIBAVFORMAT_VERSION < 52078003)} // 52.6.0 - 52.78.2 - filename: PAnsiChar; (**< source filename of the stream *) - {$ELSE} - {$IFDEF FF_API_OLD_METADATA} - filename: PAnsiChar; (**< source filename of the stream *) - {$ENDIF} - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52008000} // 52.8.0 - disposition: cint; (**< AV_DISPOSITION_* bitfield *) - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52019000} // 52.19.0 - probe_data: TAVProbeData; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52021000} // 52.21.0 - pts_buffer: array [0..MAX_REORDER_DELAY] of cint64; - - (** - * sample aspect ratio (0 if unknown) - * - encoding: Set by user. - * - decoding: Set by libavformat. - *) - sample_aspect_ratio: TAVRational; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52024001} // 52.24.1 - metadata: PAVMetadata; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION > 52024001} // > 52.24.1 - {* 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; - cur_len: cint; - cur_pkt: TAVPacket; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52030000} // > 52.30.0 - // 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; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52034000} // >= 52.34.0 - (** - * Number of packets to buffer for codec probing - * NOT PART OF PUBLIC API - *) - probe_packets: cint; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52038000} // >= 52.38.0 - (** - * 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* - *) - last_in_packet_buffer: PAVPacketList; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52041000} // >= 52.41.0 - (** - * Average framerate - *) - avg_frame_rate: TAVRational; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52054000} // >= 52.54.0 - (** - * Number of frames that have been demuxed during av_find_stream_info() - *) - codec_info_nb_frames: cint; - {$IFEND} - end; - - (** - * 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*. - *) - TAVFormatContext = record - av_class: PAVClass; (**< Set by avformat_alloc_context. *) - (* Can only be iformat or oformat, not both at the same time. *) - iformat: PAVInputFormat; - oformat: PAVOutputFormat; - priv_data: pointer; - - {$IF LIBAVFORMAT_VERSION_MAJOR >= 52} - pb: PByteIOContext; - {$ELSE} - pb: TByteIOContext; - {$IFEND} - - nb_streams: cuint; - streams: array [0..MAX_STREAMS - 1] of PAVStream; - filename: array [0..1023] of AnsiChar; (* input or output filename *) - (* stream info *) - timestamp: cint64; - {$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - 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 *) - {$ELSE} - {$IFDEF 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 *) - {$ENDIF} - {$IFEND} - - ctx_flags: cint; (**< Format-specific flags, see AVFMTCTX_xx *) - (* private data for pts handling (do not modify directly). *) - (** - * 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; - - (** - * Decoding: position of the first frame of the component, in - * AV_TIME_BASE fractional seconds. NEVER set this value directly: - * It is deduced from the AVStream values. - *) - start_time: cint64; - (** - * Decoding: duration of the stream, in AV_TIME_BASE fractional - * seconds. Only set this value if you know none of the individual stream - * durations and also dont set any of them. This is deduced from the - * AVStream values if not set. - *) - duration: cint64; - (** - * decoding: total file size, 0 if unknown - *) - file_size: cint64; - (** - * Decoding: total stream bitrate in bit/s, 0 if not - * available. Never set it directly if the file_size and the - * duration are known as ffmpeg can compute it automatically. - *) - bit_rate: cint; - - (* av_read_frame() support *) - cur_st: PAVStream; - {$IF LIBAVFORMAT_VERSION_MAJOR < 53} - cur_ptr_deprecated: pbyte; - cur_len_deprecated: cint; - cur_pkt_deprecated: TAVPacket; - {$IFEND} - - (* av_seek_frame() support *) - data_offset: cint64; (**< offset of the first packet *) - index_built: cint; - - mux_rate: cint; - {$IF LIBAVFORMAT_VERSION < 52034001} // < 52.34.1 - packet_size: cint; - {$ELSE} - packet_size: cuint; - {$IFEND} - preload: cint; - max_delay: cint; - - (** - * number of times to loop output in formats that support it - *) - loop_output: cint; - - flags: cint; - loop_input: cint; - - {$IF LIBAVFORMAT_VERSION >= 50006000} // 50.6.0 - (** - * decoding: size of data to probe; encoding: unused. - *) - probesize: cuint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 51009000} // 51.9.0 - (** - * Maximum time (in AV_TIME_BASE units) during which the input should - * be analyzed in av_find_stream_info(). - *) - max_analyze_duration: cint; - - key: pbyte; - keylen : cint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 51014000} // 51.14.0 - nb_programs: cuint; - programs: PPAVProgram; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52003000} // 52.3.0 - (** - * Forced video codec_id. - * Demuxing: Set by user. - *) - video_codec_id: TCodecID; - - (** - * Forced audio codec_id. - * Demuxing: Set by user. - *) - audio_codec_id: TCodecID; - - (** - * Forced subtitle codec_id. - * Demuxing: Set by user. - *) - subtitle_codec_id: TCodecID; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 - (** - * Maximum amount of memory in bytes to use for the index of each stream. - * If the index exceeds this size, entries will be discarded as - * needed to maintain a smaller size. This can lead to slower or less - * accurate seeking (depends on demuxer). - * Demuxers for which a full in-memory index is mandatory will ignore - * this. - * muxing : unused - * demuxing: set by user - *) - max_index_size: cuint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52009000} // 52.9.0 - (** - * Maximum amount of memory in bytes to use for buffering frames - * obtained from realtime capture devices. - *) - max_picture_buffer: cuint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52014000} // 52.14.0 - nb_chapters: cuint; - chapters: PAVChapterArray; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52016000} // 52.16.0 - (** - * Flags to enable debugging. - *) - debug: cint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52019000} // 52.19.0 - (** - * 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; - - packet_buffer_end: PAVPacketList; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52024001} // 52.24.1 - metadata: PAVMetadata; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52035000} // 52.35.0 - (** - * Remaining size available for raw_packet_buffer, in bytes. - * NOT PART OF PUBLIC API - *) - raw_packet_buffer_remaining_size: cint; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52056000} // 52.56.0 - (** - * Start time of the stream in real world time, in microseconds - * since the unix epoch (00:00 1st January 1970). That is, pts=0 - * in the stream was captured at this real world time. - * - encoding: Set by user. - * - decoding: Unused. - *) - start_time_realtime: cint64; - {$IFEND} - - 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; - {$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - provider_name : PAnsiChar; ///< network name for DVB streams - name : PAnsiChar; ///< service name for DVB streams - {$ELSE} - {$IFDEF FF_API_OLD_METADATA} - provider_name : PAnsiChar; ///< network name for DVB streams - name : PAnsiChar; ///< service name for DVB streams - {$ENDIF} - {$IFEND} - flags : cint; - discard : TAVDiscard; ///< selects which program to discard and which to feed to the caller - {$IF LIBAVFORMAT_VERSION >= 51016000} // 51.16.0 - stream_index : PCardinal; - nb_stream_indexes : PCardinal; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52024001} // 52.24.1 - metadata: PAVMetadata; - {$IFEND} - end; - - TAVPacketList = record - pkt: TAVPacket; - next: PAVPacketList; - end; - -{$IF LIBAVFORMAT_VERSION < 51006000} // 51.6.0 - (* still image support *) - PAVInputImageContext = pointer; {deprecated} - - (* still image support *) - TAVImageInfo = record - pix_fmt: TAVPixelFormat; (* requested pixel format *) - width: cint; (* requested width *) - height: cint; (* requested height *) - interleaved: cint; (* image is interleaved (e.g. interleaved GIF) *) - pict: TAVPicture; (* returned allocated image *) - end; {deprecated} - - TAVImageFormat = record - name: PAnsiChar; - extensions: PAnsiChar; - (* tell if a given file has a chance of being parsing by this format *) - img_probe: function (d: PAVProbeData): cint; cdecl; - (* read a whole image. 'alloc_cb' is called when the image size is - known so that the caller can allocate the image. If 'allo_cb' - returns non zero, then the parsing is aborted. Return '0' if - OK. *) - img_read: function (b: PByteIOContext; alloc_cb: pointer; ptr: pointer): cint; cdecl; - (* write the image *) - supported_pixel_formats: cint; (* mask of supported formats for output *) - img_write: function (b: PByteIOContext; i: PAVImageInfo): cint; cdecl; - flags: cint; - next: PAVImageFormat; - end; {deprecated} - -procedure av_register_image_format(img_fmt: PAVImageFormat); - cdecl; external av__format; deprecated; - -function av_probe_image_format(pd: PAVProbeData): PAVImageFormat; - cdecl; external av__format; deprecated; - -function guess_image_format(filename: PAnsiChar): PAVImageFormat; - cdecl; external av__format; deprecated; - -function av_read_image(pb: PByteIOContext; filename: PAnsiChar; - fmt: PAVImageFormat; - alloc_cb: pointer; opaque: pointer): cint; - cdecl; external av__format; deprecated; - -function av_write_image(pb: PByteIOContext; fmt: PAVImageFormat; img: PAVImageInfo): cint; - cdecl; external av__format; deprecated; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52030001} // >= 52.30.1 -(** - * 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 - *) -procedure av_metadata_conv(ctx: PAVFormatContext; {const} d_conv: PAVMetadataConv; - {const} s_conv: PAVMetadataConv); - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} -{ -var - first_iformat: PAVInputFormat; external av__format; - first_oformat: PAVOutputFormat; external av__format; -} -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52003000} // 52.3.0 -(** - * 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_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; -{$IFEND} - -function av_guess_image2_codec(filename: {const} PAnsiChar): TCodecID; - cdecl; external av__format; - -(* XXX: Use automatic init with either ELF sections or C file parser *) -(* modules. *) - -(* utils.c *) -procedure av_register_input_format(format: PAVInputFormat); - cdecl; external av__format; - -procedure av_register_output_format(format: PAVOutputFormat); - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} // < 53 -function guess_stream_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; - cdecl; external av__format; deprecated; -{$IFEND} - -(** - * 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 - *) -(** - * @deprecated Use av_guess_format() instead. - *) -function guess_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; - cdecl; external av__format; -{$IF LIBAVFORMAT_VERSION >= 52045000} // >= 52.45.0 - deprecated; -function av_guess_format(short_name: PAnsiChar; - filename: PAnsiChar; - mime_type: PAnsiChar): PAVOutputFormat; - cdecl; external av__format; -{$IFEND} - -(** - * Guess the codec ID based upon muxer and filename. - *) -function av_guess_codec(fmt: PAVOutputFormat; short_name: PAnsiChar; - filename: PAnsiChar; mime_type: PAnsiChar; - type_: TCodecType): TCodecID; - 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 - *) -procedure av_hex_dump(f: PAVFile; buf: PByteArray; size: cint); - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 51011000} // 51.11.0 -(** - * 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 - *) -procedure av_hex_dump_log(avcl: Pointer; level: cint; buf: PByteArray; size: cint); - cdecl; external av__format; -{$IFEND} - -(** - * 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. - *) -procedure av_pkt_dump(f: PAVFile; pkt: PAVPacket; dump_payload: cint); - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 51011000} // 51.11.0 -(** - * 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. - *) -procedure av_pkt_dump_log(avcl: Pointer; level: cint; pkt: PAVPacket; dump_payload: cint); - cdecl; external av__format; -{$IFEND} - -(** - * 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; - -{$IF LIBAVFORMAT_VERSION >= 51008000} // 51.8.0 -(** - * 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; -{$IFEND} - -(* media file input *) - -(** - * Find AVInputFormat based on the short name of the input format. - *) -function av_find_input_format(short_name: PAnsiChar): PAVInputFormat; - cdecl; external av__format; - -(** - * Guess file format. - * - * @param is_opened Whether the file is already opened; determines whether - * demuxers with or without AVFMT_NOFILE are probed. - *) -function av_probe_input_format(pd: PAVProbeData; is_opened: cint): PAVInputFormat; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52062000} // 52.62.0 -(** - * 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_max A probe score larger that this is required to accept a - * detection, the variable is set to the actual detection - * score afterwards. - * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended - * to retry with a larger probe buffer. - *) -function av_probe_input_format2(pd: PAVProbeData; is_opened: cint; score_max: PCint): PAVInputFormat; - cdecl; external av__format; -{$IFEND} - -(** - * Allocate all the structures needed to read an input stream. - * This does not open the needed codecs for decoding the stream[s]. - *) -function av_open_input_stream(var ic_ptr: PAVFormatContext; - pb: PByteIOContext; filename: PAnsiChar; - fmt: PAVInputFormat; ap: PAVFormatParameters): cint; - cdecl; external av__format; - -(** - * Open a media file as input. The codecs are not opened. Only the file - * header (if present) is read. - * - * @param ic_ptr The opened media file handle is put here. - * @param filename filename to open - * @param fmt If non-NULL, force the file format to use. - * @param buf_size optional buffer size (zero if default is OK) - * @param ap Additional parameters needed when opening the file - * (NULL if default). - * @return 0 if OK, AVERROR_xxx otherwise - *) -function av_open_input_file(var ic_ptr: PAVFormatContext; filename: PAnsiChar; - fmt: PAVInputFormat; buf_size: cint; - ap: PAVFormatParameters): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52026000} // 52.26.0 -(** - * Allocate an AVFormatContext. - * Can be freed with av_free() but do not forget to free everything you - * explicitly allocated as well! - *) -function avformat_alloc_context(): PAVFormatContext; - cdecl; external av__format; -{$ELSE} - {$IF LIBAVFORMAT_VERSION_MAJOR < 53} -(** - * @deprecated Use avformat_alloc_context() instead. - *) -function av_alloc_format_context(): PAVFormatContext; - cdecl; external av__format; - {$IFEND} -{$IFEND} - -(** - * 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_find_stream_info(ic: PAVFormatContext): cint; - cdecl; external av__format; - -(** - * Read a transport packet from a media file. - * - * This function is obsolete and should never be used. - * Use av_read_frame() instead. - * - * @param s media file handle - * @param pkt is filled - * @return 0 if OK, AVERROR_xxx on error - *) -function av_read_packet(s: PAVFormatContext; var pkt: TAVPacket): cint; - cdecl; external av__format; - -(** - * Return the next frame of a stream. - * - * 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 - * 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. - * - * pkt->pts, pkt->dts and pkt->duration are always set to correct - * values in AVStream.time_base units (and guessed if the format cannot - * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format - * has B-frames, so it is better to rely on pkt->dts if you do not - * decompress the payload. - * - * @return 0 if OK, < 0 on error or end of file - *) -function av_read_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; - cdecl; external av__format; - -(** - * Seek to the keyframe at timestamp. - * 'timestamp' in 'stream_index'. - * @param stream_index If stream_index is (-1), a default - * stream is selected, and timestamp is automatically converted - * from AV_TIME_BASE units to the stream specific time_base. - * @param timestamp Timestamp in AVStream.time_base units - * or, if no stream is specified, in AV_TIME_BASE units. - * @param flags flags which select direction and seeking mode - * @return >= 0 on success - *) -function av_seek_frame(s: PAVFormatContext; stream_index: cint; timestamp: cint64; - flags: cint): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52026000} // 52.26.0 -(** - * 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; -{$IFEND} - -(** - * Start playing a network-based stream (e.g. RTSP stream) at the - * current position. - *) -function av_read_play(s: PAVFormatContext): cint; - cdecl; external av__format; - -(** - * Pause a network-based stream (e.g. RTSP stream). - * - * Use av_read_play() to resume it. - *) -function av_read_pause(s: PAVFormatContext): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52003000} // 52.3.0 -(** - * Free a AVFormatContext allocated by av_open_input_stream. - * @param s context to free - *) -procedure av_close_input_stream(s: PAVFormatContext); - cdecl; external av__format; -{$IFEND} - -(** - * Close a media file (but not its codecs). - * - * @param s media file handle - *) -procedure av_close_input_file(s: PAVFormatContext); - cdecl; external av__format; - -(** - * Add a new stream to a media file. - * - * Can only be called in the read_header() function. If the flag - * AVFMTCTX_NOHEADER is in the format context, then new streams - * can be added in read_packet too. - * - * @param s media file handle - * @param id file-format-dependent stream ID - *) -function av_new_stream(s: PAVFormatContext; id: cint): PAVStream; - cdecl; external av__format; -{$IF LIBAVFORMAT_VERSION >= 51014000} // 51.14.0 -function av_new_program(s: PAVFormatContext; id: cint): PAVProgram; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52014000} // 52.14.0 -(** - * 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; -{$IFEND} - -(** - * 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) - *) -procedure av_set_pts_info(s: PAVStream; pts_wrap_bits: cint; -{$IF LIBAVFORMAT_VERSION < 52036000} // < 52.36.0 - pts_num: cint; pts_den: cint); -{$ELSE} - pts_num: cuint; pts_den: cuint); -{$IFEND} - cdecl; external av__format; - -const - AVSEEK_FLAG_BACKWARD = 1; ///< seek backward - AVSEEK_FLAG_BYTE = 2; ///< seeking based on position in bytes - AVSEEK_FLAG_ANY = 4; ///< seek to any frame, even non-keyframes -{$IF LIBAVFORMAT_VERSION >= 52037000} // >= 52.37.0 - AVSEEK_FLAG_FRAME = 8; -{$IFEND} - -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; - -{$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 -(** - * 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; -{$IFEND} - -(** - * 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 - *) -function av_seek_frame_binary(s: PAVFormatContext; stream_index: cint; - target_ts: cint64; flags: cint): cint; - 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); - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 51007000} // 51.7.0 -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; - cdecl; external av__format; -{$IFEND} - -(** - * media file output - *) -function av_set_parameters(s: PAVFormatContext; ap: PAVFormatParameters): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52072000} // 52.72.0 -(** - * 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; -{$IFEND} - -(** - * Allocate the stream private data and write the stream header to an - * output media file. - * - * @param s media file handle - * @return 0 if OK, AVERROR_xxx on error - *) -function av_write_header(s: PAVFormatContext): cint; - cdecl; external av__format; - -(** - * 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. - * - * @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 - *) -function av_write_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; - cdecl; external av__format; - -(** - * Write a packet to an output media file ensuring correct interleaving. - * - * The packet must contain one audio or video frame. - * If the packets are already correctly interleaved, the application should - * call av_write_frame() instead as it is slightly faster. It is also important - * to keep in mind that completely non-interleaved input will need huge amounts - * of memory to interleave with this, so it is preferable to interleave at the - * 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 - *) -function av_interleaved_write_frame(s: PAVFormatContext; var pkt: TAVPacket): cint; - cdecl; external av__format; - -(** - * Interleave a packet per dts in an output media file. - * - * Packets with pkt->destruct == av_destruct_packet will be freed inside this - * function, so they cannot be used after it. Note that calling av_free_packet() - * on them is still safe. - * - * @param s media file handle - * @param out the interleaved packet will be output here - * @param pkt the input packet - * @param flush 1 if no further packets are available as input and all - * remaining packets should be output - * @return 1 if a packet was output, 0 if no packet could be output, - * < 0 if an error occurred - *) -function av_interleave_packet_per_dts(s: PAVFormatContext; _out: PAVPacket; - pkt: PAVPacket; flush: cint): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52025000} // 52.25.0 -(** - * 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; -} -{$IFEND} - -(** - * Write the stream trailer to an output media file and free the - * file private data. - * - * May only be called after a successful call to av_write_header. - * - * @param s media file handle - * @return 0 if OK, AVERROR_xxx on error - *) -function av_write_trailer(s: pAVFormatContext): cint; - cdecl; external av__format; - -procedure dump_format(ic: PAVFormatContext; index: cint; url: PAnsiChar; - is_output: cint); - cdecl; external av__format; - -(** - * Parse width and height out of string str. - * @deprecated Use av_parse_video_frame_size instead. - *) -function parse_image_size(width_ptr: PCint; height_ptr: PCint; - str: PAnsiChar): cint; - cdecl; external av__format; deprecated; - -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} -(** - * Convert framerate from a string to a fraction. - * @deprecated Use av_parse_video_frame_rate instead. - *) -function parse_frame_rate(frame_rate: PCint; frame_rate_base: PCint; - arg: PByteArray): cint; - cdecl; external av__format; deprecated; -{$IFEND} - -(** - * 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; - cdecl; external av__format; - -(** - * Get the current time in microseconds. - *) -function av_gettime(): cint64; - cdecl; external av__format; - -(* ffm-specific for ffserver *) -const - FFM_PACKET_SIZE = 4096; - -function ffm_read_write_index(fd: cint): cint64; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION < 52027000} // 52.27.0 -procedure ffm_write_write_index(fd: cint; pos: cint64); -{$ELSE} -function ffm_write_write_index(fd: cint; pos: cint64): cint; -{$IFEND} - cdecl; external av__format; - -procedure ffm_set_write_index(s: PAVFormatContext; pos: cint64; file_size: cint64); - cdecl; external av__format; - -(** - * Attempt to find a specific tag in a URL. - * - * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. - * Return 1 if found. - *) -function find_info_tag(arg: PAnsiChar; arg_size: cint; tag1: PAnsiChar; info: PAnsiChar): cint; - cdecl; external av__format; - -(** - * Return in 'buf' the path with '%d' replaced by a number. - * - * Also handles the '%0nd' format where 'n' is the total number - * of digits and '%%'. - * - * @param buf destination buffer - * @param buf_size destination buffer size - * @param path numbered sequence string - * @param number frame number - * @return 0 if OK, -1 on format error - *) -function av_get_frame_filename(buf: PAnsiChar; buf_size: cint; - path: PAnsiChar; number: cint): cint; - cdecl; external av__format - {$IF LIBAVFORMAT_VERSION <= 50006000} // 50.6.0 - name 'get_frame_filename' - {$IFEND}; - -(** - * Check whether filename actually is a numbered sequence generator. - * - * @param filename possible numbered sequence string - * @return 1 if a valid numbered sequence string, 0 otherwise - *) -function av_filename_number_test(filename: PAnsiChar): cint; - cdecl; external av__format - {$IF LIBAVFORMAT_VERSION <= 50006000} // 50.6.0 - name 'filename_number_test' - {$IFEND}; - -{$IF LIBAVFORMAT_VERSION >= 51012002} // 51.12.2 -(** - * Generate an SDP for an RTP session. - * - * @param ac array of AVFormatContexts describing the RTP streams. If the - * array is composed by only one context, such context can contain - * multiple AVStreams (one AVStream per RTP stream). Otherwise, - * 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 size the size of the buffer - * @return 0 if OK, AVERROR_xxx on error - *) -function avf_sdp_create(ac: PPAVFormatContext; n_files: cint; buff: PByteArray; size: cint): cint; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52060000} // 52.60.0 -(** - * Return a positive value if the given filename has one of the given - * extensions, 0 otherwise. - * - * @param extensions a comma-separated list of filename extensions - *) -function av_match_ext(filename: {const} Pchar; extensions: {const} Pchar): cint; - cdecl; external av__format; -{$IFEND} - -implementation - -{$IF LIBAVFORMAT_VERSION < 51012002} // 51.12.2 -procedure av_init_packet(var pkt: TAVPacket); -begin - with pkt do begin - pts := AV_NOPTS_VALUE; - dts := AV_NOPTS_VALUE; - pos := -1; - duration := 0; - flags := 0; - stream_index := 0; - destruct := @av_destruct_packet_nofree - end -end; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION < 52032000} // < 52.32.0 -procedure av_free_packet(pkt: PAVPacket); -begin - if ((pkt <> nil) and (@pkt^.destruct <> nil)) then - pkt^.destruct(pkt); -end; -{$IFEND} - -end. diff --git a/mediaplugin/src/lib/ffmpeg/avio.pas b/mediaplugin/src/lib/ffmpeg/avio.pas deleted file mode 100644 index adb59a44..00000000 --- a/mediaplugin/src/lib/ffmpeg/avio.pas +++ /dev/null @@ -1,796 +0,0 @@ -(* - * unbuffered io for ffmpeg system - * copyright (c) 2001 Fabrice Bellard - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavformat/avio.h - * unbuffered I/O operations - * @warning This file has to be considered an internal but installed - * header, so it should not be directly included in your projects. - * - * update to - * Max. avformat version: 52.78.3, revision 24841, Thu Aug 26 02:00:00 2010 CET - *) - -unit avio; - -{$IFDEF FPC} - {$MODE DELPHI } - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$I switches.inc} - -interface - -uses - ctypes, - avutil, - avcodec, - SysUtils, - UConfig; - -(* unbuffered I/O *) - -const - URL_RDONLY = 0; - URL_WRONLY = 1; - URL_RDWR = 2; - - (** - * Passing this as the "whence" parameter to a seek function causes it to - * return the filesize without seeking anywhere. Supporting this is optional. - * If it is not supported then the seek function will return <0. - *) - AVSEEK_SIZE = $10000; - -{$IF LIBAVFORMAT_VERSION >= 52056000} // 52.56.0 - (** - * Oring this flag as into the "whence" parameter to a seek function causes it to - * seek by any means (like reopening and linear reading) or other normally unreasonble - * means that can be extreemly slow. - * This may be ignored by the seek code. - *) - AVSEEK_FORCE = $20000; -{$IFEND} - -type - TURLInterruptCB = function (): cint; cdecl; - -type - PURLProtocol = ^TURLProtocol; - - (** - * URL 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(URLContext) must not be used outside libav*. - *) - PURLContext = ^TURLContext; - TURLContext = record - {$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - av_class: {const} PAVClass; ///< information for av_log(). Set by url_open(). - {$ELSE} - {$IFDEF FF_API_URL_CLASS} - av_class: {const} PAVClass; ///< information for av_log(). Set by url_open(). - {$ENDIF} - {$IFEND} - prot: PURLProtocol; - flags: cint; - is_streamed: cint; (**< true if streamed (no seek possible), default = false *) - max_packet_size: cint; (**< if non zero, the stream is packetized with this max packet size *) - priv_data: pointer; - filename: PAnsiChar; (**< specified URL *) -{$IF LIBAVFORMAT_VERSION >= 52070000} // 52.70.0 - is_connected: cint; -{$IFEND} - end; - PPURLContext = ^PURLContext; - - PURLPollEntry = ^TURLPollEntry; - TURLPollEntry = record - handle: PURLContext; - events: cint; - revents: cint; - end; - - TURLProtocol = record - name: PAnsiChar; -{$IF LIBAVFORMAT_VERSION < 52047000} // 52.47.0 - url_open: function (h: PURLContext; filename: {const} PAnsiChar; flags: cint): cint; cdecl; -{$ELSE} - url_open: function (h: PURLContext; url: {const} PAnsiChar; flags: cint): cint; cdecl; -{$IFEND} - -(** - * Read up to size bytes from the resource accessed by h, and store - * the read bytes in buf. - * - * @return The number of bytes actually read, or a negative value - * corresponding to an AVERROR code in case of error. A value of zero - * indicates that it is not possible to read more from the accessed - * resource (except if the value of the size argument is also zero). - *) - url_read: function (h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; - -(** - * Read as many bytes as possible (up to size), calling the - * read function multiple times if necessary. - * Will also retry if the read function returns AVERROR(EAGAIN). - * This makes special short-read handling in applications - * unnecessary, if the return value is < size then it is - * certain there was either an error or the end of file was reached. - *) - url_write: function (h: PURLContext; {const} buf: PByteArray; size: cint): cint; cdecl; - -(** - * Change the position that will be used by the next read/write - * operation on the resource accessed by h. - * - * @param pos specifies the new position to set - * @param whence specifies how pos should be interpreted, it must be - * one of SEEK_SET (seek from the beginning), SEEK_CUR (seek from the - * current position), SEEK_END (seek from the end), or AVSEEK_SIZE - * (return the filesize of the requested resource, pos is ignored). - * @return a negative value corresponding to an AVERROR code in case - * of failure, or the resulting file position, measured in bytes from - * the beginning of the file. You can use this feature together with - * SEEK_CUR to read the current file position. - *) - url_seek: function (h: PURLContext; pos: cint64; whence: cint): cint64; cdecl; - - url_close: function (h: PURLContext): cint; cdecl; - next: PURLProtocol; - {$IF (LIBAVFORMAT_VERSION >= 52001000) and (LIBAVFORMAT_VERSION < 52004000)} // 52.1.0 .. 52.4.0 - url_read_play: function (h: PURLContext): cint; cdecl; - url_read_pause: function (h: PURLContext): cint; cdecl; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 - url_read_pause: function (h: PURLContext; pause: cint): cint; cdecl; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52001000} // 52.1.0 - url_read_seek: function (h: PURLContext; stream_index: cint; - timestamp: cint64; flags: cint): cint64; cdecl; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52031000} // 52.31.0 - url_get_file_handle: function (h: PURLContext): cint; cdecl; - {$IFEND} - - {$IF LIBAVFORMAT_VERSION >= 52071000} // 52.71.0 - priv_data_size: cint; - {const} priv_data_class: PAVClass; - {$IFEND} - end; - - (** - * Bytestream IO 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(ByteIOContext) must not be used outside libav*. - *) - PByteIOContext = ^TByteIOContext; - TByteIOContext = record - buffer: PByteArray; - buffer_size: cint; - buf_ptr: PByteArray; - buf_end: PByteArray; - opaque: pointer; - read_packet: function (opaque: pointer; buf: PByteArray; buf_size: cint): cint; cdecl; - write_packet: function (opaque: pointer; buf: PByteArray; buf_size: cint): cint; cdecl; - seek: function (opaque: pointer; offset: cint64; whence: cint): cint64; cdecl; - pos: cint64; (* position in the file of the current buffer *) - must_flush: cint; (* true if the next seek should flush *) - eof_reached: cint; (* true if eof reached *) - write_flag: cint; (* true if open for writing *) - is_streamed: cint; - max_packet_size: cint; - checksum: culong; - checksum_ptr: PByteArray; - update_checksum: function (checksum: culong; buf: {const} PByteArray; size: cuint): culong; cdecl; - error: cint; ///< contains the error code or 0 if no error happened - {$IF (LIBAVFORMAT_VERSION >= 52001000) and (LIBAVFORMAT_VERSION < 52004000)} // 52.1.0 .. 52.4.0 - read_play: function(opaque: Pointer): cint; cdecl; - read_pause: function(opaque: Pointer): cint; cdecl; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 - read_pause: function(opaque: Pointer; pause: cint): cint; cdecl; - {$IFEND} - {$IF LIBAVFORMAT_VERSION >= 52001000} // 52.1.0 - read_seek: function(opaque: Pointer; stream_index: cint; - timestamp: cint64; flags: cint): cint64; cdecl; - {$IFEND} - end; - -{$IF LIBAVFORMAT_VERSION >= 52070000} // 52.70.0 -(** - * Create a URLContext for accessing to the resource indicated by - * url, but do not initiate the connection yet. - * - * @param puc pointer to the location where, in case of success, the - * function puts the pointer to the created URLContext - * @param flags flags which control how the resource indicated by url - * is to be opened - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -function url_alloc(h: PPURLContext; {const} url: PAnsiChar; flags: cint): cint; - cdecl; external av__format; - -(** - * Connect an URLContext that has been allocated by url_alloc - *) -function url_connect(h: PURLContext): cint; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52021000} // 52.21.0 -(** - * Create a URLContext for accessing to the resource indicated by - * URL, and open it using the URLProtocol up. - * - * @param puc pointer to the location where, in case of success, the - * function puts the pointer to the created URLContext - * @param flags flags which control how the resource indicated by URL - * is to be opened - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -function url_open_protocol(puc: PPURLContext; up: PURLProtocol; -{$IF LIBAVFORMAT_VERSION < 52047000} // 52.47.0 - filename: {const} PAnsiChar; flags: cint): cint; -{$ELSE} - url: {const} PAnsiChar; flags: cint): cint; -{$IFEND} - cdecl; external av__format; -{$IFEND} - -(** - * Create a URLContext for accessing to the resource indicated by - * url, and open it. - * - * @param puc pointer to the location where, in case of success, the - * function puts the pointer to the created URLContext - * @param flags flags which control how the resource indicated by url - * is to be opened - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -{$IF LIBAVFORMAT_VERSION < 52047000} // 52.47.0 -function url_open(h: PPointer; filename: {const} PAnsiChar; flags: cint): cint; -{$ELSE} -function url_open(h: PPointer; url: {const} PAnsiChar; flags: cint): cint; -{$IFEND} - cdecl; external av__format; -function url_read (h: PURLContext; buf: PByteArray; size: cint): cint; - cdecl; external av__format; -{$IF LIBAVFORMAT_VERSION >= 52034000} // 52.34.0 -function url_read_complete (h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; - cdecl; external av__format; -{$IFEND} -function url_write (h: PURLContext; {const} buf: PByteArray; size: cint): cint; - cdecl; external av__format; -function url_seek (h: PURLContext; pos: cint64; whence: cint): cint64; - cdecl; external av__format; - -(** - * Close the resource accessed by the URLContext h, and free the - * memory used by it. - * - * @return a negative value if an error condition occurred, 0 - * otherwise - *) -function url_close (h: PURLContext): cint; - cdecl; external av__format; - -(** - * Return a non-zero value if the resource indicated by url - * exists, 0 otherwise. - *) -{$IF LIBAVFORMAT_VERSION < 52047000} // 52.47.0 -function url_exist(filename: {const} PAnsiChar): cint; -{$ELSE} -function url_exist(url: {const} PAnsiChar): cint; -{$IFEND} - cdecl; external av__format; - -function url_filesize (h: PURLContext): cint64; - cdecl; external av__format; - -(** - * Return the file descriptor associated with this URL. For RTP, this - * will return only the RTP file descriptor, not the RTCP file descriptor. - * To get both, use rtp_get_file_handles(). - * - * @return the file descriptor associated with this URL, or <0 on error. - *) -(* not implemented *) -function url_get_file_handle(h: PURLContext): cint; - cdecl; external av__format; - -(** - * Return the maximum packet size associated to packetized file - * handle. If the file is not packetized (stream like HTTP or file on - * disk), then 0 is returned. - * - * @param h file handle - * @return maximum packet size in bytes - *) -function url_get_max_packet_size(h: PURLContext): cint; - cdecl; external av__format; -procedure url_get_filename(h: PURLContext; buf: PAnsiChar; buf_size: cint); - cdecl; external av__format; - -(** - * The callback is called in blocking functions to test regulary if - * asynchronous interruption is needed. AVERROR(EINTR) is returned - * in this case by the interrupted function. 'NULL' means no interrupt - * callback is given. - *) -procedure url_set_interrupt_cb (interrupt_cb: TURLInterruptCB); - cdecl; external av__format; - -(* not implemented *) -function url_poll(poll_table: PURLPollEntry; n: cint; timeout: cint): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 -(** - * Pause and resume playing - only meaningful if using a network streaming - * protocol (e.g. MMS). - * @param pause 1 for pause, 0 for resume - *) -function av_url_read_pause(h: PURLContext; pause: cint): cint; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52001000} // 52.1.0 -(** - * Seek to a given timestamp relative to some component stream. - * Only meaningful if using a network streaming protocol (e.g. MMS.). - * @param stream_index The stream index that the timestamp is relative to. - * If stream_index is (-1) the timestamp should be in AV_TIME_BASE - * units from the beginning of the presentation. - * If a stream_index >= 0 is used and the protocol does not support - * seeking based on component streams, the call will fail with ENOTSUP. - * @param timestamp timestamp in AVStream.time_base units - * or if there is no stream specified then in AV_TIME_BASE units. - * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE - * and AVSEEK_FLAG_ANY. The protocol may silently ignore - * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will - * fail with ENOTSUP if used and not supported. - * @return >= 0 on success - * @see AVInputFormat::read_seek - *) -function av_url_read_seek(h: PURLContext; stream_index: cint; - timestamp: cint64; flags: cint): cint64; - cdecl; external av__format; -{$IFEND} - -(** -var -{$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 - first_protocol: PURLProtocol; external av__format; -{$ELSE} - {$IFDEF FF_API_REGISTER_PROTOCOL} - first_protocol: PURLProtocol; external av__format; - {$IFEND} -{$IFEND} - url_interrupt_cb: PURLInterruptCB; external av__format; -**) - -{$IF LIBAVFORMAT_VERSION >= 52002000} // 52.2.0 -(** - * If protocol is NULL, returns the first registered protocol, - * if protocol is non-NULL, returns the next registered protocol after protocol, - * or NULL if protocol is the last one. - *) -function av_protocol_next(p: PURLProtocol): PURLProtocol; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION <= 52028000} // 52.28.0 -(** - * Register the URLProtocol protocol. - * - * - * @deprecated Use av_register_protocol() instead. - *) -function register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format; -(** Alias for register_protocol() - * - * @deprecated Use av_register_protocol2() instead. - *) -function av_register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format name 'register_protocol'; -{$ELSE} -{$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 -function av_register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format; -{$ELSE} - {$IFDEF FF_API_REGISTER_PROTOCOL} -function av_register_protocol(protocol: PURLProtocol): cint; - cdecl; external av__format; - {$ENDIF} -{$IFEND} -{$IFEND} -{$IF LIBAVFORMAT_VERSION >= 52069000} // 52.69.0 -function av_register_protocol2(protocol: PURLProtocol; size: cint): cint; - cdecl; external av__format; -{$IFEND} - -type - TReadWriteFunc = function(opaque: Pointer; buf: PByteArray; buf_size: cint): cint; cdecl; - TSeekFunc = function(opaque: Pointer; offset: cint64; whence: cint): cint64; cdecl; - -function init_put_byte(s: PByteIOContext; - buffer: PByteArray; - buffer_size: cint; write_flag: cint; - opaque: pointer; - read_packet: TReadWriteFunc; - write_packet: TReadWriteFunc; - seek: TSeekFunc): cint; - cdecl; external av__format; -{$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 -function av_alloc_put_byte( - buffer: PByteArray; - buffer_size: cint; - write_flag: cint; - opaque: Pointer; - read_packet: TReadWriteFunc; - write_packet: TReadWriteFunc; - seek: TSeekFunc): PByteIOContext; - cdecl; external av__format; -{$IFEND} - -procedure put_byte(s: PByteIOContext; b: cint); - cdecl; external av__format; -procedure put_buffer (s: PByteIOContext; buf: {const} PByteArray; size: cint); - cdecl; external av__format; -procedure put_le64(s: PByteIOContext; val: cuint64); - cdecl; external av__format; -procedure put_be64(s: PByteIOContext; val: cuint64); - cdecl; external av__format; -procedure put_le32(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_be32(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_le24(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_be24(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_le16(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_be16(s: PByteIOContext; val: cuint); - cdecl; external av__format; -procedure put_tag(s: PByteIOContext; tag: {const} PAnsiChar); - cdecl; external av__format; - -procedure put_strz(s: PByteIOContext; buf: {const} PAnsiChar); - cdecl; external av__format; - -(** - * fseek() equivalent for ByteIOContext. - * @return new position or AVERROR. - *) -function url_fseek(s: PByteIOContext; offset: cint64; whence: cint): cint64; - cdecl; external av__format; - -(** - * Skip given number of bytes forward. - * @param offset number of bytes - * @return 0 on success, <0 on error - *) -{$IF LIBAVFORMAT_VERSION < 52074000} // 52.74.0 -procedure url_fskip(s: PByteIOContext; offset: cint64); - cdecl; external av__format; -{$ELSE} -function url_fskip(s: PByteIOContext; offset: cint64): cint; - cdecl; external av__format; -{$IFEND} - -(** - * ftell() equivalent for ByteIOContext. - * @return position or AVERROR. - *) -function url_ftell(s: PByteIOContext): cint64; - cdecl; external av__format; - -(** - * Get the filesize. - * @return filesize or AVERROR - *) -function url_fsize(s: PByteIOContext): cint64; - cdecl; external av__format; - -(** - * feof() equivalent for ByteIOContext. - * @return non zero if and only if end of file - *) -function url_feof(s: PByteIOContext): cint; - cdecl; external av__format; - -function url_ferror(s: PByteIOContext): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52004000} // 52.4.0 -function av_url_read_fpause(h: PByteIOContext; pause: cint): cint; - cdecl; external av__format; -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52001000} // 52.1.0 -function av_url_read_fseek(h: PByteIOContext; stream_index: cint; - timestamp: cint64; flags: cint): cint64; - cdecl; external av__format; -{$IFEND} - -const - URL_EOF = -1; -(** @note return URL_EOF (-1) if EOF *) -function url_fgetc(s: PByteIOContext): cint; - cdecl; external av__format; - -(** @warning currently size is limited *) -function url_fprintf(s: PByteIOContext; fmt: {const} PAnsiChar; args: array of const): cint; - cdecl; external av__format; - -(** @note unlike fgets, the EOL character is not returned and a whole - line is parsed. return NULL if first char read was EOF *) -function url_fgets(s: PByteIOContext; buf: PAnsiChar; buf_size: cint): PAnsiChar; - cdecl; external av__format; - -procedure put_flush_packet (s: PByteIOContext); - cdecl; external av__format; - -(** - * Read size bytes from ByteIOContext into buf. - * @return number of bytes read or AVERROR - *) -function get_buffer(s: PByteIOContext; buf: PByteArray; size: cint): cint; - cdecl; external av__format; - -(** - * Read size bytes from ByteIOContext into buf. - * This reads at most 1 packet. If that is not enough fewer bytes will be - * returned. - * @return number of bytes read or AVERROR - *) -function get_partial_buffer(s: PByteIOContext; buf: PByteArray; size: cint): cint; - cdecl; external av__format; - -(** @note return 0 if EOF, so you cannot use it if EOF handling is - necessary *) -function get_byte(s: PByteIOContext): cint; - cdecl; external av__format; -function get_le24(s: PByteIOContext): cuint; - cdecl; external av__format; -function get_le32(s: PByteIOContext): cuint; - cdecl; external av__format; -function get_le64(s: PByteIOContext): cuint64; - cdecl; external av__format; -function get_le16(s: PByteIOContext): cuint; - cdecl; external av__format; - -function get_strz(s: PByteIOContext; buf: PAnsiChar; maxlen: cint): PAnsiChar; - cdecl; external av__format; -function get_be16(s: PByteIOContext): cuint; - cdecl; external av__format; -function get_be24(s: PByteIOContext): cuint; - cdecl; external av__format; -function get_be32(s: PByteIOContext): cuint; - cdecl; external av__format; -function get_be64(s: PByteIOContext): cuint64; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 51017001} // 51.17.1 - {$IF LIBAVFORMAT_VERSION < 52078003} // < 52.78.3 -function ff_get_v(bc: PByteIOContext): cuint64; - cdecl; external av__format; - {$ELSE} - {$IFDEF FF_API_URL_RESETBUF} -function ff_get_v(bc: PByteIOContext): cuint64; - cdecl; external av__format; - {$ENDIF} - {$IFEND} -{$IFEND} - -function url_is_streamed(s: PByteIOContext): cint; {$IFDEF HasInline}inline;{$ENDIF} - -(** - * Create and initialize a ByteIOContext for accessing the - * resource referenced by the URLContext h. - * @note When the URLContext h has been opened in read+write mode, the - * ByteIOContext can be used only for writing. - * - * @param s Used to return the pointer to the created ByteIOContext. - * In case of failure the pointed to value is set to NULL. - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -{$IF LIBAVFORMAT_VERSION >= 52000000} // 52.0.0 -function url_fdopen (var s: PByteIOContext; h: PURLContext): cint; -{$ELSE} -function url_fdopen (s: PByteIOContext; h: PURLContext): cint; -{$IFEND} - cdecl; external av__format; - -(** @warning must be called before any I/O *) -function url_setbufsize (s: PByteIOContext; buf_size: cint): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION_MAJOR < 53} -{$IF LIBAVFORMAT_VERSION >= 51015000} // 51.15.0 -(** 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: PByteIOContext; flags: cint): cint; - cdecl; external av__format; -{$IFEND} -{$IFEND} - -{$IF LIBAVFORMAT_VERSION >= 52061000} // 52.61.0 -(** - * Rewind the ByteIOContext using the specified buffer containing the first buf_size bytes of the file. - * Used after probing to avoid seeking. - * Joins buf and s->buffer, taking any overlap into consideration. - * @note s->buffer must overlap with buf or they can't be joined and the function fails - * @note This function is NOT part of the public API - * - * @param s The read-only ByteIOContext to rewind - * @param buf The probe buffer containing the first buf_size bytes of the file - * @param buf_size The size of buf - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -function ff_rewind_with_probe_data(s: PByteIOContext; buf: PAnsiChar; buf_size: cint): cint; - cdecl; external av__format; -{$IFEND} - -(** - * Create and initialize a ByteIOContext for accessing the - * resource indicated by url. - * @note When the resource indicated by url has been opened in - * read+write mode, the ByteIOContext can be used only for writing. - * - * @param s Used to return the pointer to the created ByteIOContext. - * 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 - * @return 0 in case of success, a negative value corresponding to an - * AVERROR code in case of failure - *) -{$IF LIBAVFORMAT_VERSION < 52047000} // 52.47.0 -{$IF LIBAVFORMAT_VERSION >= 52000000} // 52.0.0 -function url_fopen(var s: PByteIOContext; filename: {const} PAnsiChar; flags: cint): cint; -{$ELSE} -function url_fopen(s: PByteIOContext; filename: {const} PAnsiChar; flags: cint): cint; -{$IFEND} -{$ELSE} -function url_fopen(var s: PByteIOContext; url: {const} PAnsiChar; flags: cint): cint; -{$IFEND} - cdecl; external av__format; -function url_fclose(s: PByteIOContext): cint; - cdecl; external av__format; -function url_fileno(s: PByteIOContext): PURLContext; - cdecl; external av__format; - -(** - * Return the maximum packet size associated to packetized buffered file - * handle. If the file is not packetized (stream like http or file on - * disk), then 0 is returned. - * - * @param s buffered file handle - * @return maximum packet size in bytes - *) -function url_fget_max_packet_size (s: PByteIOContext): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 52000000} // 52.0.0 -function url_open_buf(var s: PByteIOContext; buf: PAnsiChar; buf_size: cint; flags: cint): cint; -{$ELSE} -function url_open_buf(s: PByteIOContext; buf: PAnsiChar; buf_size: cint; flags: cint): cint; -{$IFEND} - cdecl; external av__format; - -(** return the written or read size *) -function url_close_buf(s: PByteIOContext): cint; - cdecl; external av__format; - -(** - * Open a write only memory stream. - * - * @param s new IO context - * @return zero if no error. - *) -{$IF LIBAVFORMAT_VERSION >= 52000000} // 52.0.0 -function url_open_dyn_buf(var s: PByteIOContext): cint; -{$ELSE} -function url_open_dyn_buf(s: PByteIOContext): cint; -{$IFEND} - cdecl; external av__format; - -(** - * Open a write only packetized memory stream with a maximum packet - * size of 'max_packet_size'. The stream is stored in a memory buffer - * with a big endian 4 byte header giving the packet size in bytes. - * - * @param s new IO context - * @param max_packet_size maximum packet size (must be > 0) - * @return zero if no error. - *) -{$IF LIBAVFORMAT_VERSION >= 52000000} // 52.0.0 -function url_open_dyn_packet_buf(var s: PByteIOContext; max_packet_size: cint): cint; -{$ELSE} -function url_open_dyn_packet_buf(s: PByteIOContext; max_packet_size: cint): cint; -{$IFEND} - cdecl; external av__format; - -(** - * Return the written size and a pointer to the buffer. The buffer - * must be freed with av_free(). If the buffer is opened with - * url_open_dyn_buf, then padding of FF_INPUT_BUFFER_PADDING_SIZE is - * added; if opened with url_open_dyn_packet_buf, no padding is added. - * @param s IO context - * @param pbuffer pointer to a byte buffer - * @return the length of the byte buffer - *) -function url_close_dyn_buf(s: PByteIOContext; pbuffer:PPointer): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION >= 51017001} // 51.17.1 -function ff_crc04C11DB7_update(checksum: culong; buf: {const} PByteArray; - len: cuint): culong; - cdecl; external av__format; -{$IFEND} - -function get_checksum(s: PByteIOContext): culong; - cdecl; external av__format; -procedure init_gsum(s: PByteIOContext; - update_checksum: pointer; - checksum: culong); - cdecl; external av__format; - -(* udp.c *) -function udp_set_remote_url(h: PURLContext; uri: {const} PAnsiChar): cint; - cdecl; external av__format; -function udp_get_local_port(h: PURLContext): cint; - cdecl; external av__format; - -{$IF LIBAVFORMAT_VERSION_MAJOR <= 52} -function udp_get_file_handle(h: PURLContext): cint; - cdecl; external av__format; -{$IFEND} - -implementation - -function url_is_streamed(s: PByteIOContext): cint; -begin - Result := s^.is_streamed; -end; - -end. diff --git a/mediaplugin/src/lib/ffmpeg/avutil.pas b/mediaplugin/src/lib/ffmpeg/avutil.pas deleted file mode 100644 index 2f8c79f7..00000000 --- a/mediaplugin/src/lib/ffmpeg/avutil.pas +++ /dev/null @@ -1,504 +0,0 @@ -(* - * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversions of - * - * libavutil/avutil.h: - * Min. version: 49.0.1, revision 6577, Sat Oct 7 15:30:46 2006 UTC - * Max. version: 50.24.0, revision 24814, Wed Aug 25 05:00:00 2010 CET - * - * libavutil/mem.h: - * revision 23904, Wed Jul 21 01:00:00 2010 CET - * - * libavutil/log.h: - * revision 23972, Wed Jul 21 01:00:00 2010 CET - * - * include/keep pixfmt.h (change in revision 50.01.0) - * Maybe, the pixelformats are not needed, but it has not been checked. - * log.h is only partial. - * - *) - -unit avutil; - -{$IFDEF FPC} - {$MODE DELPHI} - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$IFDEF DARWIN} - {$linklib libavutil} -{$ENDIF} - -interface - -uses - ctypes, - mathematics, - rational, - {$IFDEF UNIX} - BaseUnix, - {$ENDIF} - UConfig; - -const - (* - * IMPORTANT: The official FFmpeg C headers change very quickly. Often some - * of the data structures are changed so that they become incompatible with - * older header files. The Pascal headers have to be adjusted to those changes, - * otherwise the application might crash randomly or strange bugs (not - * necessarily related to video or audio due to buffer overflows etc.) might - * occur. - * - * In the past users reported problems with USDX that took hours to fix and - * the problem was an unsupported version of FFmpeg. So we decided to disable - * support for future versions of FFmpeg until the headers are revised by us - * for that version as they otherwise most probably will break USDX. - * - * If the headers do not yet support your FFmpeg version you may want to - * adjust the max. version numbers manually but please note: it may work but - * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT - * for the game if the MAX. VERSION WAS CHANGED. - * - * The only safe way to support new versions of FFmpeg is to add the changes - * of the FFmpeg git repository C headers to the Pascal headers. - * You can accelerate this process by posting a patch with the git changes - * translated to Pascal to our bug tracker (please join our IRC chat before - * you start working on it). Simply adjusting the max. versions is NOT a valid - * fix. - *) - (* Max. supported version by this header *) - LIBAVUTIL_MAX_VERSION_MAJOR = 50; - LIBAVUTIL_MAX_VERSION_MINOR = 24; - LIBAVUTIL_MAX_VERSION_RELEASE = 0; - LIBAVUTIL_MAX_VERSION = (LIBAVUTIL_MAX_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVUTIL_MAX_VERSION_MINOR * VERSION_MINOR) + - (LIBAVUTIL_MAX_VERSION_RELEASE * VERSION_RELEASE); - - (* Min. supported version by this header *) - LIBAVUTIL_MIN_VERSION_MAJOR = 49; - LIBAVUTIL_MIN_VERSION_MINOR = 0; - LIBAVUTIL_MIN_VERSION_RELEASE = 1; - LIBAVUTIL_MIN_VERSION = (LIBAVUTIL_MIN_VERSION_MAJOR * VERSION_MAJOR) + - (LIBAVUTIL_MIN_VERSION_MINOR * VERSION_MINOR) + - (LIBAVUTIL_MIN_VERSION_RELEASE * VERSION_RELEASE); - -(* Check if linked versions are supported *) -{$IF (LIBAVUTIL_VERSION < LIBAVUTIL_MIN_VERSION)} - {$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!'} -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 49008000} // 49.8.0 -(** - * Return the LIBAVUTIL_VERSION_INT constant. - *) -function avutil_version(): cuint; - cdecl; external av__util; -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 50004000} // >= 50.4.0 -(** - * Return the libavutil build-time configuration. - *) -function avutil_configuration(): PAnsiChar; - cdecl; external av__util; - -(** - * Return the libavutil license. - *) -function avutil_license(): PAnsiChar; - cdecl; external av__util; -{$IFEND} - -{ - TAVMediaType moved to avutil in LIBAVUTIL_VERSION 50.14.0 - but moving it in the pascal headers was not really necessary - but caused problems. So, I (KMS) left it there. - -type - TAVMediaType = ( - AVMEDIA_TYPE_UNKNOWN = -1, - AVMEDIA_TYPE_VIDEO, - AVMEDIA_TYPE_AUDIO, - AVMEDIA_TYPE_DATA, - AVMEDIA_TYPE_SUBTITLE, - AVMEDIA_TYPE_ATTACHMENT, - AVMEDIA_TYPE_NB - ); -} - -{$INCLUDE error.pas} - -(* libavutil/pixfmt.h up to revision 23144, May 16 2010 *) - -type -(** - * Pixel format. Notes: - * - * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA - * color is put together as: - * (A << 24) | (R << 16) | (G << 8) | B - * This is stored as BGRA on little-endian CPU architectures and ARGB on - * big-endian CPUs. - * - * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized - * image data is stored in AVFrame.data[0]. The palette is transported in - * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is - * formatted the same as in PIX_FMT_RGB32 described above (i.e., it is - * also endian-specific). Note also that the individual RGB palette - * components stored in AVFrame.data[1] should be in the range 0..255. - * This is important as many custom PAL8 video codecs that were designed - * to run on the IBM VGA graphics adapter use 6-bit palette components. - * - * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like - * for pal8. This palette is filled in automatically by the function - * allocating the picture. - * - * Note, make sure that all newly added big endian formats have pix_fmt&1==1 - * and that all newly added little endian formats have pix_fmt&1==0 - * this allows simpler detection of big vs little endian. - *) - - PAVPixelFormat = ^TAVPixelFormat; - TAVPixelFormat = ( - PIX_FMT_NONE= -1, - PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) - PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr - PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... - PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... - PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) - PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) -{$IF LIBAVUTIL_VERSION <= 50001000} // 50.01.0 - PIX_FMT_RGB32, ///< packed RGB 8:8:8, 32bpp, (msb)8A 8R 8G 8B(lsb), in CPU endianness -{$IFEND} - PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) - PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) -{$IF LIBAVUTIL_VERSION <= 50000000} // 50.00.0 - PIX_FMT_RGB565, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), in CPU endianness - PIX_FMT_RGB555, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), in CPU endianness, most significant bit to 0 -{$IFEND} - PIX_FMT_GRAY8, ///< Y , 8bpp - PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb - PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb - PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette - PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG) - PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG) - PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG) - PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing - PIX_FMT_XVMC_MPEG2_IDCT, - PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 - PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 -{$IF LIBAVUTIL_VERSION <= 50001000} // 50.01.0 - PIX_FMT_BGR32, ///< packed RGB 8:8:8, 32bpp, (msb)8A 8B 8G 8R(lsb), in CPU endianness -{$IFEND} -{$IF LIBAVUTIL_VERSION <= 50000000} // 50.00.0 - PIX_FMT_BGR565, ///< packed RGB 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), in CPU endianness - PIX_FMT_BGR555, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), in CPU endianness, most significant bit to 1 -{$IFEND} - PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) - PIX_FMT_BGR4, ///< packed RGB 1:2:1, bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits - PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) - PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) - PIX_FMT_RGB4, ///< packed RGB 1:2:1, bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits - PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) - PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) - PIX_FMT_NV21, ///< as above, but U and V bytes are swapped -{$IF LIBAVUTIL_VERSION <= 50001000} // 50.01.0 - PIX_FMT_RGB32_1, ///< packed RGB 8:8:8, 32bpp, (msb)8R 8G 8B 8A(lsb), in CPU endianness - PIX_FMT_BGR32_1, ///< packed RGB 8:8:8, 32bpp, (msb)8B 8G 8R 8A(lsb), in CPU endianness -{$ELSE} // 50.02.0 - PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... - PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... - PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... - PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... -{$IFEND} - PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian - PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian - PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) - PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG) - PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) - PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers -{$IF LIBAVUTIL_VERSION >= 49015000} // 49.15.0 - PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian - PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian -{$IFEND} -{$IF LIBAVUTIL_VERSION >= 50001000} // 50.01.0 - PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian - PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian - PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 - PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 - - PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian - PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian - PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 - PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 - - PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers - PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers - PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers -{$IFEND} - PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions - ); - -const -{$ifdef WORDS_BIGENDIAN} - {$IF LIBAVUTIL_VERSION <= 50001000} // 50.01.0 - PIX_FMT_RGBA = PIX_FMT_RGB32_1; - PIX_FMT_BGRA = PIX_FMT_BGR32_1; - PIX_FMT_ARGB = PIX_FMT_RGB32; - PIX_FMT_ABGR = PIX_FMT_BGR32; - {$ELSE} // 50.02.0 - PIX_FMT_RGB32 = PIX_FMT_ARGB; - PIX_FMT_RGB32_1 = PIX_FMT_RGBA; - PIX_FMT_BGR32 = PIX_FMT_ABGR; - PIX_FMT_BGR32_1 = PIX_FMT_BGRA; - {$IFEND} - PIX_FMT_GRAY16 = PIX_FMT_GRAY16BE; - {$IF LIBAVUTIL_VERSION >= 49015000} // 49.15.0 - PIX_FMT_RGB48 = PIX_FMT_RGB48BE; - {$IFEND} - {$IF LIBAVUTIL_VERSION >= 50001000} // 50.01.0 - PIX_FMT_RGB565 = PIX_FMT_RGB565BE; - PIX_FMT_RGB555 = PIX_FMT_RGB555BE; - PIX_FMT_BGR565 = PIX_FMT_BGR565BE; - PIX_FMT_BGR555 = PIX_FMT_BGR555BE - {$IFEND} -{$else} - {$IF LIBAVUTIL_VERSION <= 50001000} // 50.01.0 - PIX_FMT_RGBA = PIX_FMT_BGR32; - PIX_FMT_BGRA = PIX_FMT_RGB32; - PIX_FMT_ARGB = PIX_FMT_BGR32_1; - PIX_FMT_ABGR = PIX_FMT_RGB32_1; - {$ELSE} // 50.02.0 - PIX_FMT_RGB32 = PIX_FMT_BGRA; - PIX_FMT_RGB32_1 = PIX_FMT_ABGR; - PIX_FMT_BGR32 = PIX_FMT_RGBA; - PIX_FMT_BGR32_1 = PIX_FMT_ARGB; - {$IFEND} - PIX_FMT_GRAY16 = PIX_FMT_GRAY16LE; - {$IF LIBAVUTIL_VERSION >= 49015000} // 49.15.0 - PIX_FMT_RGB48 = PIX_FMT_RGB48LE; - {$IFEND} - {$IF LIBAVUTIL_VERSION >= 50001000} // 50.01.0 - PIX_FMT_RGB565 = PIX_FMT_RGB565LE; - PIX_FMT_RGB555 = PIX_FMT_RGB555LE; - PIX_FMT_BGR565 = PIX_FMT_BGR565LE; - PIX_FMT_BGR555 = PIX_FMT_BGR555LE; - {$IFEND} -{$ENDIF} - -{$IF LIBAVUTIL_VERSION_MAJOR < 50} // 50.0.0 - PIX_FMT_UYVY411 = PIX_FMT_UYYVYY411; - PIX_FMT_RGBA32 = PIX_FMT_RGB32; - PIX_FMT_YUV422 = PIX_FMT_YUYV422; -{$IFEND} - -(* libavutil/common.h *) // until now MKTAG and MKBETAG is all from common.h KMS 19/5/2010 - -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: cuint): 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: cuint): pointer; - cdecl; external av__util; {av_alloc_size(2)} - -(** - * 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: cuint): pointer; - cdecl; external av__util; {av_malloc_attrib av_alloc_size(1)} - -(** - * 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} - -(** - * Freesa 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; - -(* libavutil/log.h *) - -const -{$IF LIBAVUTIL_VERSION_MAJOR < 50} - AV_LOG_QUIET = -1; - AV_LOG_FATAL = 0; - AV_LOG_ERROR = 0; - AV_LOG_WARNING = 1; - AV_LOG_INFO = 1; - AV_LOG_VERBOSE = 1; - AV_LOG_DEBUG = 2; -{$ELSE} - 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; -{$IFEND} - -(** - * 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 -#ifdef __GNUC__ -void av_log(void*, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); -#else -void av_log(void*, int level, const char *fmt, ...); -#endif - -void av_vlog(void*, int level, const char *fmt, va_list); -**} - -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); -**} - -{$IF LIBAVUTIL_VERSION >= 50015003} // 50.15.3 -function av_default_item_name (ctx: pointer): Pchar; - cdecl; external av__util; -{$IFEND} - -implementation - -(* libavutil/common.h *) - -function MKTAG(a, b, c, d: AnsiChar): integer; -begin - Result := (ord(a) or (ord(b) shl 8) or (ord(c) shl 16) or (ord(d) shl 24)); -end; - -function MKBETAG(a, b, c, d: AnsiChar): integer; -begin - Result := (ord(d) or (ord(c) shl 8) or (ord(b) shl 16) or (ord(a) shl 24)); -end; - -end. diff --git a/mediaplugin/src/lib/ffmpeg/error.pas b/mediaplugin/src/lib/ffmpeg/error.pas deleted file mode 100644 index 720005b6..00000000 --- a/mediaplugin/src/lib/ffmpeg/error.pas +++ /dev/null @@ -1,115 +0,0 @@ -(* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of the Pascal port of ffmpeg. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavutil/error.h - * Max. avutil version: 50.21.0, revision 24190, Wed Jul 21 01:00:00 2010 CET - * - *) - -{$IF LIBAVUTIL_VERSION >= 50012000} // >= 50.12.0 - -{* error handling *} - -const -{$IFDEF UNIX} - ENOENT = ESysENOENT; - EIO = ESysEIO; - ENOMEM = ESysENOMEM; - EINVAL = ESysEINVAL; - EDOM = ESysEDOM; - ENOSYS = ESysENOSYS; - EILSEQ = ESysEILSEQ; - EPIPE = ESysEPIPE; -{$ELSE} - ENOENT = 2; - EIO = 5; - ENOMEM = 12; - EINVAL = 22; - EPIPE = 32; // just an assumption. needs to be checked. - EDOM = 33; - {$IFDEF MSWINDOWS} - // Note: we assume that ffmpeg was compiled with MinGW. - // This must be changed if DLLs were compiled with cygwin. - ENOSYS = 40; // MSVC/MINGW: 40, CYGWIN: 88, LINUX/FPC: 38 - EILSEQ = 42; // MSVC/MINGW: 42, CYGWIN: 138, LINUX/FPC: 84 - {$ENDIF} -{$ENDIF} - -(** - * We need the sign of the error, because some platforms have - * E* and errno already negated. The previous version failed - * with Delphi, because it needed EINVAL defined. - * Warning: This code is platform dependent and assumes constants - * to be 32 bit. - * This version does the following steps: - * 1) shr 30: shifts the sign bit to bit position 2 - * 2) and $00000002: sets all other bits to zero - * positive EINVAL gives 0, negative gives 2 - * 3) not: inverts all bits. This gives -1 and -3 - * 3) - 1: positive EINVAL gives -1, negative 1 - *) -const - AVERROR_SIGN = (EINVAL shr 30) and $00000002 - 1; - -(* -#if EINVAL > 0 -#define AVERROR(e) (-(e)) {**< Returns a negative error code from a POSIX error code, to return from library functions. *} -#define AVUNERROR(e) (-(e)) {**< Returns a POSIX error code from a library function error return value. *} -#else -{* Some platforms have E* and errno already negated. *} -#define AVERROR(e) (e) -#define AVUNERROR(e) (e) -#endif -*) - -const - AVERROR_UNKNOWN = AVERROR_SIGN * EINVAL; (**< unknown error *) - AVERROR_IO = AVERROR_SIGN * EIO; (**< I/O error *) - AVERROR_NUMEXPECTED = AVERROR_SIGN * EDOM; (**< Number syntax expected in filename. *) - AVERROR_INVALIDDATA = AVERROR_SIGN * EINVAL; (**< invalid data found *) - AVERROR_NOMEM = AVERROR_SIGN * ENOMEM; (**< not enough memory *) - AVERROR_NOFMT = AVERROR_SIGN * EILSEQ; (**< unknown format *) - AVERROR_NOTSUPP = AVERROR_SIGN * ENOSYS; (**< Operation not supported. *) - AVERROR_NOENT = AVERROR_SIGN * ENOENT; (**< No such file or directory. *) -{$IF LIBAVCODEC_VERSION >= 52017000} // 52.17.0 - AVERROR_EOF = AVERROR_SIGN * EPIPE; (**< End of file. *) -{$IFEND} - // Note: function calls as constant-initializers are invalid - //AVERROR_PATCHWELCOME = -MKTAG('P','A','W','E'); {**< Not yet implemented in FFmpeg. Patches welcome. *} - AVERROR_PATCHWELCOME = -(ord('P') or (ord('A') shl 8) or (ord('W') shl 16) or (ord('E') shl 24)); -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 50013000} // >= 50.13.0 -(* - * Put a description of the AVERROR code errnum in errbuf. - * In case of failure the global variable errno is set to indicate the - * error. Even in case of failure av_strerror() will print a generic - * error message indicating the errnum provided to errbuf. - * - * @param errnum error code to describe - * @param errbuf buffer to which description is written - * @param errbuf_size the size in bytes of errbuf - * @return 0 on success, a negative value if a description for errnum - * cannot be found - *) - -function av_strerror(errnum: cint; errbuf: Pchar; errbuf_size: cint): cint; - cdecl; external av__util; -{$IFEND} diff --git a/mediaplugin/src/lib/ffmpeg/mathematics.pas b/mediaplugin/src/lib/ffmpeg/mathematics.pas deleted file mode 100644 index 98901c2a..00000000 --- a/mediaplugin/src/lib/ffmpeg/mathematics.pas +++ /dev/null @@ -1,133 +0,0 @@ -(* - * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavutil/mathematics.h - * avutil max. version 50.23.0, revision 24439, Wed Aug 25 05:00:00 2010 CET - * - *) - -unit mathematics; - -{$IFDEF FPC} - {$MODE DELPHI } - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -interface - -uses - ctypes, - rational, - UConfig; - -const - M_E = 2.7182818284590452354; // e - M_LN2 = 0.69314718055994530942; // log_e 2 - M_LN10 = 2.30258509299404568402; // log_e 10 -{$IF LIBAVUTIL_VERSION >= 50009000} // >= 50.9.0 - M_LOG2_10 = 3.32192809488736234787; // log_2 10 -{$IFEND} -{$IF LIBAVUTIL_VERSION >= 50023000} // >= 50.23.0 - M_PHI = 1.61803398874989484820; // phi / golden ratio -{$IFEND} - M_PI = 3.14159265358979323846; // pi - M_SQRT1_2 = 0.70710678118654752440; // 1/sqrt(2) -{$IF LIBAVUTIL_VERSION >= 50014000} // >= 50.14.0 - M_SQRT2 = 1.41421356237309504880; // sqrt(2) -{$IFEND} -{$IF LIBAVUTIL_VERSION >= 50005001} // >= 50.5.1 - NAN = 0.0/0.0; - INFINITY = 1.0/0.0; -{$IFEND} - -type - TAVRounding = ( - AV_ROUND_ZERO = 0, ///< Round toward zero. - AV_ROUND_INF = 1, ///< Round away from zero. - AV_ROUND_DOWN = 2, ///< Round toward -infinity. - AV_ROUND_UP = 3, ///< Round toward +infinity. - AV_ROUND_NEAR_INF = 5 ///< Round to nearest and halfway cases away from zero. - ); - -{$IF LIBAVUTIL_VERSION >= 49013000} // 49.13.0 -(** - * Return the greatest common divisor of a and b. - * If both a or b are 0 or either or both are <0 then behavior is - * undefined. - *) -function av_gcd(a: cint64; b: cint64): cint64; - cdecl; external av__util; {av_const} -{$IFEND} - -(** - * Rescale a 64-bit integer with rounding to nearest. - * A simple a*b/c isn't possible as it can overflow. - *) -function av_rescale (a, b, c: cint64): cint64; - cdecl; external av__util; {av_const} - -(** - * Rescale a 64-bit integer with specified rounding. - * A simple a*b/c isn't possible as it can overflow. - *) -function av_rescale_rnd (a, b, c: cint64; enum: TAVRounding): cint64; - cdecl; external av__util; {av_const} - -(** - * Rescale a 64-bit integer by 2 rational numbers. - *) -function av_rescale_q (a: cint64; bq, cq: TAVRational): cint64; - cdecl; external av__util; {av_const} - -{$IF LIBAVUTIL_VERSION >= 50008000} // 50.8.0 -(** - * Compare 2 timestamps each in its own timebases. - * The result of the function is undefined if one of the timestamps - * is outside the int64_t range when represented in the others timebase. - * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position - *) -function av_compare_ts(ts_a: cint64; tb_a: TAVRational; ts_b: cint64; tb_b: TAVRational): cint; - cdecl; external av__util; -{$IFEND} - -{$IF LIBAVUTIL_VERSION >= 50018000} // 50.18.0 -(** - * Compare 2 integers modulo mod. - * That is we compare integers a and b for which only the least - * significant log2(mod) bits are known. - * - * @param mod must be a power of 2 - * @return a negative value if a is smaller than b - * a positiv value if a is greater than b - * 0 if a equals b - *) -function av_compare_mod(a: cuint64; b: cuint64; modVar: cuint64): cint64; - cdecl; external av__util; -{$IFEND} - -implementation - -end. diff --git a/mediaplugin/src/lib/ffmpeg/opt.pas b/mediaplugin/src/lib/ffmpeg/opt.pas deleted file mode 100644 index 8669eaf6..00000000 --- a/mediaplugin/src/lib/ffmpeg/opt.pas +++ /dev/null @@ -1,261 +0,0 @@ -(* - * AVOptions - * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavcodec/opt.h - * Max. avcodec version: 52.86.1, 24882, Wed Aug 23 07:00:00 2010 CET - * - *) - -unit opt; - -{$IFDEF FPC} - {$MODE DELPHI} - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -interface - -uses - ctypes, - rational, - UConfig; - -type - TAVOptionType = ( - FF_OPT_TYPE_FLAGS, - FF_OPT_TYPE_INT, - FF_OPT_TYPE_INT64, - FF_OPT_TYPE_DOUBLE, - FF_OPT_TYPE_FLOAT, - FF_OPT_TYPE_STRING, - 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 - ); - -const - AV_OPT_FLAG_ENCODING_PARAM = 1; ///< a generic parameter which can be set by the user for muxing or encoding - AV_OPT_FLAG_DECODING_PARAM = 2; ///< a generic parameter which can be set by the user for demuxing or decoding - AV_OPT_FLAG_METADATA = 4; ///< some data extracted or inserted into the file like title, comment, ... - AV_OPT_FLAG_AUDIO_PARAM = 8; - AV_OPT_FLAG_VIDEO_PARAM = 16; - AV_OPT_FLAG_SUBTITLE_PARAM = 32; - -type - (** - * AVOption - *) - PAVOption = ^TAVOption; - TAVOption = record - name: {const} PAnsiChar; - - (** - * short English help text - * @todo What about other languages? - *) - help: {const} PAnsiChar; - - (** - * The offset relative to the context structure where the option - * value is stored. It should be 0 for named constants. - *) - offset: cint; - type_: TAVOptionType; - - (** - * the default value for scalar options - *) - default_val: cdouble; - min: cdouble; ///< minimum valid value for the option - max: cdouble; ///< maximum valid value for the option - - flags: cint; -//FIXME think about enc-audio, ... style flags - - (** - * The logical unit to which the option belongs. Non-constant - * options and corresponding named constants share the same - * unit. May be NULL. - *) - unit_: {const} PAnsiChar; - end; - -{$IF LIBAVCODEC_VERSION >= 52042000} // >= 52.42.0 -(** - * AVOption2. - * THIS IS NOT PART OF THE API/ABI YET! - * This is identical to AVOption except that default_val was replaced by - * an union, it should be compatible with AVOption on normal platforms. - *) -type - PAVOption2 = ^TAVOption2; - TAVOption2 = record - name : {const} PAnsiChar; - - (** - * short English help text - * @todo What about other languages? - *) - help : {const} PAnsiChar; - - (** - * The offset relative to the context structure where the option - * value is stored. It should be 0 for named constants. - *) - offset : cint; - type_ : TAVOptionType; - - (** - * the default value for scalar options - *) - default_val : record - case cint of - 0 : (dbl: cdouble); - 1 : (str: PAnsiChar); - end; - min : cdouble; - max : cdouble; - flags : cint; -//FIXME think about enc-audio, ... style flags - - (** - * The logical unit to which the option belongs. Non-constant - * options and corresponding named constants share the same - * unit. May be NULL. - *) - unit_: {const} PAnsiChar; - end; -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 51039000} // 51.39.0 -(** - * Look for an option in obj. Look only for the options which - * have the flags set as specified in mask and flags (that is, - * for which it is the case that opt->flags & mask == flags). - * - * @param[in] obj a pointer to a struct whose first element is a - * pointer to an AVClass - * @param[in] name the name of the option to look for - * @param[in] unit the unit of the option to look for, or any if NULL - * @return a pointer to the option found, or NULL if no option - * has been found - *) -function av_find_opt(obj: Pointer; {const} name: {const} PAnsiChar; {const} unit_: PAnsiChar; mask: cint; flags: cint): {const} PAVOption; - cdecl; external av__codec; -{$IFEND} - -{$IF LIBAVCODEC_VERSION_MAJOR < 53} - -(** - * @see av_set_string2() - *) -function av_set_string(obj: pointer; name: {const} PAnsiChar; val: {const} PAnsiChar): {const} PAVOption; - cdecl; external av__codec; deprecated; - -{$IF LIBAVCODEC_VERSION >= 51059000} // 51.59.0 -(** - * @return a pointer to the AVOption corresponding to the field set or - * NULL if no matching AVOption exists, or if the value val is not - * valid - * @see av_set_string3() - *) -function av_set_string2(obj: Pointer; name: {const} PAnsiChar; val: {const} PAnsiChar; alloc: cint): {const} PAVOption; - cdecl; external av__codec; deprecated; -{$IFEND} - -{$IFEND} - -{$IF LIBAVCODEC_VERSION >= 52007000} // 52.7.0 -(** - * 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. 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[out] o_out if non-NULL put here a pointer to the AVOption - * found - * @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(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__codec; -{$IFEND} - -function av_set_double(obj: pointer; name: {const} PAnsiChar; n: cdouble): PAVOption; - cdecl; external av__codec; - -function av_set_q(obj: pointer; name: {const} PAnsiChar; n: TAVRational): PAVOption; - cdecl; external av__codec; - -function av_set_int(obj: pointer; name: {const} PAnsiChar; n: cint64): PAVOption; - cdecl; external av__codec; - -function av_get_double(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): cdouble; - cdecl; external av__codec; - -function av_get_q(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): TAVRational; - cdecl; external av__codec; - -function av_get_int(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption): cint64; - cdecl; external av__codec; - -function av_get_string(obj: pointer; name: {const} PAnsiChar; var o_out: {const} PAVOption; buf: PAnsiChar; buf_len: cint): PAnsiChar; - cdecl; external av__codec; - -function av_next_option(obj: pointer; last: {const} PAVOption): PAVOption; - cdecl; external av__codec; - -function av_opt_show(obj: pointer; av_log_obj: pointer): cint; - cdecl; external av__codec; - -procedure av_opt_set_defaults(s: pointer); - cdecl; external av__codec; - -{$IF LIBAVCODEC_VERSION >= 51039000} // 51.39.0 -procedure av_opt_set_defaults2(s: Pointer; mask: cint; flags: cint); - cdecl; external av__codec; -{$IFEND} - -implementation - -end. diff --git a/mediaplugin/src/lib/ffmpeg/rational.pas b/mediaplugin/src/lib/ffmpeg/rational.pas deleted file mode 100644 index 323d7937..00000000 --- a/mediaplugin/src/lib/ffmpeg/rational.pas +++ /dev/null @@ -1,170 +0,0 @@ -(* - * rational numbers - * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This is a part of Pascal porting of ffmpeg. - * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows. - * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT - * in the source codes. - * - Changes and updates by the UltraStar Deluxe Team - * - * Conversion of libavutil/rational.h - * avutil max. version 50.21.0, revision 24190, Wed Jul 21 01:00:00 2010 CET - * - *) - -unit rational; - -{$IFDEF FPC} - {$MODE DELPHI} - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$I switches.inc} - -interface - -uses - ctypes, - UConfig; - -type - (* - * rational number numerator/denominator - *) - PAVRational = ^TAVRational; - TAVRational = record - num: cint; ///< numerator - den: cint; ///< denominator - end; - - TAVRationalArray = array[0 .. (MaxInt div SizeOf(TAVRational))-1] of TAVRational; - PAVRationalArray = ^TAVRationalArray; - -(** - * Compare two rationals. - * @param a first rational - * @param b second rational - * @return 0 if a==b, 1 if a>b and -1 if a<b - *) -function av_cmp_q(a: TAVRational; b: TAVRational): cint; {$IFDEF HasInline}inline;{$ENDIF} - -(** - * Convert rational to double. - * @param a rational to convert - * @return (double) a - *) -function av_q2d(a: TAVRational): cdouble; {$IFDEF HasInline}inline;{$ENDIF} - -(** - * Reduce a fraction. - * This is useful for framerate calculations. - * @param dst_num destination numerator - * @param dst_den destination denominator - * @param num source numerator - * @param den source denominator - * @param max the maximum allowed for dst_num & dst_den - * @return 1 if exact, 0 otherwise - *) -function av_reduce(dst_num: PCint; dst_den: PCint; num: cint64; den: cint64; max: cint64): cint; - cdecl; external av__util; - -(** - * Multiply two rationals. - * @param b first rational - * @param c second rational - * @return b*c - *) -function av_mul_q(b: TAVRational; c: TAVRational): TAVRational; - cdecl; external av__util; {av_const} - -(** - * Divide one rational by another. - * @param b first rational - * @param c second rational - * @return b/c - *) -function av_div_q(b: TAVRational; c: TAVRational): TAVRational; - cdecl; external av__util; {av_const} - -(** - * Add two rationals. - * @param b first rational - * @param c second rational - * @return b+c - *) -function av_add_q(b: TAVRational; c: TAVRational): TAVRational; - cdecl; external av__util; {av_const} - -(** - * Subtract one rational from another. - * @param b first rational - * @param c second rational - * @return b-c - *) -function av_sub_q(b: TAVRational; c: TAVRational): TAVRational; - cdecl; external av__util; {av_const} - -(** - * Convert a double precision floating point number to a rational. - * @param d double to convert - * @param max the maximum allowed numerator and denominator - * @return (AVRational) d - *) -function av_d2q(d: cdouble; max: cint): TAVRational; - cdecl; external av__util; {av_const} - -{$IF LIBAVUTIL_VERSION >= 49011000} // 49.11.0 -(** - * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer - * than q1, 0 if they have the same distance. - *) -function av_nearer_q(q, q1, q2: TAVRational): cint; - cdecl; external av__util; - -(** - * Find the nearest value in q_list to q. - * @param q_list an array of rationals terminated by {0, 0} - * @return the index of the nearest value found in the array - *) -function av_find_nearest_q_idx(q: TAVRational; q_list: {const} PAVRationalArray): cint; - cdecl; external av__util; -{$IFEND} - -implementation - -function av_cmp_q (a: TAVRational; b: TAVRational): cint; -var - tmp: cint64; -begin - tmp := a.num * cint64(b.den) - b.num * cint64(a.den); - - if (tmp <> 0) then - Result := (tmp shr 63) or 1 - else - Result := 0 -end; - -function av_q2d(a: TAVRational): cdouble; -begin - Result := a.num / a.den; -end; - -end. diff --git a/mediaplugin/src/lib/ffmpeg/swscale.pas b/mediaplugin/src/lib/ffmpeg/swscale.pas deleted file mode 100644 index 7289e902..00000000 --- a/mediaplugin/src/lib/ffmpeg/swscale.pas +++ /dev/null @@ -1,434 +0,0 @@ -(* - * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * FFmpeg Pascal port - * - Ported by the UltraStar Deluxe Team - * - * Conversion of libswscale/swscale.h - * Max. version: 0.11.0, revision 31301, Mon Jul 12 8:00:00 2010 CET - *) - -unit swscale; - -{$IFDEF FPC} - {$MODE DELPHI } - {$PACKENUM 4} (* use 4-byte enums *) - {$PACKRECORDS C} (* C/C++-compatible record packing *) -{$ELSE} - {$MINENUMSIZE 4} (* use 4-byte enums *) -{$ENDIF} - -{$IFDEF DARWIN} - {$linklib libswscale} -{$ENDIF} - -interface - -uses - ctypes, - avutil, - avcodec, - UConfig; - -const -(* - * IMPORTANT: The official FFmpeg C headers change very quickly. Often some - * of the data structures are changed so that they become incompatible with - * older header files. The Pascal headers have to be adjusted to those changes, - * otherwise the application might crash randomly or strange bugs (not - * necessarily related to video or audio due to buffer overflows etc.) might - * occur. - * - * In the past users reported problems with USDX that took hours to fix and - * the problem was an unsupported version of FFmpeg. So we decided to disable - * support for future versions of FFmpeg until the headers are revised by us - * for that version as they otherwise most probably will break USDX. - * - * If the headers do not yet support your FFmpeg version you may want to - * adjust the max. version numbers manually but please note: it may work but - * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT - * for the game if the MAX. VERSION WAS CHANGED. - * - * The only safe way to support new versions of FFmpeg is to add the changes - * of the FFmpeg git repository C headers to the Pascal headers. - * You can accelerate this process by posting a patch with the git changes - * translated to Pascal to our bug tracker (please join our IRC chat before - * you start working on it). Simply adjusting the max. versions is NOT a valid - * fix. - *) - (* Max. supported version by this header *) - LIBSWSCALE_MAX_VERSION_MAJOR = 0; - LIBSWSCALE_MAX_VERSION_MINOR = 11; - LIBSWSCALE_MAX_VERSION_RELEASE = 0; - LIBSWSCALE_MAX_VERSION = (LIBSWSCALE_MAX_VERSION_MAJOR * VERSION_MAJOR) + - (LIBSWSCALE_MAX_VERSION_MINOR * VERSION_MINOR) + - (LIBSWSCALE_MAX_VERSION_RELEASE * VERSION_RELEASE); - -(* Check if linked versions are supported *) -{$IF (LIBSWSCALE_VERSION > LIBSWSCALE_MAX_VERSION)} - {$MESSAGE Error 'Linked version of libswscale is not yet supported!'} -{$IFEND} - -type - TQuadCintArray = array[0..3] of cint; - PQuadCintArray = ^TQuadCintArray; - TCintArray = array[0..0] of cint; - PCintArray = ^TCintArray; - TPCuint8Array = array[0..0] of PCuint8; - PPCuint8Array = ^TPCuint8Array; - -{$IF LIBSWSCALE_VERSION >= 000006001} // 0.6.1 -(** - * Returns the LIBSWSCALE_VERSION_INT constant. - *) -function swscale_version(): cuint; - cdecl; external sw__scale; -{$IFEND} - -{$IF LIBSWSCALE_VERSION >= 000007002} // 0.7.2 -(** - * Returns the libswscale build-time configuration. - *) -function swscale_configuration(): PAnsiChar; - cdecl; external sw__scale; - -(** - * Returns the libswscale license. - *) -function swscale_license(): PAnsiChar; - cdecl; external sw__scale; -{$IFEND} - -const - (* values for the flags, the stuff on the command line is different *) - SWS_FAST_BILINEAR = 1; - SWS_BILINEAR = 2; - SWS_BICUBIC = 4; - SWS_X = 8; - SWS_POINT = $10; - SWS_AREA = $20; - SWS_BICUBLIN = $40; - SWS_GAUSS = $80; - SWS_SINC = $100; - SWS_LANCZOS = $200; - SWS_SPLINE = $400; - - SWS_SRC_V_CHR_DROP_MASK = $30000; - SWS_SRC_V_CHR_DROP_SHIFT = 16; - - SWS_PARAM_DEFAULT = 123456; - - SWS_PRINT_INFO = $1000; - - // the following 3 flags are not completely implemented - // internal chrominace subsampling info - SWS_FULL_CHR_H_INT = $2000; - // input subsampling info - SWS_FULL_CHR_H_INP = $4000; - SWS_DIRECT_BGR = $8000; - SWS_ACCURATE_RND = $40000; - SWS_BITEXACT = $80000; - - SWS_CPU_CAPS_MMX = $80000000; - SWS_CPU_CAPS_MMX2 = $20000000; - SWS_CPU_CAPS_3DNOW = $40000000; - SWS_CPU_CAPS_ALTIVEC = $10000000; - SWS_CPU_CAPS_BFIN = $01000000; - - SWS_MAX_REDUCE_CUTOFF = 0.002; - - SWS_CS_ITU709 = 1; - SWS_CS_FCC = 4; - SWS_CS_ITU601 = 5; - SWS_CS_ITU624 = 5; - SWS_CS_SMPTE170M = 5; - SWS_CS_SMPTE240M = 7; - SWS_CS_DEFAULT = 5; - -{$IF LIBSWSCALE_VERSION >= 000010000} // 0.10.0 -(** - * Returns a pointer to yuv<->rgb coefficients for the given colorspace - * suitable for sws_setColorspaceDetails(). - * - * @param colorspace One of the SWS_CS_* macros. If invalid, - * SWS_CS_DEFAULT is used. - *) -function sws_getCoefficients(colorspace: cint): Pcint; - cdecl; external sw__scale; -{$IFEND} - -type - - // when used for filters they must have an odd number of elements - // coeffs cannot be shared between vectors - PSwsVector = ^TSwsVector; - TSwsVector = record - coeff: PCdouble; // pointer to the list of coefficients - length: cint; // number of coefficients in the vector - end; - - // vectors can be shared - PSwsFilter = ^TSwsFilter; - TSwsFilter = record - lumH: PSwsVector; - lumV: PSwsVector; - chrH: PSwsVector; - chrV: PSwsVector; - end; - - PSwsContext = ^TSwsContext; - TSwsContext = record - {internal structure} - end; - -{$IF LIBSWSCALE_VERSION >= 000008000} // 0.8.0 -(** - * Returns a positive value if pix_fmt is a supported input format, 0 - * otherwise. - *) -function sws_isSupportedInput(pix_fmt: TAVPixelFormat): cint; - cdecl; external sw__scale; - -(** - * Returns a positive value if pix_fmt is a supported output format, 0 - * otherwise. - *) -function sws_isSupportedOutput(pix_fmt: TAVPixelFormat): cint; - cdecl; external sw__scale; -{$IFEND} - -(** - * Frees the swscaler context swsContext. - * If swsContext is NULL, then does nothing. - *) -procedure sws_freeContext(swsContext: PSwsContext); - cdecl; external sw__scale; - -(** - * Allocates and returns a SwsContext. You need it to perform - * scaling/conversion operations using sws_scale(). - * - * @param srcW the width of the source image - * @param srcH the height of the source image - * @param srcFormat the source image format - * @param dstW the width of the destination image - * @param dstH the height of the destination image - * @param dstFormat the destination image format - * @param flags specify which algorithm and options to use for rescaling - * @return a pointer to an allocated context, or NULL in case of error - *) -function sws_getContext(srcW: cint; srcH: cint; srcFormat: TAVPixelFormat; - dstW: cint; dstH: cint; dstFormat: TAVPixelFormat; - flags: cint; srcFilter: PSwsFilter; - dstFilter: PSwsFilter; param: PCdouble): PSwsContext; - cdecl; external sw__scale; - -(** - * Scales the image slice in srcSlice and puts the resulting scaled - * slice in the image in dst. A slice is a sequence of consecutive - * rows in an image. - * - * Slices have to be provided in sequential order, either in - * top-bottom or bottom-top order. If slices are provided in - * non-sequential order the behavior of the function is undefined. - * - * @param context the scaling context previously created with - * sws_getContext() - * @param srcSlice the array containing the pointers to the planes of - * the source slice - * @param srcStride the array containing the strides for each plane of - * the source image - * @param srcSliceY the position in the source image of the slice to - * process, that is the number (counted starting from - * zero) in the image of the first row of the slice - * @param srcSliceH the height of the source slice, that is the number - * of rows in the slice - * @param dst the array containing the pointers to the planes of - * the destination image - * @param dstStride the array containing the strides for each plane of - * the destination image - * @return the height of the output slice - *) -function sws_scale(context: PSwsContext; {const} srcSlice: PPCuint8Array; {const} srcStride: PCintArray; - srcSliceY: cint; srcSliceH: cint; {const} dst: PPCuint8Array; {const} dstStride: PCintArray): cint; - cdecl; external sw__scale; - -{$IF LIBSWSCALE_VERSION_MAJOR < 1} -// deprecated. Use sws_scale() instead. -function sws_scale_ordered(context: PSwsContext; {const} src: PPCuint8Array; - srcStride: PCintArray; srcSliceY: cint; srcSliceH: cint; - dst: PPCuint8Array; dstStride: PCintArray): cint; - cdecl; external sw__scale; deprecated; -{$IFEND} - -(** - * @param inv_table the yuv2rgb coefficients, normally ff_yuv2rgb_coeffs[x] - * @param fullRange if 1 then the luma range is 0..255 if 0 it is 16..235 - * @return -1 if not supported - *) -function sws_setColorspaceDetails(c: PSwsContext; inv_table: PQuadCintArray; - srcRange: cint; table: PQuadCintArray; dstRange: cint; - brightness: cint; contrast: cint; saturation: cint): cint; - cdecl; external sw__scale; - -(** - * @return -1 if not supported - *) -function sws_getColorspaceDetails(c: PSwsContext; var inv_table: PQuadCintArray; - var srcRange: cint; var table: PQuadCintArray; var dstRange: cint; - var brightness: cint; var contrast: cint; var saturation: cint): cint; - cdecl; external sw__scale; - -(** - * Returns a normalized Gaussian curve used to filter stuff - * quality=3 is high quality, lower is lower quality. - *) -function sws_getGaussianVec(variance: cdouble; quality: cdouble): PSwsVector; - cdecl; external sw__scale; - -(** - * Allocates and returns a vector with length coefficients, all - * with the same value c. - *) -function sws_getConstVec(c: cdouble; length: cint): PSwsVector; - cdecl; external sw__scale; - -(** - * Allocates and returns a vector with just one coefficient, with - * value 1.0. - *) -function sws_getIdentityVec: PSwsVector; - cdecl; external sw__scale; - -(** - * Scales all the coefficients of a by the scalar value. - *) -procedure sws_scaleVec(a: PSwsVector; scalar: cdouble); - cdecl; external sw__scale; - -(** - * Scales all the coefficients of a so that their sum equals height. - *) -procedure sws_normalizeVec(a: PSwsVector; height: cdouble); - cdecl; external sw__scale; - -procedure sws_convVec(a: PSwsVector; b: PSwsVector); - cdecl; external sw__scale; - -procedure sws_addVec(a: PSwsVector; b: PSwsVector); - cdecl; external sw__scale; - -procedure sws_subVec(a: PSwsVector; b: PSwsVector); - cdecl; external sw__scale; - -procedure sws_shiftVec(a: PSwsVector; shift: cint); - cdecl; external sw__scale; - -(** - * Allocates and returns a clone of the vector a, that is a vector - * with the same coefficients as a. - *) -function sws_cloneVec(a: PSwsVector): PSwsVector; - cdecl; external sw__scale; - -{$IF LIBSWSCALE_VERSION_MAJOR < 1} -// deprecated Use sws_printVec2() instead. - -procedure sws_printVec(a: PSwsVector); - cdecl; external sw__scale; deprecated; -{$IFEND} - -{$IF LIBSWSCALE_VERSION >= 000007000} // >= 0.7.0 -(** - * Prints with av_log() a textual representation of the vector a - * if log_level <= av_log_level. - *) -procedure sws_printVec2(a: PSwsVector; - log_ctx: PAVClass; // PAVClass is declared in avcodec.pas - log_level: cint); - cdecl; external sw__scale; -{$IFEND} - -procedure sws_freeVec(a: PSwsVector); - cdecl; external sw__scale; - -function sws_getDefaultFilter(lumaGBlur: cfloat; chromaGBlur: cfloat; - lumaSharpen: cfloat; chromaSharpen: cfloat; - chromaHShift: cfloat; chromaVShift: cfloat; - verbose: cint): PSwsFilter; - cdecl; external sw__scale; - -procedure sws_freeFilter(filter: PSwsFilter); - cdecl; external sw__scale; - -(** - * Checks if context can be reused, otherwise reallocates a new - * one. - * - * If context is NULL, just calls sws_getContext() to get a new - * context. Otherwise, checks if the parameters are the ones already - * saved in context. If that is the case, returns the current - * context. Otherwise, frees context and gets a new context with - * the new parameters. - * - * Be warned that srcFilter and dstFilter are not checked, they - * are assumed to remain the same. - *) -function sws_getCachedContext(context: PSwsContext; - srcW: cint; srcH: cint; srcFormat: TAVPixelFormat; - dstW: cint; dstH: cint; dstFormat: TAVPixelFormat; - flags: cint; srcFilter: PSwsFilter; - dstFilter: PSwsFilter; param: PCdouble): PSwsContext; - cdecl; external sw__scale; - -{$IF LIBSWSCALE_VERSION >= 000011000} // >= 0.11.0 -(** - * Converts an 8bit paletted frame into a frame with a color depth of 32-bits. - * - * The output frame will have the same packed format as the palette. - * - * @param src source frame buffer - * @param dst destination frame buffer - * @param num_pixels number of pixels to convert - * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src - *) -procedure sws_convertPalette8ToPacked32({const} src: PPCuint8Array; - dst: PPCuint8Array; - num_pixels: clong; - {const} palette: PPCuint8Array); - cdecl; external sw__scale; - -(** - * Converts an 8bit paletted frame into a frame with a color depth of 24 bits. - * - * With the palette format "ABCD", the destination frame ends up with the format "ABC". - * - * @param src source frame buffer - * @param dst destination frame buffer - * @param num_pixels number of pixels to convert - * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src - *) -procedure sws_convertPalette8ToPacked24({const} src: PPCuint8Array; - dst: PPCuint8Array; - num_pixels: clong; - {const} palette: PPCuint8Array); - cdecl; external sw__scale; -{$IFEND} - -implementation - -end. diff --git a/mediaplugin/src/media/UAudioDecoder_FFmpeg.pas b/mediaplugin/src/media/UAudioDecoder_FFmpeg.pas index bef162bd..2865a7d8 100644 --- a/mediaplugin/src/media/UAudioDecoder_FFmpeg.pas +++ b/mediaplugin/src/media/UAudioDecoder_FFmpeg.pas @@ -207,7 +207,7 @@ end; function TAudioDecoder_FFmpeg.GetName: String; begin - Result := 'Plugin:' + fPluginInfo.name; + Result := 'Plugin:AudioDecoder:' + fPluginInfo.name; end; function TAudioDecoder_FFmpeg.InitializeDecoder: boolean; diff --git a/mediaplugin/src/media/UMediaCore_FFmpeg.pas b/mediaplugin/src/media/UMediaCore_FFmpeg.pas deleted file mode 100644 index 2f589442..00000000 --- a/mediaplugin/src/media/UMediaCore_FFmpeg.pas +++ /dev/null @@ -1,343 +0,0 @@ -{* UltraStar Deluxe - Karaoke Game - * - * UltraStar Deluxe is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - *} - -unit UMediaCore_FFmpeg; - -interface - -{$IFDEF FPC} - {$MODE Delphi} -{$ENDIF} - -{$I switches.inc} - -uses - Classes, - ctypes, - sdl, - avcodec, - avformat, - avutil, - avio, - swscale, - UMusic, - ULog, - UPath; - -const - STATUS_PACKET: PChar = 'STATUS_PACKET'; -const - PKT_STATUS_FLAG_EOF = 1; // signal end-of-file - PKT_STATUS_FLAG_FLUSH = 2; // request the decoder to flush its avcodec decode buffers - PKT_STATUS_FLAG_ERROR = 3; // signal an error state - PKT_STATUS_FLAG_EMPTY = 4; // request the decoder to output empty data (silence or black frames) - -type - TMediaCore_FFmpeg = class - private - AVCodecLock: PSDL_Mutex; - public - constructor Create(); - destructor Destroy(); override; - class function GetInstance(): TMediaCore_FFmpeg; - - function GetErrorString(ErrorNum: integer): string; - function FindStreamIDs(FormatCtx: PAVFormatContext; out FirstVideoStream, FirstAudioStream: integer ): boolean; - function FindAudioStreamIndex(FormatCtx: PAVFormatContext): integer; - function ConvertFFmpegToAudioFormat(FFmpegFormat: TSampleFormat; out Format: TAudioSampleFormat): boolean; - procedure LockAVCodec(); - procedure UnlockAVCodec(); - end; - -implementation - -uses - SysUtils, - UConfig; - -function FFmpegStreamOpen(h: PURLContext; filename: PChar; flags: cint): cint; cdecl; forward; -function FFmpegStreamRead(h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; forward; -function FFmpegStreamWrite(h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; forward; -function FFmpegStreamSeek(h: PURLContext; pos: int64; whence: cint): int64; cdecl; forward; -function FFmpegStreamClose(h: PURLContext): cint; cdecl; forward; - -const - UTF8FileProtocol: TURLProtocol = ( - name: 'ufile'; - url_open: FFmpegStreamOpen; - url_read: FFmpegStreamRead; - url_write: FFmpegStreamWrite; - url_seek: FFmpegStreamSeek; - url_close: FFmpegStreamClose; - ); - -var - Instance: TMediaCore_FFmpeg; - -procedure CheckVersions(); -begin -end; - -constructor TMediaCore_FFmpeg.Create(); -begin - inherited; - - CheckVersions(); - av_register_protocol(@UTF8FileProtocol); - AVCodecLock := SDL_CreateMutex(); -end; - -destructor TMediaCore_FFmpeg.Destroy(); -begin - SDL_DestroyMutex(AVCodecLock); - inherited; -end; - -class function TMediaCore_FFmpeg.GetInstance(): TMediaCore_FFmpeg; -begin - if (not Assigned(Instance)) then - Instance := TMediaCore_FFmpeg.Create(); - Result := Instance; -end; - -procedure TMediaCore_FFmpeg.LockAVCodec(); -begin - SDL_mutexP(AVCodecLock); -end; - -procedure TMediaCore_FFmpeg.UnlockAVCodec(); -begin - SDL_mutexV(AVCodecLock); -end; - -function TMediaCore_FFmpeg.GetErrorString(ErrorNum: integer): string; -begin - case ErrorNum of - AVERROR_IO: Result := 'AVERROR_IO'; - AVERROR_NUMEXPECTED: Result := 'AVERROR_NUMEXPECTED'; - AVERROR_INVALIDDATA: Result := 'AVERROR_INVALIDDATA'; - AVERROR_NOMEM: Result := 'AVERROR_NOMEM'; - AVERROR_NOFMT: Result := 'AVERROR_NOFMT'; - AVERROR_NOTSUPP: Result := 'AVERROR_NOTSUPP'; - AVERROR_NOENT: Result := 'AVERROR_NOENT'; - AVERROR_PATCHWELCOME: Result := 'AVERROR_PATCHWELCOME'; - else Result := 'AVERROR_#'+inttostr(ErrorNum); - end; -end; - -{ - @param(FormatCtx is a PAVFormatContext returned from av_open_input_file ) - @param(FirstVideoStream is an OUT value of type integer, this is the index of the video stream) - @param(FirstAudioStream is an OUT value of type integer, this is the index of the audio stream) - @returns(@true on success, @false otherwise) -} -function TMediaCore_FFmpeg.FindStreamIDs(FormatCtx: PAVFormatContext; out FirstVideoStream, FirstAudioStream: integer): boolean; -var - i: integer; - Stream: PAVStream; -begin - // find the first video stream - FirstAudioStream := -1; - FirstVideoStream := -1; - - for i := 0 to FormatCtx.nb_streams-1 do - begin - Stream := FormatCtx.streams[i]; - -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 - if (Stream.codec.codec_type = CODEC_TYPE_VIDEO) and - (FirstVideoStream < 0) then - begin - FirstVideoStream := i; - end; - - if (Stream.codec.codec_type = CODEC_TYPE_AUDIO) and - (FirstAudioStream < 0) then - begin - FirstAudioStream := i; - end; - end; -{$ELSE} - if (Stream.codec.codec_type = AVMEDIA_TYPE_VIDEO) and - (FirstVideoStream < 0) then - begin - FirstVideoStream := i; - end; - - if (Stream.codec.codec_type = AVMEDIA_TYPE_AUDIO) and - (FirstAudioStream < 0) then - begin - FirstAudioStream := i; - end; - end; -{$IFEND} - - // return true if either an audio- or video-stream was found - Result := (FirstAudioStream > -1) or - (FirstVideoStream > -1) ; -end; - -function TMediaCore_FFmpeg.FindAudioStreamIndex(FormatCtx: PAVFormatContext): integer; -var - i: integer; - StreamIndex: integer; - Stream: PAVStream; -begin - // find the first audio stream - StreamIndex := -1; - - for i := 0 to FormatCtx^.nb_streams-1 do - begin - Stream := FormatCtx^.streams[i]; - -{$IF LIBAVCODEC_VERSION < 52064000} // < 52.64.0 - if (Stream.codec^.codec_type = CODEC_TYPE_AUDIO) then -{$ELSE} - if (Stream.codec^.codec_type = AVMEDIA_TYPE_AUDIO) then -{$IFEND} - begin - StreamIndex := i; - Break; - end; - end; - - Result := StreamIndex; -end; - -function TMediaCore_FFmpeg.ConvertFFmpegToAudioFormat(FFmpegFormat: TSampleFormat; out Format: TAudioSampleFormat): boolean; -begin - case FFmpegFormat of - SAMPLE_FMT_U8: Format := asfU8; - SAMPLE_FMT_S16: Format := asfS16; - SAMPLE_FMT_S32: Format := asfS32; - SAMPLE_FMT_FLT: Format := asfFloat; - SAMPLE_FMT_DBL: Format := asfDouble; - else begin - Result := false; - Exit; - end; - end; - Result := true; -end; - - -{** - * UTF-8 Filename wrapper based on: - * http://www.mail-archive.com/libav-user@mplayerhq.hu/msg02460.html - *} - -function FFmpegStreamOpen(h: PURLContext; filename: PChar; flags: cint): cint; cdecl; -var - Stream: TStream; - Mode: word; - ProtPrefix: string; - FilePath: IPath; -begin - // check for protocol prefix ('ufile:') and strip it - ProtPrefix := Format('%s:', [UTF8FileProtocol.name]); - if (StrLComp(filename, PChar(ProtPrefix), Length(ProtPrefix)) = 0) then - begin - Inc(filename, Length(ProtPrefix)); - end; - - FilePath := Path(filename); - - if ((flags and URL_RDWR) <> 0) then - Mode := fmCreate - else if ((flags and URL_WRONLY) <> 0) then - Mode := fmCreate // TODO: fmCreate is Read+Write -> reopen with fmOpenWrite - else - Mode := fmOpenRead or fmShareDenyWrite; - - Result := 0; - - try - Stream := TBinaryFileStream.Create(FilePath, Mode); - h.priv_data := Stream; - except - Result := AVERROR_NOENT; - end; -end; - -function FFmpegStreamRead(h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; -var - Stream: TStream; -begin - Stream := TStream(h.priv_data); - if (Stream = nil) then - raise EInvalidContainer.Create('FFmpegStreamRead on nil'); - try - Result := Stream.Read(buf[0], size); - except - Result := -1; - end; -end; - -function FFmpegStreamWrite(h: PURLContext; buf: PByteArray; size: cint): cint; cdecl; -var - Stream: TStream; -begin - Stream := TStream(h.priv_data); - if (Stream = nil) then - raise EInvalidContainer.Create('FFmpegStreamWrite on nil'); - try - Result := Stream.Write(buf[0], size); - except - Result := -1; - end; -end; - -function FFmpegStreamSeek(h: PURLContext; pos: int64; whence: cint): int64; cdecl; -var - Stream : TStream; - Origin : TSeekOrigin; -begin - Stream := TStream(h.priv_data); - if (Stream = nil) then - raise EInvalidContainer.Create('FFmpegStreamSeek on nil'); - case whence of - 0 {SEEK_SET}: Origin := soBeginning; - 1 {SEEK_CUR}: Origin := soCurrent; - 2 {SEEK_END}: Origin := soEnd; - AVSEEK_SIZE: begin - Result := Stream.Size; - Exit; - end - else - Origin := soBeginning; - end; - Result := Stream.Seek(pos, Origin); -end; - -function FFmpegStreamClose(h: PURLContext): cint; cdecl; -var - Stream : TStream; -begin - Stream := TStream(h.priv_data); - Stream.Free; - Result := 0; -end; - -end. diff --git a/mediaplugin/src/media/UMediaPlugin.pas b/mediaplugin/src/media/UMediaPlugin.pas index c676619c..2eb0772e 100644 --- a/mediaplugin/src/media/UMediaPlugin.pas +++ b/mediaplugin/src/media/UMediaPlugin.pas @@ -80,6 +80,7 @@ type PAudioDecodeStream = Pointer; PAudioConvertStream = Pointer; + PVideoDecodeStream = Pointer; PCAudioFormatInfo = ^TCAudioFormatInfo; TCAudioFormatInfo = record @@ -112,6 +113,20 @@ type getRatio: function(stream: PAudioConvertStream): double; cdecl; end; + PVideoDecoderInfo = ^TVideoDecoderInfo; + TVideoDecoderInfo = record + open: function(filename: PAnsiChar): PVideoDecodeStream; cdecl; + close: procedure(stream: PVideoDecodeStream); cdecl; + setLoop: procedure(stream: PVideoDecodeStream; enable: cbool); cdecl; + getLoop: function(stream: PVideoDecodeStream): cbool; cdecl; + setPosition: procedure(stream: PVideoDecodeStream; time: double); cdecl; + getPosition: function(stream: PVideoDecodeStream): double; cdecl; + getFrameWidth: function(stream: PVideoDecodeStream): cint; cdecl; + getFrameHeight: function(stream: PVideoDecodeStream): cint; cdecl; + getFrameAspect: function(stream: PVideoDecodeStream): double; cdecl; + getFrame: function (stream: PVideoDecodeStream; time: clongdouble): PCuint8; cdecl; + end; + PMediaPluginInfo = ^TMediaPluginInfo; TMediaPluginInfo = record version: cint; @@ -120,6 +135,7 @@ type finalize: function(): cbool; cdecl; audioDecoder: PAudioDecoderInfo; audioConverter: PAudioConverterInfo; + videoDecoder: PVideoDecoderInfo; end; Plugin_registerFunc = function(core: PMediaPluginCore): PMediaPluginInfo; cdecl; diff --git a/mediaplugin/src/media/UVideoDecoder_FFmpeg.pas b/mediaplugin/src/media/UVideoDecoder_FFmpeg.pas index b781b0d2..51916276 100644 --- a/mediaplugin/src/media/UVideoDecoder_FFmpeg.pas +++ b/mediaplugin/src/media/UVideoDecoder_FFmpeg.pas @@ -25,14 +25,6 @@ unit UVideoDecoder_FFmpeg; -{* - * based on 'An ffmpeg and SDL Tutorial' (http://www.dranger.com/ffmpeg/) - *} - -// uncomment if you want to see the debug stuff -{.$define DebugDisplay} -{.$define DebugFrames} - interface {$IFDEF FPC} @@ -41,80 +33,24 @@ interface {$I switches.inc} -// use BGR-format for accelerated colorspace conversion with swscale -{$IFDEF UseSWScale} - {$DEFINE PIXEL_FMT_BGR} -{$ENDIF} - implementation uses SysUtils, Math, - avcodec, - avformat, - avutil, - avio, - rational, - {$IFDEF UseSWScale} - swscale, - {$ENDIF} - UMediaCore_FFmpeg, + UMediaPlugin, UCommon, UConfig, ULog, UMusic, UPath; -{$DEFINE PIXEL_FMT_BGR} - -const -{$IFDEF PIXEL_FMT_BGR} - PIXEL_FMT_FFMPEG = PIX_FMT_BGR24; - PIXEL_FMT_SIZE = 3; - - // looks strange on linux: - //PIXEL_FMT_FFMPEG = PIX_FMT_BGR32; - //PIXEL_FMT_SIZE = 4; -{$ELSE} - // looks strange on linux: - PIXEL_FMT_FFMPEG = PIX_FMT_RGB24; - PIXEL_FMT_SIZE = 3; -{$ENDIF} - type TVideoDecodeStream_FFmpeg = class (TVideoDecodeStream) private - fOpened: boolean; //**< stream successfully opened - fEOF: boolean; //**< end-of-file state - - fLoop: boolean; //**< looping enabled - - fStream: PAVStream; - fStreamIndex : integer; - fFormatContext: PAVFormatContext; - fCodecContext: PAVCodecContext; - fCodec: PAVCodec; - - fAVFrame: PAVFrame; - fAVFrameRGB: PAVFrame; - - fFrameBuffer: PByte; //**< stores a FFmpeg video frame - fFrameTexValid: boolean; //**< if true, fFrameTex contains the current frame - - {$IFDEF UseSWScale} - fSwScaleContext: PSwsContext; - {$ENDIF} - - fAspect: real; //**< width/height ratio - - fFrameDuration: extended; //**< duration of a video frame in seconds (= 1/fps) - fFrameTime: extended; //**< video time position (absolute) - fLoopTime: extended; //**< start time of the current loop - - procedure Reset(); - function DecodeFrame(): boolean; - procedure SynchronizeTime(Frame: PAVFrame; var pts: double); + private + fFilename: IPath; + fStream: PVideoDecodeStream; public constructor Create; @@ -138,9 +74,10 @@ type TVideoDecoder_FFmpeg = class( TInterfacedObject, IVideoDecoder ) private - fInitialized: boolean; - + fPluginInfo: PMediaPluginInfo; public + constructor Create(); + function GetName: String; function InitializeDecoder(): boolean; @@ -150,60 +87,33 @@ type end; var - FFmpegCore: TMediaCore_FFmpeg; - - -// These are called whenever we allocate a frame buffer. -// We use this to store the global_pts in a frame at the time it is allocated. -function PtsGetBuffer(CodecCtx: PAVCodecContext; Frame: PAVFrame): integer; cdecl; -var - pts: Pint64; - VideoPktPts: Pint64; -begin - Result := avcodec_default_get_buffer(CodecCtx, Frame); - VideoPktPts := CodecCtx^.opaque; - if (VideoPktPts <> nil) then - begin - // Note: we must copy the pts instead of passing a pointer, because the packet - // (and with it the pts) might change before a frame is returned by av_decode_video. - pts := av_malloc(sizeof(int64)); - pts^ := VideoPktPts^; - Frame^.opaque := pts; - end; -end; - -procedure PtsReleaseBuffer(CodecCtx: PAVCodecContext; Frame: PAVFrame); cdecl; -begin - if (Frame <> nil) then - av_freep(@Frame^.opaque); - avcodec_default_release_buffer(CodecCtx, Frame); -end; - + VideoDecoderInfo: PVideoDecoderInfo; {*------------------------------------------------------------------------------ * TVideoPlayback_ffmpeg *------------------------------------------------------------------------------} +constructor TVideoDecoder_FFmpeg.Create(); +begin + inherited Create(); + fPluginInfo := Plugin_register(MediaPluginCore); +end; + function TVideoDecoder_FFmpeg.GetName: String; begin - result := 'FFmpeg_VideoDecoder'; + Result := 'Plugin:VideoDecoder:' + fPluginInfo.name; end; function TVideoDecoder_FFmpeg.InitializeDecoder(): boolean; begin + fPluginInfo.initialize(); + VideoDecoderInfo := fPluginInfo.videoDecoder; Result := true; - - if (fInitialized) then - Exit; - fInitialized := true; - - FFmpegCore := TMediaCore_FFmpeg.GetInstance(); - - av_register_all(); end; function TVideoDecoder_FFmpeg.FinalizeDecoder(): boolean; begin + fPluginInfo.finalize(); Result := true; end; @@ -228,569 +138,79 @@ end; constructor TVideoDecodeStream_FFmpeg.Create; begin - Reset(); + inherited Create(); + fFilename := PATH_NONE; end; destructor TVideoDecodeStream_FFmpeg.Destroy; begin Close(); + inherited; end; function TVideoDecodeStream_FFmpeg.Open(const FileName: IPath): boolean; -var - errnum: Integer; - AudioStreamIndex: integer; begin Result := false; - Reset(); - - // use custom 'ufile' protocol for UTF-8 support - errnum := av_open_input_file(fFormatContext, PAnsiChar('ufile:'+FileName.ToUTF8), nil, 0, nil); - if (errnum <> 0) then - begin - Log.LogError('Failed to open file "'+ FileName.ToNative +'" ('+FFmpegCore.GetErrorString(errnum)+')'); - Exit; - end; - - // update video info - if (av_find_stream_info(fFormatContext) < 0) then - begin - Log.LogError('No stream info found', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; - Log.LogInfo('VideoStreamIndex : ' + inttostr(fStreamIndex), 'TVideoPlayback_ffmpeg.Open'); - - // find video stream - FFmpegCore.FindStreamIDs(fFormatContext, fStreamIndex, AudioStreamIndex); - if (fStreamIndex < 0) then - begin - Log.LogError('No video stream found', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; - - fStream := fFormatContext^.streams[fStreamIndex]; - fCodecContext := fStream^.codec; - fCodec := avcodec_find_decoder(fCodecContext^.codec_id); - if (fCodec = nil) then - begin - Log.LogError('No matching codec found', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; - - // set debug options - fCodecContext^.debug_mv := 0; - fCodecContext^.debug := 0; - - // detect bug-workarounds automatically - fCodecContext^.workaround_bugs := FF_BUG_AUTODETECT; - // error resilience strategy (careful/compliant/agressive/very_aggressive) - //fCodecContext^.error_resilience := FF_ER_CAREFUL; //FF_ER_COMPLIANT; - // allow non spec compliant speedup tricks. - //fCodecContext^.flags2 := fCodecContext^.flags2 or CODEC_FLAG2_FAST; - - // Note: avcodec_open() and avcodec_close() are not thread-safe and will - // fail if called concurrently by different threads. - FFmpegCore.LockAVCodec(); - try - errnum := avcodec_open(fCodecContext, fCodec); - finally - FFmpegCore.UnlockAVCodec(); - end; - if (errnum < 0) then - begin - Log.LogError('No matching codec found', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; - - // register custom callbacks for pts-determination - fCodecContext^.get_buffer := PtsGetBuffer; - fCodecContext^.release_buffer := PtsReleaseBuffer; - - {$ifdef DebugDisplay} - DebugWriteln('Found a matching Codec: '+ fCodecContext^.Codec.Name + sLineBreak + - sLineBreak + - ' Width = '+inttostr(fCodecContext^.width) + - ', Height='+inttostr(fCodecContext^.height) + sLineBreak + - ' Aspect : '+inttostr(fCodecContext^.sample_aspect_ratio.num) + '/' + - inttostr(fCodecContext^.sample_aspect_ratio.den) + sLineBreak + - ' Framerate : '+inttostr(fCodecContext^.time_base.num) + '/' + - inttostr(fCodecContext^.time_base.den)); - {$endif} - - // allocate space for decoded frame and rgb frame - fAVFrame := avcodec_alloc_frame(); - fAVFrameRGB := avcodec_alloc_frame(); - fFrameBuffer := av_malloc(avpicture_get_size(PIXEL_FMT_FFMPEG, - fCodecContext^.width, fCodecContext^.height)); - - if ((fAVFrame = nil) or (fAVFrameRGB = nil) or (fFrameBuffer = nil)) then - begin - Log.LogError('Failed to allocate buffers', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; + Close(); - // TODO: pad data for OpenGL to GL_UNPACK_ALIGNMENT - // (otherwise video will be distorted if width/height is not a multiple of the alignment) - errnum := avpicture_fill(PAVPicture(fAVFrameRGB), fFrameBuffer, PIXEL_FMT_FFMPEG, - fCodecContext^.width, fCodecContext^.height); - if (errnum < 0) then - begin - Log.LogError('avpicture_fill failed: ' + FFmpegCore.GetErrorString(errnum), 'TVideoPlayback_ffmpeg.Open'); - Close(); + fStream := VideoDecoderInfo.open(PChar(Filename.ToUTF8())); + if (fStream = nil) then Exit; - end; - // calculate some information for video display - fAspect := av_q2d(fCodecContext^.sample_aspect_ratio); - if (fAspect = 0) then - fAspect := fCodecContext^.width / - fCodecContext^.height - else - fAspect := fAspect * fCodecContext^.width / - fCodecContext^.height; + fFilename := Filename; - fFrameDuration := 1/av_q2d(fStream^.r_frame_rate); - - // hack to get reasonable framerate (for divx and others) - if (fFrameDuration < 0.02) then // 0.02 <-> 50 fps - begin - fFrameDuration := av_q2d(fStream^.r_frame_rate); - while (fFrameDuration > 50) do - fFrameDuration := fFrameDuration/10; - fFrameDuration := 1/fFrameDuration; - end; - - Log.LogInfo('Framerate: '+inttostr(floor(1/fFrameDuration))+'fps', 'TVideoPlayback_ffmpeg.Open'); - - {$IFDEF UseSWScale} - // if available get a SWScale-context -> faster than the deprecated img_convert(). - // SWScale has accelerated support for PIX_FMT_RGB32/PIX_FMT_BGR24/PIX_FMT_BGR565/PIX_FMT_BGR555. - // Note: PIX_FMT_RGB32 is a BGR- and not an RGB-format (maybe a bug)!!! - // The BGR565-formats (GL_UNSIGNED_SHORT_5_6_5) is way too slow because of its - // bad OpenGL support. The BGR formats have MMX(2) implementations but no speed-up - // could be observed in comparison to the RGB versions. - fSwScaleContext := sws_getContext( - fCodecContext^.width, fCodecContext^.height, - fCodecContext^.pix_fmt, - fCodecContext^.width, fCodecContext^.height, - PIXEL_FMT_FFMPEG, - SWS_FAST_BILINEAR, nil, nil, nil); - if (fSwScaleContext = nil) then - begin - Log.LogError('Failed to get swscale context', 'TVideoPlayback_ffmpeg.Open'); - Close(); - Exit; - end; - {$ENDIF} - - fOpened := true; Result := true; end; -procedure TVideoDecodeStream_FFmpeg.Reset(); -begin - // close previously opened video - Close(); - - fOpened := False; - fFrameDuration := 0; - fFrameTime := 0; - fStream := nil; - fStreamIndex := -1; - fFrameTexValid := false; - - fEOF := false; - - fLoop := false; - fLoopTime := 0; -end; - procedure TVideoDecodeStream_FFmpeg.Close; begin - if (fFrameBuffer <> nil) then - av_free(fFrameBuffer); - if (fAVFrameRGB <> nil) then - av_free(fAVFrameRGB); - if (fAVFrame <> nil) then - av_free(fAVFrame); - - fAVFrame := nil; - fAVFrameRGB := nil; - fFrameBuffer := nil; - - if (fCodecContext <> nil) then - begin - // avcodec_close() is not thread-safe - FFmpegCore.LockAVCodec(); - try - avcodec_close(fCodecContext); - finally - FFmpegCore.UnlockAVCodec(); - end; - end; - - if (fFormatContext <> nil) then - av_close_input_file(fFormatContext); - - fCodecContext := nil; - fFormatContext := nil; - - fOpened := False; -end; - -procedure TVideoDecodeStream_FFmpeg.SynchronizeTime(Frame: PAVFrame; var pts: double); -var - FrameDelay: double; -begin - if (pts <> 0) then + Self.fFilename := PATH_NONE; + if (fStream <> nil) then begin - // if we have pts, set video clock to it - fFrameTime := pts; - end else - begin - // if we aren't given a pts, set it to the clock - pts := fFrameTime; + VideoDecoderInfo.close(fStream); + fStream := nil; end; - // update the video clock - FrameDelay := av_q2d(fCodecContext^.time_base); - // if we are repeating a frame, adjust clock accordingly - FrameDelay := FrameDelay + Frame^.repeat_pict * (FrameDelay * 0.5); - fFrameTime := fFrameTime + FrameDelay; -end; - -{** - * Decode a new frame from the video stream. - * The decoded frame is stored in fAVFrame. fFrameTime is updated to the new frame's - * time. - * @param pts will be updated to the presentation time of the decoded frame. - * returns true if a frame could be decoded. False if an error or EOF occured. - *} -function TVideoDecodeStream_FFmpeg.DecodeFrame(): boolean; -var - FrameFinished: Integer; - VideoPktPts: int64; - pbIOCtx: PByteIOContext; - errnum: integer; - AVPacket: TAVPacket; - pts: double; -begin - Result := false; - FrameFinished := 0; - - if fEOF then - Exit; - - // read packets until we have a finished frame (or there are no more packets) - while (FrameFinished = 0) do - begin - errnum := av_read_frame(fFormatContext, AVPacket); - if (errnum < 0) then - begin - // failed to read a frame, check reason - - {$IF (LIBAVFORMAT_VERSION_MAJOR >= 52)} - pbIOCtx := fFormatContext^.pb; - {$ELSE} - pbIOCtx := @fFormatContext^.pb; - {$IFEND} - - // check for end-of-file (EOF is not an error) - if (url_feof(pbIOCtx) <> 0) then - begin - fEOF := true; - Exit; - end; - - // check for errors - if (url_ferror(pbIOCtx) <> 0) then - begin - Log.LogError('Video decoding file error', 'TVideoPlayback_FFmpeg.DecodeFrame'); - Exit; - end; - - // 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 - begin - fEOF := true; - Exit; - end; - - // error occured, log and exit - Log.LogError('Video decoding error', 'TVideoPlayback_FFmpeg.DecodeFrame'); - Exit; - end; - - // if we got a packet from the video stream, then decode it - if (AVPacket.stream_index = fStreamIndex) then - begin - // save pts to be stored in pFrame in first call of PtsGetBuffer() - VideoPktPts := AVPacket.pts; - fCodecContext^.opaque := @VideoPktPts; - - // decode packet - avcodec_decode_video(fCodecContext, fAVFrame, - frameFinished, AVPacket.data, AVPacket.size); - - // reset opaque data - fCodecContext^.opaque := nil; - - // update pts - if (AVPacket.dts <> AV_NOPTS_VALUE) then - begin - pts := AVPacket.dts; - end - else if ((fAVFrame^.opaque <> nil) and - (Pint64(fAVFrame^.opaque)^ <> AV_NOPTS_VALUE)) then - begin - pts := Pint64(fAVFrame^.opaque)^; - end - else - begin - pts := 0; - end; - - if fStream^.start_time <> AV_NOPTS_VALUE then - pts := pts - fStream^.start_time; - - pts := pts * av_q2d(fStream^.time_base); - - // synchronize time on each complete frame - if (frameFinished <> 0) then - SynchronizeTime(fAVFrame, pts); - end; - - // free the packet from av_read_frame - av_free_packet( @AVPacket ); - end; - - Result := true; end; function TVideoDecodeStream_FFmpeg.GetFrame(Time: Extended): PByteArray; -var - errnum: Integer; - CurrentTime: Extended; - TimeDiff: Extended; - DropFrameCount: Integer; - i: Integer; - Success: boolean; -const - SKIP_FRAME_DIFF = 0.010; // start skipping if we are >= 10ms too late begin - Result := nil; - - if not fOpened then - Exit; - - {* - * Synchronization - begin - *} - - // requested stream position (relative to the last loop's start) - if (fLoop) then - CurrentTime := Time - fLoopTime - else - CurrentTime := Time; - - // check if current texture still contains the active frame - if (fFrameTexValid) then - begin - // time since the last frame was returned - TimeDiff := CurrentTime - fFrameTime; - - {$IFDEF DebugDisplay} - DebugWriteln('Time: '+inttostr(floor(Time*1000)) + sLineBreak + - 'VideoTime: '+inttostr(floor(fFrameTime*1000)) + sLineBreak + - 'TimeBase: '+inttostr(floor(fFrameDuration*1000)) + sLineBreak + - 'TimeDiff: '+inttostr(floor(TimeDiff*1000))); - {$endif} - - // check if time has reached the next frame - if (TimeDiff < fFrameDuration) then - begin - {$ifdef DebugFrames} - // frame delay debug display - GoldenRec.Spawn(200,15,1,16,0,-1,ColoredStar,$00ff00); - {$endif} - - {$IFDEF DebugDisplay} - DebugWriteln('not getting new frame' + sLineBreak + - 'Time: '+inttostr(floor(Time*1000)) + sLineBreak + - 'VideoTime: '+inttostr(floor(fFrameTime*1000)) + sLineBreak + - 'TimeBase: '+inttostr(floor(fFrameDuration*1000)) + sLineBreak + - 'TimeDiff: '+inttostr(floor(TimeDiff*1000))); - {$endif} - - // we do not need a new frame now - Exit; - end; - end; - - // fetch new frame (updates fFrameTime) - Success := DecodeFrame(); - TimeDiff := CurrentTime - fFrameTime; - - // check if we have to skip frames - // Either if we are one frame behind or if the skip threshold has been reached. - // Do not skip if the difference is less than fFrameDuration as there is no next frame. - // Note: We assume that fFrameDuration is the length of one frame. - if (TimeDiff >= Max(fFrameDuration, SKIP_FRAME_DIFF)) then - begin - {$IFDEF DebugFrames} - //frame drop debug display - GoldenRec.Spawn(200,55,1,16,0,-1,ColoredStar,$ff0000); - {$ENDIF} - {$IFDEF DebugDisplay} - DebugWriteln('skipping frames' + sLineBreak + - 'TimeBase: '+inttostr(floor(fFrameDuration*1000)) + sLineBreak + - 'TimeDiff: '+inttostr(floor(TimeDiff*1000))); - {$endif} - - // update video-time - DropFrameCount := Trunc(TimeDiff / fFrameDuration); - fFrameTime := fFrameTime + DropFrameCount*fFrameDuration; - - // skip frames - for i := 1 to DropFrameCount do - Success := DecodeFrame(); - end; - - // check if we got an EOF or error - if (not Success) then - begin - if fLoop then - begin - // we have to loop, so rewind - SetPosition(0); - // record the start-time of the current loop, so we can - // determine the position in the stream (fFrameTime-fLoopTime) later. - fLoopTime := Time; - end; - Exit; - end; - - {* - * Synchronization - end - *} - - // TODO: support for pan&scan - //if (fAVFrame.pan_scan <> nil) then - //begin - // Writeln(Format('PanScan: %d/%d', [fAVFrame.pan_scan.width, fAVFrame.pan_scan.height])); - //end; - - // otherwise we convert the pixeldata from YUV to RGB - {$IFDEF UseSWScale} - errnum := sws_scale(fSwScaleContext, @fAVFrame.data, @fAVFrame.linesize, - 0, fCodecContext^.Height, - @fAVFrameRGB.data, @fAVFrameRGB.linesize); - {$ELSE} - // img_convert from lib/ffmpeg/avcodec.pas is actually deprecated. - // If ./configure does not find SWScale then this gives the error - // that the identifier img_convert is not known or similar. - // I think this should be removed, but am not sure whether there should - // be some other replacement or a warning, Therefore, I leave it for now. - // April 2009, mischi - errnum := img_convert(PAVPicture(fAVFrameRGB), PIXEL_FMT_FFMPEG, - PAVPicture(fAVFrame), fCodecContext^.pix_fmt, - fCodecContext^.width, fCodecContext^.height); - {$ENDIF} - - if (errnum < 0) then - begin - Log.LogError('Image conversion failed', 'TVideoPlayback_ffmpeg.GetFrame'); - Exit; - end; - - if (not fFrameTexValid) then - fFrameTexValid := true; - - Result := PByteArray(fAVFrameRGB^.data[0]); + Result := PByteArray(VideoDecoderInfo.getFrame(fStream, Time)); end; procedure TVideoDecodeStream_FFmpeg.SetLoop(Enable: boolean); begin - fLoop := Enable; - fLoopTime := 0; + VideoDecoderInfo.setLoop(fStream, Enable); end; function TVideoDecodeStream_FFmpeg.GetLoop(): boolean; begin - Result := fLoop; + Result := VideoDecoderInfo.getLoop(fStream); end; -{** - * Sets the stream's position. - * The stream is set to the first keyframe with timestamp <= Time. - * Note that fFrameTime is set to Time no matter if the actual position seeked to is - * at Time or the time of a preceding keyframe. fFrameTime will be updated to the - * actual frame time when GetFrame() is called the next time. - * @param Time new position in seconds - *} procedure TVideoDecodeStream_FFmpeg.SetPosition(Time: real); -var - SeekFlags: integer; begin - if not fOpened then - Exit; - - if (Time < 0) then - Time := 0; - - // TODO: handle fLoop-times - //Time := Time mod VideoDuration; - - // Do not use the AVSEEK_FLAG_ANY here. It will seek to any frame, even - // non keyframes (P-/B-frames). It will produce corrupted video frames as - // FFmpeg does not use the information of the preceding I-frame. - // The picture might be gray or green until the next keyframe occurs. - // Instead seek the first keyframe smaller than the requested time - // (AVSEEK_FLAG_BACKWARD). As this can be some seconds earlier than the - // requested time, let the sync in GetFrame() do its job. - SeekFlags := AVSEEK_FLAG_BACKWARD; - - fFrameTime := Time; - fEOF := false; - fFrameTexValid := false; - - if (av_seek_frame(fFormatContext, - fStreamIndex, - Round(Time / av_q2d(fStream^.time_base)), - SeekFlags) < 0) then - begin - Log.LogError('av_seek_frame() failed', 'TVideoPlayback_ffmpeg.SetPosition'); - Exit; - end; - - avcodec_flush_buffers(fCodecContext); + VideoDecoderInfo.setPosition(fStream, Time); end; function TVideoDecodeStream_FFmpeg.GetPosition: real; begin - Result := fFrameTime; + Result := VideoDecoderInfo.getPosition(fStream); end; function TVideoDecodeStream_FFmpeg.GetFrameWidth(): integer; begin - Result := fCodecContext^.width; + Result := VideoDecoderInfo.getFrameWidth(fStream); end; function TVideoDecodeStream_FFmpeg.GetFrameHeight(): integer; begin - Result := fCodecContext^.height; + Result := VideoDecoderInfo.getFrameHeight(fStream); end; function TVideoDecodeStream_FFmpeg.GetFrameAspect(): real; begin - Result := fAspect; + Result := VideoDecoderInfo.getFrameAspect(fStream); end; initialization diff --git a/mediaplugin/src/switches.inc b/mediaplugin/src/switches.inc index 64ebb5c2..66ed2320 100644 --- a/mediaplugin/src/switches.inc +++ b/mediaplugin/src/switches.inc @@ -93,15 +93,8 @@ {$ENDIF} {$IFEND} -// ffmpeg config -{$IFDEF HaveFFmpeg} - {$DEFINE UseFFmpegDecoder} - {$DEFINE UseFFmpegResample} - {$DEFINE UseFFmpegVideo} - {$IFDEF HaveSWScale} - {$DEFINE UseSWScale} - {$ENDIF} -{$ENDIF} +// ffmpeg config (TODO: remove when dynamically loaded) +{$DEFINE UseFFmpegResample} {$IFDEF HaveLibsamplerate} {$DEFINE UseSRCResample} @@ -114,10 +107,6 @@ // specify some useful defines -{$IF Defined(UseFFmpegVideo) or Defined(UseFFmpegDecoder)} - {$DEFINE UseFFmpeg} -{$IFEND} - {$IF Defined(UseBASSInput) or Defined(UseBASSPlayback) or Defined(UseBASSDecoder)} {$DEFINE UseBASS} {$IFEND} diff --git a/mediaplugin/src/ultrastardx.dpr b/mediaplugin/src/ultrastardx.dpr index bce94001..aafb88b0 100644 --- a/mediaplugin/src/ultrastardx.dpr +++ b/mediaplugin/src/ultrastardx.dpr @@ -88,20 +88,6 @@ uses portmixer in 'lib\portmixer\portmixer.pas', {$ENDIF} - {$IFDEF UseFFmpeg} - avcodec in 'lib\ffmpeg\avcodec.pas', - avformat in 'lib\ffmpeg\avformat.pas', - avutil in 'lib\ffmpeg\avutil.pas', - rational in 'lib\ffmpeg\rational.pas', - opt in 'lib\ffmpeg\opt.pas', - avio in 'lib\ffmpeg\avio.pas', - mathematics in 'lib\ffmpeg\mathematics.pas', - UMediaCore_FFmpeg in 'media\UMediaCore_FFmpeg.pas', - {$IFDEF UseSWScale} - swscale in 'lib\ffmpeg\swscale.pas', - {$ENDIF} - {$ENDIF} - {$IFDEF UseSRCResample} samplerate in 'lib\samplerate\samplerate.pas', {$ENDIF} @@ -268,11 +254,12 @@ uses //****************************** UMediaPlugin in 'media\UMediaPlugin.pas', - -{$IFDEF UseFFmpegVideo} UVideo in 'media\UVideo.pas', + + // TODO: load dynamically UVideoDecoder_FFmpeg in 'media\UVideoDecoder_FFmpeg.pas', -{$ENDIF} + UAudioDecoder_FFmpeg in 'media\UAudioDecoder_FFmpeg.pas', + {$IFDEF UseProjectM} // must be after UVideo, so it will not be the default video module UVisualizer in 'media\UVisualizer.pas', @@ -296,9 +283,6 @@ uses {$IFDEF UsePortaudioPlayback} UAudioPlayback_Portaudio in 'media\UAudioPlayback_Portaudio.pas', {$ENDIF} -{$IFDEF UseFFmpegDecoder} - UAudioDecoder_FFmpeg in 'media\UAudioDecoder_FFmpeg.pas', -{$ENDIF} // fallback dummy, must be last UMedia_dummy in 'media\UMedia_dummy.pas', |