From aa8ce8ae962c75a7686b9341045d1a08e77fec69 Mon Sep 17 00:00:00 2001 From: Laentir Valetov Date: Sat, 30 Sep 2017 03:13:05 +0400 Subject: [PATCH] Migrate to FFmpeg Delphi/Pascal Headers by http://www.delphiffmpeg.com Signed-off-by: Laentir Valetov --- .gitignore | 12 +- README.md | 8 +- .../cFFmpegIPCamSource/uMainForm.pas | 2 +- samples/FFMpeg/FFMPEG.groupproj | 96 - .../FFMpeg/VideoEncoder/ffmVideoEncoder.dpr | 124 - .../FFMpeg/VideoEncoder/ffmVideoEncoder.dproj | 578 -- .../FFMpeg/VideoEncoder/ffmVideoEncoder.res | Bin 57140 -> 0 bytes .../decoding_encoding/decoding_encoding.dpr | 707 --- .../decoding_encoding/decoding_encoding.dproj | 122 - .../decoding_encoding/decoding_encoding.res | Bin 96 -> 0 bytes .../ffm_SDL2_VCL_player.dpr | 14 - .../ffm_SDL2_VCL_player.dproj | 138 - .../ffm_SDL2_VCL_player.res | Bin 59276 -> 0 bytes .../FFMpeg/ffm_SDL2_VCL_player/uMainForm.dfm | 20 - .../FFMpeg/ffm_SDL2_VCL_player/uMainForm.pas | 175 - .../ffmpeg_sample_player.dpr | 196 - .../ffmpeg_sample_player.dproj | 254 - .../ffmpeg_sample_player.res | Bin 57140 -> 0 bytes .../filtering_video/filtering_video.dpr | 304 - .../filtering_video/filtering_video.dproj | 244 - .../filtering_video/filtering_video.res | Bin 57140 -> 0 bytes samples/FFMpeg/metadata/metadata.dpr | 66 - samples/FFMpeg/metadata/metadata.dproj | 244 - samples/FFMpeg/metadata/metadata.res | Bin 57140 -> 0 bytes .../FFMpeg/scaling_video/scaling_video.dpr | 168 - .../FFMpeg/scaling_video/scaling_video.dproj | 254 - .../FFMpeg/scaling_video/scaling_video.res | Bin 57140 -> 0 bytes .../LearningOpenCV_Code.groupproj | 18 +- .../LockWorkstation.res | Bin 140300 -> 140300 bytes .../dclCommonOpenCV250.dproj | 12 +- .../Delphi 10.2 Tokyo/dclFMXOpenCV250.dpk | 5 +- .../Delphi 10.2 Tokyo/dclFMXOpenCV250.dproj | 21 +- .../Delphi 10.2 Tokyo/dclVCLOpenCV250.dproj | 12 +- source/component/ocv.comp.FFMSource.pas | 46 +- source/component/ocv.comp.ViewFMX.pas | 1 + source/ffmpeg/LICENSE.txt | 22 + source/ffmpeg/Readme.txt | 30 + source/ffmpeg/ffm.avfilter.pas | 1708 ------ source/ffmpeg/ffm.avformat.pas | 2232 ------- source/ffmpeg/ffm.avio.pas | 506 -- source/ffmpeg/ffm.avutil.pas | 255 - source/ffmpeg/ffm.buffer.pas | 285 - source/ffmpeg/ffm.buffersink.pas | 199 - source/ffmpeg/ffm.buffersrc.pas | 148 - source/ffmpeg/ffm.channel_layout.pas | 234 - source/ffmpeg/ffm.cls.videoencoder.pas | 687 --- source/ffmpeg/ffm.ctypes.pas | 74 - source/ffmpeg/ffm.dict.pas | 169 - source/ffmpeg/ffm.errno.pas | 123 - source/ffmpeg/ffm.error.pas | 187 - source/ffmpeg/ffm.frame.pas | 673 --- source/ffmpeg/ffm.imgutils.pas | 210 - source/ffmpeg/ffm.lib.pas | 19 - source/ffmpeg/ffm.libavcodec.avcodec.pas | 5137 ----------------- source/ffmpeg/ffm.log.pas | 309 - source/ffmpeg/ffm.mathematics.pas | 169 - source/ffmpeg/ffm.mem.pas | 359 -- source/ffmpeg/ffm.opt.pas | 792 --- source/ffmpeg/ffm.parseutils.pas | 202 - source/ffmpeg/ffm.pixdesc.pas | 304 - source/ffmpeg/ffm.pixfmt.pas | 623 -- source/ffmpeg/ffm.rational.pas | 175 - source/ffmpeg/ffm.samplefmt.pas | 274 - source/ffmpeg/ffm.swresample.pas | 309 - source/ffmpeg/ffm.swscale.pas | 413 -- source/ffmpeg/ffm.time.pas | 46 - source/ffmpeg/ffmpeg.inc | 18 - source/ffmpeg/ffmpeg.old_codec_ids.inc | 391 -- source/ffmpeg/ffmpeg.old_pix_fmts.inc | 173 - source/ocv.fmxutils.pas | 30 +- 70 files changed, 147 insertions(+), 21179 deletions(-) delete mode 100644 samples/FFMpeg/FFMPEG.groupproj delete mode 100644 samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dpr delete mode 100644 samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dproj delete mode 100644 samples/FFMpeg/VideoEncoder/ffmVideoEncoder.res delete mode 100644 samples/FFMpeg/decoding_encoding/decoding_encoding.dpr delete mode 100644 samples/FFMpeg/decoding_encoding/decoding_encoding.dproj delete mode 100644 samples/FFMpeg/decoding_encoding/decoding_encoding.res delete mode 100644 samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dpr delete mode 100644 samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dproj delete mode 100644 samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.res delete mode 100644 samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.dfm delete mode 100644 samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.pas delete mode 100644 samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dpr delete mode 100644 samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dproj delete mode 100644 samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.res delete mode 100644 samples/FFMpeg/filtering_video/filtering_video.dpr delete mode 100644 samples/FFMpeg/filtering_video/filtering_video.dproj delete mode 100644 samples/FFMpeg/filtering_video/filtering_video.res delete mode 100644 samples/FFMpeg/metadata/metadata.dpr delete mode 100644 samples/FFMpeg/metadata/metadata.dproj delete mode 100644 samples/FFMpeg/metadata/metadata.res delete mode 100644 samples/FFMpeg/scaling_video/scaling_video.dpr delete mode 100644 samples/FFMpeg/scaling_video/scaling_video.dproj delete mode 100644 samples/FFMpeg/scaling_video/scaling_video.res create mode 100644 source/ffmpeg/LICENSE.txt create mode 100644 source/ffmpeg/Readme.txt delete mode 100644 source/ffmpeg/ffm.avfilter.pas delete mode 100644 source/ffmpeg/ffm.avformat.pas delete mode 100644 source/ffmpeg/ffm.avio.pas delete mode 100644 source/ffmpeg/ffm.avutil.pas delete mode 100644 source/ffmpeg/ffm.buffer.pas delete mode 100644 source/ffmpeg/ffm.buffersink.pas delete mode 100644 source/ffmpeg/ffm.buffersrc.pas delete mode 100644 source/ffmpeg/ffm.channel_layout.pas delete mode 100644 source/ffmpeg/ffm.cls.videoencoder.pas delete mode 100644 source/ffmpeg/ffm.ctypes.pas delete mode 100644 source/ffmpeg/ffm.dict.pas delete mode 100644 source/ffmpeg/ffm.errno.pas delete mode 100644 source/ffmpeg/ffm.error.pas delete mode 100644 source/ffmpeg/ffm.frame.pas delete mode 100644 source/ffmpeg/ffm.imgutils.pas delete mode 100644 source/ffmpeg/ffm.lib.pas delete mode 100644 source/ffmpeg/ffm.libavcodec.avcodec.pas delete mode 100644 source/ffmpeg/ffm.log.pas delete mode 100644 source/ffmpeg/ffm.mathematics.pas delete mode 100644 source/ffmpeg/ffm.mem.pas delete mode 100644 source/ffmpeg/ffm.opt.pas delete mode 100644 source/ffmpeg/ffm.parseutils.pas delete mode 100644 source/ffmpeg/ffm.pixdesc.pas delete mode 100644 source/ffmpeg/ffm.pixfmt.pas delete mode 100644 source/ffmpeg/ffm.rational.pas delete mode 100644 source/ffmpeg/ffm.samplefmt.pas delete mode 100644 source/ffmpeg/ffm.swresample.pas delete mode 100644 source/ffmpeg/ffm.swscale.pas delete mode 100644 source/ffmpeg/ffm.time.pas delete mode 100644 source/ffmpeg/ffmpeg.inc delete mode 100644 source/ffmpeg/ffmpeg.old_codec_ids.inc delete mode 100644 source/ffmpeg/ffmpeg.old_pix_fmts.inc diff --git a/.gitignore b/.gitignore index 6fdd214..4178b37 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,12 @@ ipch/ lib/ /resource/result/*.* CVAutoInstaller/ +/source/ffmpeg/examples +/source/ffmpeg/headers + +#ResourceFiles +/resource/stereosample/Aloe/*.png +/resource/stereosample/Aloe/dmin.txt #Files *.exe @@ -50,8 +56,4 @@ CVAutoInstaller/ *.filters *.user !opencv_classes*.dll -!opencv_classes*.dll - -#ResourceFiles -/resource/stereosample/Aloe/*.png -/resource/stereosample/Aloe/dmin.txt \ No newline at end of file +!opencv_classes*.dll \ No newline at end of file diff --git a/README.md b/README.md index f976900..bb54809 100644 --- a/README.md +++ b/README.md @@ -53,12 +53,13 @@ Unzip it to a convenient directory, thus get the following directory structure ``` +Download the [FFmpeg Delphi/Pascal Headers][6] and extract to \source\ffmpeg
Add the search path for the modules of the project in Delphi IDE (Tools-Options-Delphi Options-Library-Library path) ``` \source \source\classes \source\component -\source\ffmpeg +\source\ffmpeg\headers \source\opengl \source\sdl \source\sdl2 @@ -90,7 +91,7 @@ Examples of the use of video processing algorithms using VCL.Forms ``` Examples of using FFMPEG library header files are in the ``` -\samples\FFMpeg\FFMPEG.groupproj +\source\ffmpeg\examples ``` Examples of use of components ``` @@ -107,4 +108,5 @@ Examples of use of components [2]: https://www.microsoft.com/en-us/download/details.aspx?id=48145 [3]: https://www.libsdl.org/index.php [4]: https://github.com/opencv/opencv/releases/tag/2.4.13.2 -[5]: http://ffmpeg.zeranoe.com/builds/ \ No newline at end of file +[5]: http://ffmpeg.zeranoe.com/builds/ +[6]: http://www.delphiffmpeg.com/headers/ \ No newline at end of file diff --git a/samples/Components/cFFmpegIPCamSource/uMainForm.pas b/samples/Components/cFFmpegIPCamSource/uMainForm.pas index f124069..a97704d 100644 --- a/samples/Components/cFFmpegIPCamSource/uMainForm.pas +++ b/samples/Components/cFFmpegIPCamSource/uMainForm.pas @@ -4,7 +4,7 @@ interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ffm.libavcodec.avcodec, ocv.comp.FFMSource, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, libavcodec, ocv.comp.FFMSource, ocv.comp.Types, ocv.comp.Source, ocv.comp.View, Vcl.StdCtrls, Vcl.ExtCtrls; type diff --git a/samples/FFMpeg/FFMPEG.groupproj b/samples/FFMpeg/FFMPEG.groupproj deleted file mode 100644 index 177e541..0000000 --- a/samples/FFMpeg/FFMPEG.groupproj +++ /dev/null @@ -1,96 +0,0 @@ - - - {494E9258-6938-4D18-843D-93EBD2FC9965} - - - - - - - - - - - - - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dpr b/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dpr deleted file mode 100644 index 5c409fb..0000000 --- a/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dpr +++ /dev/null @@ -1,124 +0,0 @@ -program ffmVideoEncoder; - -{$APPTYPE CONSOLE} -{$POINTERMATH ON} -{$R *.res} - -uses - System.SysUtils, - ffm.cls.videoencoder, - ffm.libavcodec.avcodec, - ffm.pixfmt, - ffm.mem, - ffm.frame; - -Var - seed: Single = 1.0; - - // Create test video frame -procedure CreateFrame(const buffer: PByte; const w, h, bytespan: Integer); -Var - wxh: Integer; - i, j: Integer; - line: PByte; -begin - wxh := w * h; - for i := 0 to h - 1 do - begin - line := @buffer[i * bytespan]; - for j := 0 to w - 1 do - begin - // RGB - line[0] := Trunc(255 * sin((i / wxh * seed) * 3.14)); - line[1] := Trunc(255 * cos((j / wxh * seed) * 3.14)); - line[2] := Trunc(255 * sin(((i + j) / wxh * seed) * 3.14)); - line := line + 3; - end; - end; - seed := seed + 2.2; -end; - -Var - shift: Single = 0.0; - seconds: Single = 0.0; - - minNu: Single = 3.14 / (44100.0) * 700.0; - maxNu: Single = 3.14 / (44100.0) * 1500.0; - speedNu: Single = 3.14 / (44100.0) * 10.0; - - varNu: Single = 3.14 / (44100.0) * 700.0; - - // Create sample -procedure CreateSample(const buffer: PByte; const sampleCount: Integer); -Var - shift, seconds, minNu, maxNu, speedNu, varNu: Single; - i: Integer; -begin - if (varNu > maxNu) then - varNu := minNu; - - varNu := varNu + speedNu; - - for i := 0 to sampleCount - 1 do - begin - seconds := seconds + 1.0 / 44100.0; - buffer[i] := Trunc(sin(i * varNu + shift) * $4FFF); - end; - shift := shift + varNu * sampleCount; -end; - -const - W_VIDEO = 640; - H_VIDEO = 480; - FILE_NAME = 'c:\temp\1.avi'; - FRAME_COUNT = 150; - CONTAINER = 'auto'; - -Var - encoder: TFFMVideoEncoder; - w, h: Integer; - frame: pAVFrame; - nSampleSize: Integer; - sample: PByte; - bufferImgSize: Integer; - buffer: PByte; - i: Integer; - -begin - try - encoder := TFFMVideoEncoder.Create; - - if encoder.InitFile(FILE_NAME, CONTAINER, W_VIDEO, H_VIDEO) then - begin - w := W_VIDEO; - h := H_VIDEO; - frame := av_frame_alloc();//avcodec_alloc_frame(); - nSampleSize := 2 * 44100 div 25; // 1 / 25 sec * FORMAT SIZE(S16) - sample := AllocMem(nSampleSize); - // Create frame - bufferImgSize := avpicture_get_size(AV_PIX_FMT_BGR24, w, h); - buffer := av_mallocz(bufferImgSize); - avpicture_fill(pAVPicture(frame), buffer, AV_PIX_FMT_BGR24, w, h); - - for i := 0 to FRAME_COUNT - 1 do - begin - CreateFrame(frame^.data[0], w, h, frame^.linesize[0]); - CreateSample(sample, nSampleSize div 2); - if not encoder.AddFrame(frame, sample, nSampleSize) then - Writeln('Cannot write frame'); - end; - - encoder.Finish(); - av_free(frame^.data[0]); - av_free(frame); - FreeMem(sample); - sample := nil; - end - else - Writeln('Cannot open file ' + FILE_NAME); - except - on E: Exception do - Writeln(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dproj b/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dproj deleted file mode 100644 index ff25563..0000000 --- a/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.dproj +++ /dev/null @@ -1,578 +0,0 @@ - - - {8A61BB0C-02D9-43F4-9C83-FBB6205E7FA1} - 18.2 - None - ffmVideoEncoder.dpr - True - Debug - Win32 - 1 - Console - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - None - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1049 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - ffmVideoEncoder - .\$(Platform)\$(Config) - ..\..\..\bin\$(Platform) - false - false - false - false - false - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - - - android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - DBXInterBaseDriver;DataSnapCommon;DbxCommonDriver;dbxcds;CustomIPTransport;dsnap;IndyIPServer;IndyCore;CloudService;FmxTeeUI;FireDACIBDriver;dsnapxml;OpenCV200;bindcompfmx;RESTBackendComponents;dbrtl;FireDACCommon;bindcomp;xmlrtl;ibxpress;FireDACCommonDriver;bindengine;soaprtl;FMXTee;inet;soapmidas;dxPSDBTeeChartRS19;RESTComponents;dbexpress;IndyIPClient;FireDACSqliteDriver;autoupgrXE5;FireDACDSDriver;DBXSqliteDriver;fmx;IndySystem;tethering;DataSnapClient;DataSnapProviderClient;fmxFireDAC;IndyIPCommon;DataSnapFireDAC;FireDACDBXDriver;soapserver;dxPSTeeChartRS19;rtl;DbxClientDriver;DataSnapNativeClient;IndyProtocols;bindcompdbx;FireDAC;$(DCC_UsePackage) - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - - - iPhoneAndiPad - Base - true - $(MSBuildProjectName) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false - DBXInterBaseDriver;DataSnapCommon;DbxCommonDriver;dbxcds;CustomIPTransport;dsnap;IndyIPServer;IndyCore;CloudService;FmxTeeUI;FireDACIBDriver;dsnapxml;OpenCV200;bindcompfmx;RESTBackendComponents;dbrtl;FireDACCommon;bindcomp;xmlrtl;ibxpress;FireDACCommonDriver;bindengine;soaprtl;FMXTee;inet;soapmidas;RESTComponents;dbexpress;IndyIPClient;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;fmx;IndySystem;tethering;DataSnapClient;DataSnapProviderClient;fmxFireDAC;fmxase;IndyIPCommon;DataSnapFireDAC;FireDACDBXDriver;soapserver;rtl;DbxClientDriver;DataSnapNativeClient;IndyProtocols;bindcompdbx;FireDAC;$(DCC_UsePackage);$(DCC_UsePackage) - true - Debug - true - - - iPhoneAndiPad - Base - true - $(MSBuildProjectName) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false - DBXInterBaseDriver;DataSnapCommon;DbxCommonDriver;dbxcds;CustomIPTransport;dsnap;IndyIPServer;IndyCore;CloudService;FmxTeeUI;FireDACIBDriver;dsnapxml;OpenCV200;bindcompfmx;RESTBackendComponents;dbrtl;FireDACCommon;bindcomp;xmlrtl;ibxpress;FireDACCommonDriver;bindengine;soaprtl;FMXTee;inet;soapmidas;RESTComponents;dbexpress;IndyIPClient;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;fmx;IndySystem;tethering;DataSnapClient;DataSnapProviderClient;fmxFireDAC;fmxase;IndyIPCommon;DataSnapFireDAC;FireDACDBXDriver;soapserver;rtl;DbxClientDriver;DataSnapNativeClient;IndyProtocols;bindcompdbx;FireDAC;$(DCC_UsePackage);$(DCC_UsePackage) - true - Debug - true - - - DBXInterBaseDriver;DataSnapCommon;DbxCommonDriver;dbxcds;CustomIPTransport;dsnap;IndyIPServer;IndyCore;CloudService;FmxTeeUI;FireDACIBDriver;dsnapxml;OpenCV200;bindcompfmx;RESTBackendComponents;dbrtl;FireDACCommon;bindcomp;xmlrtl;ibxpress;FireDACCommonDriver;bindengine;soaprtl;FMXTee;inet;soapmidas;RESTComponents;dbexpress;IndyIPClient;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;fmx;IndySystem;tethering;DataSnapClient;DataSnapProviderClient;fmxFireDAC;fmxase;IndyIPCommon;DataSnapFireDAC;FireDACDBXDriver;soapserver;rtl;DbxClientDriver;DataSnapNativeClient;IndyProtocols;bindcompdbx;FireDAC;$(DCC_UsePackage) - - - true - FireDACPgDriver;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;DbxCommonDriver;dbxcds;CustomIPTransport;dsnap;IndyIPServer;IndyCore;CloudService;FmxTeeUI;FireDACIBDriver;dsnapxml;FireDACDb2Driver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;dbrtl;FireDACCommon;bindcomp;inetdb;xmlrtl;ibxpress;FireDACCommonDriver;bindengine;soaprtl;FMXTee;FireDACMSSQLDriver;DBXInformixDriver;DataSnapServerMidas;DBXFirebirdDriver;inet;FireDACMySQLDriver;soapmidas;DBXSybaseASADriver;RESTComponents;dbexpress;IndyIPClient;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;fmx;IndySystem;tethering;DataSnapClient;DataSnapProviderClient;fmxFireDAC;DBXOracleDriver;fmxase;IndyIPCommon;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;FireDACInfxDriver;FireDACASADriver;rtl;DbxClientDriver;DataSnapNativeClient;IndyProtocols;DBXMySQLDriver;bindcompdbx;FireDACADSDriver;FireDAC;fmxobj;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;DataSnapIndy10ServerTransport;$(DCC_UsePackage) - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - true - dxSkinOffice2007BlackRS19;JvGlobus;JvMM;JvManagedThreads;dxSkinLiquidSkyRS19;cxBarEditItemRS19;OverbyteIcsDXE5Run;FireDACPgDriver;dxWizardControlRS19;dxPScxCommonRS19;tmswizdXE5;dxThemeRS19;JvCrypt;XiButtonXE4;cxGridRS19;dxPScxExtCommonRS19;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;cxSchedulerRS19;JvNet;JvDotNetCtrls;DbxCommonDriver;vclimg;dbxcds;dxFlowChartRS19;DatasnapConnectorsFreePascal;JvXPCtrls;dxdbtrRS19;dxSkinSpringTimeRS19;vcldb;dxdborRS19;dxDockingRS19;dxSkinsdxDLPainterRS19;cxSpreadSheetRS19;dxtrmdRS19;dxSpellCheckerRS19;CustomIPTransport;dxTileControlRS19;dsnap;IndyIPServer;dxPSCoreRS19;dxSkinFoggyRS19;IndyCore;cxSchedulerGridRS19;cxPivotGridOLAPRS19;dxSkinStardustRS19;CloudService;FmxTeeUI;FireDACIBDriver;dxSkinXmas2008BlueRS19;JvDB;JvRuntimeDesign;dxSkinValentineRS19;fsIBX20;dsnapxml;dxPScxSchedulerLnkRS19;dxSkinDarkSideRS19;FireDACDb2Driver;dxSkinLondonLiquidSkyRS19;JclDeveloperTools;dxBarExtDBItemsRS19;dxTabbedMDIRS19;OpenCV200;dxSkinOffice2013WhiteRS19;dxSkinSharpRS19;bindcompfmx;dxSkinBlueprintRS19;dxSkinOffice2007PinkRS19;frx20;vcldbx;cxExportRS19;FireDACODBCDriver;RESTBackendComponents;dxSkinCoffeeRS19;dbrtl;FireDACCommon;bindcomp;inetdb;dxSkinBlueRS19;JvPluginSystem;dxServerModeRS19;DBXOdbcDriver;JvCmp;vclFireDAC;dxSkinMoneyTwinsRS19;cxPivotGridChartRS19;xmlrtl;dxSkiniMaginaryRS19;ibxpress;JvTimeFramework;dxSkinOffice2007GreenRS19;FireDACCommonDriver;bindengine;vclactnband;soaprtl;FMXTee;dxRibbonRS19;bindcompvcl;dxADOServerModeRS19;Jcl;vclie;dxPSdxLCLnkRS19;dxSkinBlackRS19;dxSkinOffice2010BlackRS19;dxSkinSevenClassicRS19;FireDACMSSQLDriver;DBXInformixDriver;Intraweb;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxSkinsdxNavBarPainterRS19;inet;dxPSdxFCLnkRS19;dxSkinscxSchedulerPainterRS19;JvPascalInterpreter;FireDACMySQLDriver;soapmidas;vclx;dxPSPrVwRibbonRS19;dxPSDBTeeChartRS19;DBXSybaseASADriver;RESTComponents;dxSkinLilianRS19;dxSkinscxPCPainterRS19;dbexpress;IndyIPClient;JvBDE;tmsdXE5;cxSchedulerTreeBrowserRS19;dxPScxSSLnkRS19;dxPScxPivotGridLnkRS19;dxSkinSharpPlusRS19;FireDACSqliteDriver;autoupgrXE5;FireDACDSDriver;ZComponent;DBXSqliteDriver;dxPSdxDBTVLnkRS19;dxSkinOffice2007BlueRS19;cxDataRS19;cxLibraryRS19;fmx;JvDlgs;IndySystem;RVButtonXE6;TeeDB;tethering;dxPsPrVwAdvRS19;dxSkinHighContrastRS19;inetdbbde;vclib;DataSnapClient;DataSnapProviderClient;DBXSybaseASEDriver;dxmdsRS19;dxSkinOffice2010SilverRS19;dxSkinsdxBarPainterRS19;fsBDE20;MetropolisUILiveTile;dxPSdxOCLnkRS19;vcldsnap;fmxFireDAC;DBXDb2Driver;dxSkinDevExpressDarkStyleRS19;DBXOracleDriver;dxBarDBNavRS19;JvCore;vclribbon;dxSkinSilverRS19;dxSkinVS2010RS19;fmxase;vcl;dxPSdxDBOCLnkRS19;DBXMSSQLDriver;IndyIPCommon;CodeSiteExpressPkg;dxBarRS19;cxTreeListdxBarPopupMenuRS19;DataSnapFireDAC;FireDACDBXDriver;JvAppFrm;soapserver;dxFireDACServerModeRS19;inetdbxpress;fsTee20;frxTee20;cxEditorsRS19;dxSkinMcSkinRS19;FireDACInfxDriver;JvDocking;adortl;dxSkinOffice2007SilverRS19;frxDB20;JvWizards;FireDACASADriver;dxSkinSevenRS19;JvHMI;dxDBXServerModeRS19;dxLayoutControlRS19;dxPSTeeChartRS19;dxSkinWhiteprintRS19;cxPageControlRS19;fsADO20;JvBands;ZDbc;rtl;dcldxSkinsCoreRS19;DbxClientDriver;ZPlain;dxPScxGridLnkRS19;Tee;cxPageControldxBarPopupMenuRS19;cxVerticalGridRS19;JclContainers;CPortLibDXE;JvSystem;DataSnapNativeClient;svnui;dxSkinsdxRibbonPainterRS19;dxSkinSummer2008RS19;cxPivotGridRS19;dxComnRS19;IndyProtocols;DBXMySQLDriver;dxSkinTheAsphaltWorldRS19;JvControls;tmsxlsdXE5;dxPSLnksRS19;viTimeLineDPK;bindcompdbx;TeeUI;JvJans;JvPrintPreview;JvPageComps;dxSkinDarkRoomRS19;JvStdCtrls;JvCustom;dxSkinPumpkinRS19;dxBarExtItemsRS19;FireDACADSDriver;vcltouch;ZCore;dxNavBarRS19;VclSmp;FireDAC;VCLRESTComponents;dxGDIPlusRS19;DataSnapConnectors;dxCoreRS19;dxPScxVGridLnkRS19;fsDB20;dxPScxTLLnkRS19;dxSkinsCoreRS19;fmxobj;dxSkinGlassOceansRS19;JclVcl;ZParseSql;dxPScxPCProdRS19;fs20;svn;tmsexdXE5;dxSkinOffice2010BlueRS19;FireDACOracleDriver;fmxdae;dxorgcRS19;bdertl;cxTreeListRS19;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkinDevExpressStyleRS19;dxSkinCaramelRS19;$(DCC_UsePackage) - - - true - dxSkinOffice2007BlackRS19;dxSkinLiquidSkyRS19;cxBarEditItemRS19;OverbyteIcsDXE5Run;FireDACPgDriver;dxWizardControlRS19;dxPScxCommonRS19;dxThemeRS19;cxGridRS19;dxPScxExtCommonRS19;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;cxSchedulerRS19;DbxCommonDriver;vclimg;dbxcds;dxFlowChartRS19;DatasnapConnectorsFreePascal;dxdbtrRS19;dxSkinSpringTimeRS19;vcldb;dxdborRS19;dxDockingRS19;dxSkinsdxDLPainterRS19;cxSpreadSheetRS19;dxtrmdRS19;dxSpellCheckerRS19;CustomIPTransport;dxTileControlRS19;dsnap;IndyIPServer;dxPSCoreRS19;dxSkinFoggyRS19;IndyCore;cxSchedulerGridRS19;cxPivotGridOLAPRS19;dxSkinStardustRS19;CloudService;FmxTeeUI;FireDACIBDriver;dxSkinXmas2008BlueRS19;dxSkinValentineRS19;dsnapxml;dxPScxSchedulerLnkRS19;dxSkinDarkSideRS19;FireDACDb2Driver;dxSkinLondonLiquidSkyRS19;dxBarExtDBItemsRS19;dxTabbedMDIRS19;OpenCV200;dxSkinOffice2013WhiteRS19;dxSkinSharpRS19;bindcompfmx;dxSkinBlueprintRS19;dxSkinOffice2007PinkRS19;cxExportRS19;FireDACODBCDriver;RESTBackendComponents;dxSkinCoffeeRS19;dbrtl;FireDACCommon;bindcomp;inetdb;dxSkinBlueRS19;dxServerModeRS19;DBXOdbcDriver;vclFireDAC;dxSkinMoneyTwinsRS19;cxPivotGridChartRS19;xmlrtl;dxSkiniMaginaryRS19;ibxpress;dxSkinOffice2007GreenRS19;FireDACCommonDriver;bindengine;vclactnband;soaprtl;FMXTee;dxRibbonRS19;bindcompvcl;dxADOServerModeRS19;vclie;dxPSdxLCLnkRS19;dxSkinBlackRS19;dxSkinOffice2010BlackRS19;dxSkinSevenClassicRS19;FireDACMSSQLDriver;DBXInformixDriver;Intraweb;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxSkinsdxNavBarPainterRS19;inet;dxPSdxFCLnkRS19;dxSkinscxSchedulerPainterRS19;FireDACMySQLDriver;soapmidas;vclx;dxPSPrVwRibbonRS19;DBXSybaseASADriver;RESTComponents;dxSkinLilianRS19;dxSkinscxPCPainterRS19;dbexpress;IndyIPClient;tmsdXE5;cxSchedulerTreeBrowserRS19;dxPScxSSLnkRS19;dxPScxPivotGridLnkRS19;dxSkinSharpPlusRS19;FireDACSqliteDriver;FireDACDSDriver;ZComponent;DBXSqliteDriver;dxPSdxDBTVLnkRS19;dxSkinOffice2007BlueRS19;cxDataRS19;cxLibraryRS19;fmx;IndySystem;TeeDB;tethering;dxPsPrVwAdvRS19;dxSkinHighContrastRS19;vclib;DataSnapClient;DataSnapProviderClient;DBXSybaseASEDriver;dxmdsRS19;dxSkinOffice2010SilverRS19;dxSkinsdxBarPainterRS19;MetropolisUILiveTile;dxPSdxOCLnkRS19;vcldsnap;fmxFireDAC;DBXDb2Driver;dxSkinDevExpressDarkStyleRS19;DBXOracleDriver;dxBarDBNavRS19;vclribbon;dxSkinSilverRS19;dxSkinVS2010RS19;fmxase;vcl;dxPSdxDBOCLnkRS19;DBXMSSQLDriver;IndyIPCommon;dxBarRS19;cxTreeListdxBarPopupMenuRS19;DataSnapFireDAC;FireDACDBXDriver;soapserver;dxFireDACServerModeRS19;inetdbxpress;cxEditorsRS19;dxSkinMcSkinRS19;FireDACInfxDriver;adortl;dxSkinOffice2007SilverRS19;FireDACASADriver;dxSkinSevenRS19;dxDBXServerModeRS19;dxLayoutControlRS19;dxSkinWhiteprintRS19;cxPageControlRS19;ZDbc;rtl;dcldxSkinsCoreRS19;DbxClientDriver;ZPlain;dxPScxGridLnkRS19;Tee;cxPageControldxBarPopupMenuRS19;cxVerticalGridRS19;DataSnapNativeClient;dxSkinsdxRibbonPainterRS19;dxSkinSummer2008RS19;cxPivotGridRS19;dxComnRS19;IndyProtocols;DBXMySQLDriver;dxSkinTheAsphaltWorldRS19;tmsxlsdXE5;dxPSLnksRS19;bindcompdbx;TeeUI;dxSkinDarkRoomRS19;dxSkinPumpkinRS19;dxBarExtItemsRS19;FireDACADSDriver;vcltouch;ZCore;dxNavBarRS19;VclSmp;FireDAC;VCLRESTComponents;dxGDIPlusRS19;DataSnapConnectors;dxCoreRS19;dxPScxVGridLnkRS19;dxPScxTLLnkRS19;dxSkinsCoreRS19;fmxobj;dxSkinGlassOceansRS19;ZParseSql;dxPScxPCProdRS19;tmsexdXE5;dxSkinOffice2010BlueRS19;FireDACOracleDriver;fmxdae;dxorgcRS19;cxTreeListRS19;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkinDevExpressStyleRS19;dxSkinCaramelRS19;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - None - 1033 - false - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - ffmVideoEncoder.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - true - - - - - true - - - - - true - - - - - 1 - - - Contents\MacOS - 0 - - - - - classes - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - - - res\values - 1 - - - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - False - False - False - False - False - False - True - False - - - 12 - - - - - diff --git a/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.res b/samples/FFMpeg/VideoEncoder/ffmVideoEncoder.res deleted file mode 100644 index 6876088a6648ed90b09c480197508e4404c57dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57140 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 I2>8kW0h0=QvH$=8 diff --git a/samples/FFMpeg/decoding_encoding/decoding_encoding.dpr b/samples/FFMpeg/decoding_encoding/decoding_encoding.dpr deleted file mode 100644 index e1fee91..0000000 --- a/samples/FFMpeg/decoding_encoding/decoding_encoding.dpr +++ /dev/null @@ -1,707 +0,0 @@ -(* - * Copyright (c) 2001 Fabrice Bellard - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. -*) -(* * - * @file - * libavcodec API use example. - * - * @example decoding_encoding.c - * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...), - * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the - * format handling -*) - -program decoding_encoding; - -{$APPTYPE CONSOLE} -{$POINTERMATH ON} -{$R *.res} - -uses - System.SysUtils, - System.Math, - ffm.libavcodec.avcodec, - ffm.pixfmt, - ffm.avformat, - ffm.samplefmt, - ffm.swscale, - ffm.avio, - ffm.frame, - ffm.channel_layout, - ffm.ctypes, - ffm.mem, - ffm.mathematics, - ffm.avutil, - ffm.opt, - ffm.imgutils, - ffm.log; - -Const - INBUF_SIZE = 4096; - AUDIO_INBUF_SIZE = 20480; - AUDIO_REFILL_THRESH = 4096; - - (* check that a given sample format is supported by the encoder *) -function check_sample_fmt(const codec: pAVCodec; const sample_fmt: TAVSampleFormat): Boolean; -Var - p: pAVSampleFormat; -begin - p := codec^.sample_fmts; - while (p^ <> AV_SAMPLE_FMT_NONE) do - begin - if (p^ = sample_fmt) then - Exit(True); - inc(p); - end; - Result := False; -end; - -(* just pick the highest supported samplerate *) -function select_sample_rate(const codec: pAVCodec): Integer; -Var - p: pInteger; - best_samplerate: Integer; -begin - best_samplerate := 0; - if not Assigned(codec^.supported_samplerates) then - Exit(44100); - p := codec^.supported_samplerates; - while (p^ <> 0) do - begin - best_samplerate := MAX(p^, best_samplerate); - inc(p); - end; - Result := best_samplerate; -end; - -(* select layout with the highest channel count *) -function select_channel_layout(codec: pAVCodec): Integer; -Var - p: PUInt64_t; - best_ch_layout: UInt64; - best_nb_channels: Integer; - nb_channels: Integer; -begin - best_ch_layout := 0; - best_nb_channels := 0; - if not Assigned(codec^.channel_layouts) then - Exit(AV_CH_LAYOUT_STEREO); - p := codec^.channel_layouts; - while (p^ <> 0) do - begin - nb_channels := av_get_channel_layout_nb_channels(p^); - if (nb_channels > best_nb_channels) then - begin - best_ch_layout := p^; - best_nb_channels := nb_channels; - end; - inc(p); - end; - Result := best_ch_layout; -end; - -(* - * Audio encoding example -*) -procedure audio_encode_example(const filename: String); -Var - codec: pAVCodec; - c: pAVCodecContext; - frame: pAVFrame; - pkt: TAVPacket; - i, j, k, ret, got_output: Integer; - buffer_size: Integer; - f: File; - samples: ^Int16; - t, tincr: Single; -begin - c := nil; - WriteLn('Encode audio file ', filename); - (* find the MP2 encoder *) - codec := avcodec_find_encoder(AV_CODEC_ID_MP2); - if not Assigned(codec) then - begin - WriteLn('Codec not found'); - Exit; - end; - c := avcodec_alloc_context3(codec); - if not Assigned(c) then - begin - WriteLn('Could not allocate audio codec context\n'); - Exit; - end; - (* put sample parameters *) - c^.bit_rate := 64000; - (* check that the encoder supports s16 pcm input *) - c^.sample_fmt := AV_SAMPLE_FMT_S16; - if not check_sample_fmt(codec, c^.sample_fmt) then - begin - WriteLn('Encoder does not support sample format ', av_get_sample_fmt_name(c^.sample_fmt)); - Exit; - end; - (* select other audio parameters supported by the encoder *) - c^.sample_rate := select_sample_rate(codec); - c^.channel_layout := select_channel_layout(codec); - c^.channels := av_get_channel_layout_nb_channels(c^.channel_layout); - (* open it *) - if (avcodec_open2(c, codec, nil) < 0) then - begin - WriteLn('Could not open codec'); - Exit; - end; - AssignFile(f, filename); - try - Rewrite(f, 1); - except - WriteLn('Could not open', filename); - Exit; - end; - (* frame containing input raw audio *) - frame := av_frame_alloc(); - if not Assigned(frame) then - begin - WriteLn('Could not allocate audio frame'); - Exit; - end; - frame^.nb_samples := c^.frame_size; - frame^.format := Integer(c^.sample_fmt); - frame^.channel_layout := c^.channel_layout; - (* the codec gives us the frame size, in samples, - * we calculate the size of the samples buffer in bytes *) - buffer_size := av_samples_get_buffer_size(nil, c^.channels, c^.frame_size, c^.sample_fmt, 0); - if (buffer_size < 0) then - begin - WriteLn('Could not get sample buffer size'); - Exit; - end; - samples := av_malloc(buffer_size); - if not Assigned(samples) then - begin - WriteLn('Could not allocate %d bytes for samples buffer\n', buffer_size); - Exit; - end; - (* setup the data pointers in the AVFrame *) - ret := avcodec_fill_audio_frame(frame, c^.channels, c^.sample_fmt, pByte(samples), buffer_size, 0); - if (ret < 0) then - begin - WriteLn('Could not setup audio frame'); - Exit; - end; - (* encode a single tone sound *) - t := 0; - tincr := 2 * M_PI * 440.0 / c^.sample_rate; - for i := 0 to 199 do - begin - av_init_packet(@pkt); - pkt.data := nil; // packet data will be allocated by the encoder - pkt.size := 0; - for j := 0 to c^.frame_size - 1 do - begin - samples[2 * j] := Trunc((sin(t) * 10000)); - for k := 1 to c^.channels - 1 do - samples[2 * j + k] := samples[2 * j]; - t := t + tincr; - end; - (* encode the samples *) - ret := avcodec_encode_audio2(c, @pkt, frame, got_output); - if (ret < 0) then - begin - WriteLn('Error encoding audio frame'); - Exit; - end; - if (got_output <> 0) then - begin - BlockWrite(f, pkt.data^, pkt.size); - av_free_packet(pkt); - end; - end; - (* get the delayed frames *) - got_output := 1; - while got_output <> 0 do - // ; i++) - begin - ret := avcodec_encode_audio2(c, @pkt, nil, got_output); - if (ret < 0) then - begin - WriteLn('Error encoding frame'); - Exit; - end; - if (got_output <> 0) then - begin - BlockWrite(f, pkt.data^, pkt.size); - av_free_packet(pkt); - end; - inc(i); - end; - Close(f); - av_freep(samples); - av_frame_free(frame); - avcodec_close(c); - av_free(c); -end; - -(* - * Audio decoding. -*) -procedure audio_decode_example(const outfilename: String; const filename: String); -Var - codec: pAVCodec; - c: pAVCodecContext; - len: Integer; - f, outfile: File; - inbuf: array [0 .. AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE - 1] of byte; - avpkt: TAVPacket; - decoded_frame: pAVFrame; - got_frame: Integer; - data_size: Integer; -begin - c := nil; - decoded_frame := nil; - av_init_packet(@avpkt); - WriteLn('Decode audio file %s to ', filename, outfilename); - (* find the mpeg audio decoder *) - codec := avcodec_find_decoder(AV_CODEC_ID_MP2); - if not Assigned(codec) then - begin - WriteLn('Codec not found'); - Exit; - end; - c := avcodec_alloc_context3(codec); - if not Assigned(c) then - begin - WriteLn('Could not allocate audio codec context'); - Exit; - end; - (* open it *) - if (avcodec_open2(c, codec, nil) < 0) then - begin - WriteLn('Could not open codec'); - Exit; - end; - AssignFile(f, filename); - try - Reset(f, 1); - except - WriteLn('Could not open ', filename); - Exit; - end; - AssignFile(outfile, outfilename); - try - Rewrite(outfile, 1); - except - av_free(c); - Exit; - end; - (* decode until eof *) - avpkt.data := @inbuf; - BlockRead(f, inbuf, AUDIO_INBUF_SIZE, avpkt.size); - while (avpkt.size > 0) do - begin - got_frame := 0; - if not Assigned(decoded_frame) then - begin - decoded_frame := av_frame_alloc(); - if not Assigned(decoded_frame) then - begin - WriteLn('Could not allocate audio frame'); - Exit; - end; - end; - len := avcodec_decode_audio4(c, decoded_frame, got_frame, @avpkt); - if (len < 0) then - begin - WriteLn('Error while decoding'); - Exit; - end; - if (got_frame <> 0) then - begin - (* if a frame has been decoded, output it *) - data_size := av_samples_get_buffer_size(nil, c^.channels, decoded_frame^.nb_samples, c^.sample_fmt, 1); - if (data_size < 0) then - begin - (* This should not occur, checking just for paranoia *) - WriteLn('Failed to calculate data size'); - Exit; - end; - BlockWrite(outfile, decoded_frame^.data[0]^, data_size); - end; - avpkt.size := avpkt.size - len; - avpkt.data := avpkt.data + len; - avpkt.dts := AV_NOPTS_VALUE; - avpkt.pts := AV_NOPTS_VALUE; - if (avpkt.size < AUDIO_REFILL_THRESH) then - begin - (* Refill the input buffer, to avoid trying to decode - * incomplete frames. Instead of this, one could also use - * a parser, or use a proper container format through - * libavformat. *) - Move(avpkt.data^, inbuf, avpkt.size); - avpkt.data := @inbuf; - BlockRead(f, avpkt.data[avpkt.size], AUDIO_INBUF_SIZE - avpkt.size, len); - if (len > 0) then - avpkt.size := avpkt.size + len; - end; - end; - Close(outfile); - Close(f); - avcodec_close(c); - av_free(c); - av_frame_free(decoded_frame); -end; - -(* - * Video encoding example -*) -procedure video_encode_example(const filename: String; codec_id: TAVCodecID); -Var - codec: pAVCodec; - c: pAVCodecContext; - i, ret, x, y, got_output: Integer; - f: File; - frame: pAVFrame; - pkt: TAVPacket; - endcode: array [0 .. 3] of byte; -begin - c := nil; - endcode[0] := 0; - endcode[1] := 0; - endcode[2] := 1; - endcode[3] := $B7; - WriteLn('Encode video file ', filename); - (* find the mpeg1 video encoder *) - codec := avcodec_find_encoder(codec_id); - if not Assigned(codec) then - begin - WriteLn('Codec not found'); - Exit; - end; - c := avcodec_alloc_context3(codec); - if not Assigned(c) then - begin - WriteLn('Could not allocate video codec context'); - Exit; - end; - (* put sample parameters *) - c^.bit_rate := 400000; - (* resolution must be a multiple of two *) - c^.width := 352; - c^.height := 288; - (* frames per second *) - c^.time_base.num := 1; - c^.time_base.den := 25; - (* emit one intra frame every ten frames - * check frame pict_type before passing frame - * to encoder, if frame^.pict_type is AV_PICTURE_TYPE_I - * then gop_size is ignored and the output of encoder - * will always be I frame irrespective to gop_size - *) - c^.gop_size := 10; - c^.max_b_frames := 1; - c^.pix_fmt := AV_PIX_FMT_YUV420P; - if (codec_id = AV_CODEC_ID_H264) then - av_opt_set(c^.priv_data, 'preset', 'slow', 0); - (* open it *) - if (avcodec_open2(c, codec, nil) < 0) then - begin - WriteLn('Could not open codec'); - Exit; - end; - AssignFile(f, filename); - try - Rewrite(f, 1); - except - WriteLn('Could not open ', filename); - Exit; - end; - frame := av_frame_alloc(); - if not Assigned(frame) then - begin - WriteLn('Could not allocate video frame'); - Exit; - end; - frame^.format := Integer(c^.pix_fmt); - frame^.width := c^.width; - frame^.height := c^.height; - (* the image can be allocated by any means and av_image_alloc() is - * just the most convenient way if av_malloc() is to be used *) - ret := av_image_alloc(frame^.data, frame^.linesize, c^.width, c^.height, c^.pix_fmt, 32); - if (ret < 0) then - begin - WriteLn('Could not allocate raw picture buffer'); - Exit; - end; - // got_output:=0; - (* encode 1 second of video *) - for i := 0 to 24 do - begin - av_init_packet(@pkt); - pkt.data := nil; // packet data will be allocated by the encoder - pkt.size := 0; - (* prepare a dummy image *) - - (* Y *) - for y := 0 to c^.height - 1 do - for x := 0 to c^.width - 1 do - frame^.data[0][y * frame^.linesize[0] + x] := x + y + i * 3; - - (* Cb and Cr *) - for y := 0 to (c^.height div 2) - 1 do - for x := 0 to (c^.width div 2) - 1 do - begin - frame^.data[1][y * frame^.linesize[1] + x] := 128 + y + i * 2; - frame^.data[2][y * frame^.linesize[2] + x] := 64 + x + i * 5; - end; - - frame^.pts := i; - (* encode the image *) - ret := avcodec_encode_video2(c, @pkt, frame, got_output); - if (ret < 0) then - begin - WriteLn('Error encoding frame'); - Exit; - end; - if (got_output <> 0) then - begin - WriteLn(format('Write frame %3d (size=%5d)', [i, pkt.size])); - BlockWrite(f, pkt.data^, pkt.size); - av_free_packet(pkt); - end; - end; - (* get the delayed frames *) - got_output := 1; - While got_output <> 0 do - begin - ret := avcodec_encode_video2(c, @pkt, nil, got_output); - if (ret < 0) then - begin - WriteLn('Error encoding frame'); - Exit; - end; - if (got_output <> 0) then - begin - WriteLn(format('Write frame %3d (size=%5d)', [i, pkt.size])); - BlockWrite(f, pkt.data^, pkt.size); - av_free_packet(pkt); - end; - inc(i); - end; - (* add sequence end code to have a real mpeg file *) - BlockWrite(f, endcode, sizeof(endcode)); - Close(f); - // avcodec_close(c); - av_free(c); - // av_freep(frame^.data[0]); - av_frame_free(frame); -end; - -(* - * Video decoding example -*) -procedure pgm_save(buf: pByte; wrap, xsize, ysize: Integer; filename: String); -Var - f: TextFile; - fb: File; - i: Integer; -begin - AssignFile(f, filename); - Rewrite(f); - WriteLn(f, format('P5' + #13#10 + '%d %d' + #13#10 + '%d', [xsize, ysize, 255])); - Close(f); - AssignFile(fb, filename); - Reset(fb, 1); - Seek(fb, FileSize(fb)); - for i := 0 to ysize - 1 do - BlockWrite(fb, buf[i * wrap], xsize); - Close(fb); -end; - -function decode_write_frame(const outfilename: String; avctx: pAVCodecContext; frame: pAVFrame; - Var frame_count: Integer; pkt: pAVPacket; last: Integer): Integer; -Var - len, got_frame: Integer; - buf: array [0 .. 1023] of AnsiChar; - -begin - len := avcodec_decode_video2(avctx, frame, got_frame, pkt); - if (len < 0) then - begin - WriteLn('Error while decoding frame ', frame_count); - Exit(len); - end; - if (got_frame <> 0) then - begin - if last <> 0 then - WriteLn(format('Saving last frame %3d', [frame_count])) - else - WriteLn(format('Saving frame %3d', [frame_count])); - (* the picture is allocated by the decoder, no need to free it *) - pgm_save(frame^.data[0], frame^.linesize[0], avctx^.width, avctx^.height, format(outfilename, [frame_count])); - inc(frame_count); - end; - if Assigned(pkt^.data) then - begin - pkt^.size := pkt^.size - len; - pkt^.data := pkt^.data + len; - end; - Result := 0; -end; - -procedure video_decode_example(const outfilename: String; const filename: String); -Var - codec: pAVCodec; - c: pAVCodecContext; - frame_count: Integer; - f: File; - frame: pAVFrame; - inbuf: array [0 .. INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE - 1] of byte; - avpkt: TAVPacket; -begin - c := nil; - av_init_packet(@avpkt); - (* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) *) - FillChar(inbuf[INBUF_SIZE], FF_INPUT_BUFFER_PADDING_SIZE, 0); - WriteLn(format('Decode video file %s to %s', [filename, outfilename])); - (* find the mpeg1 video decoder *) - codec := avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO); - if not Assigned(codec) then - begin - WriteLn('Codec not found'); - Exit; - end; - c := avcodec_alloc_context3(codec); - if not Assigned(c) then - begin - WriteLn('Could not allocate video codec context'); - Exit; - end; - if (codec^.capabilities and CODEC_CAP_TRUNCATED) <> 0 then - c^.flags := c^.flags or CODEC_FLAG_TRUNCATED; (* we do not send complete frames *) - (* For some codecs, such as msmpeg4 and mpeg4, width and height - MUST be initialized there because this information is not - available in the bitstream. *) - (* open it *) - if (avcodec_open2(c, codec, nil) < 0) then - begin - WriteLn('Could not open codec'); - Exit; - end; - AssignFile(f, filename); - try - Reset(f, 1); - except - WriteLn('Could not open ', filename); - Exit; - end; - frame := av_frame_alloc(); - if not Assigned(frame) then - begin - WriteLn('Could not allocate video frame'); - Exit; - end; - frame_count := 0; - While True do - begin - BlockRead(f, inbuf, INBUF_SIZE, avpkt.size); - if (avpkt.size = 0) then - break; - (* NOTE1: some codecs are stream based (mpegvideo, mpegaudio) - and this is the only method to use them because you cannot - know the compressed data size before analysing it. - BUT some other codecs (msmpeg4, mpeg4) are inherently frame - based, so you must call them with all the data for one - frame exactly. You must also initialize 'width' and - 'height' before initializing them. *) - (* NOTE2: some codecs allow the raw parameters (frame size, - sample rate) to be changed at any frame. We handle this, so - you should also take care of it *) - (* here, we use a stream based decoder (mpeg1video), so we - feed decoder and see if it could decode a frame *) - avpkt.data := @inbuf; - while (avpkt.size > 0) do - if (decode_write_frame(outfilename, c, frame, frame_count, @avpkt, 0) < 0) then - Exit; - end; - (* some codecs, such as MPEG, transmit the I and P frame with a - latency of one frame. You must do the following to have a - chance to get the last frame of the video *) - avpkt.data := nil; - avpkt.size := 0; - decode_write_frame(outfilename, c, frame, frame_count, @avpkt, 1); - Close(f); - avcodec_close(c); - av_free(c); - av_frame_free(frame); -end; - -procedure avlog(ptr: Pointer; level: Integer; fmt: PAnsiChar; vl: pva_list); cdecl; -Var - line: array [0 .. 1023] of AnsiChar; - print_prefix: Integer; - A:AnsiString; -begin - print_prefix := 1; - av_log_format_line(ptr, level, fmt, vl, @line, sizeof(line), print_prefix); - A:=Trim(AnsiString(line)); - Writeln(A); -end; - -Var - output_type: String; - -begin - try - av_log_set_callback(avlog); - (* register all the codecs *) - avcodec_register_all(); - if ParamCount = 0 then - begin - WriteLn('usage: ' + ExtractFileName(ParamStr(0)) + ' output_type' + #13#10 + - 'API example program to decode/encode a media stream with libavcodec.' + #13#10 + - 'This program generates a synthetic stream and encodes it to a file' + #13#10 + - 'named test.h264, test.mp2 or test.mpg depending on output_type.' + #13#10 + - 'The encoded stream is then decoded and written to a raw data output.' + #13#10 + - 'output_type must be chosen between "h264", "mp2", "mpg"'); - Halt; - end; - output_type := ParamStr(1); - if (SameText(output_type, 'h264')) then - video_encode_example('test.h264', AV_CODEC_ID_H264) - else if (SameText(output_type, 'mp2')) then - begin - audio_encode_example('test.mp2'); - audio_decode_example('test.sw', 'test.mp2'); - end - else if (SameText(output_type, 'mpg')) then - begin - video_encode_example('test.mpg', AV_CODEC_ID_MPEG1VIDEO); - video_decode_example('test%02d.pgm', 'test.mpg'); - end - else - begin - WriteLn(format('Invalid output type "%s", choose between "h264", "mp2", or "mpg"', [output_type])); - Halt; - end; - except - on E: Exception do - WriteLn(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/decoding_encoding/decoding_encoding.dproj b/samples/FFMpeg/decoding_encoding/decoding_encoding.dproj deleted file mode 100644 index 9fcd2b1..0000000 --- a/samples/FFMpeg/decoding_encoding/decoding_encoding.dproj +++ /dev/null @@ -1,122 +0,0 @@ - - - {CE0FA7DD-82F4-40E1-868E-89238AA4468B} - decoding_encoding.dpr - True - Debug - 1 - Console - None - 15.4 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - ..\..\..\bin\$(Platform) - None - .\$(Platform)\$(Config) - decoding_encoding - false - 1049 - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - false - false - 00400000 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - false - - - 1033 - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - 0 - RELEASE;$(DCC_Define) - 0 - false - - - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - DEBUG;$(DCC_Define) - false - true - - - h264 - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - decoding_encoding.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - True - False - - - 12 - - - - diff --git a/samples/FFMpeg/decoding_encoding/decoding_encoding.res b/samples/FFMpeg/decoding_encoding/decoding_encoding.res deleted file mode 100644 index 743599575b02e97248bade49ed2e3eabafe25a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& diff --git a/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dpr b/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dpr deleted file mode 100644 index 6dcace5..0000000 --- a/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dpr +++ /dev/null @@ -1,14 +0,0 @@ -program ffm_SDL2_VCL_player; - -uses - Vcl.Forms, - uMainForm in 'uMainForm.pas' {MainForm}; - -{$R *.res} - -begin - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TMainForm, MainForm); - Application.Run; -end. diff --git a/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dproj b/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dproj deleted file mode 100644 index 7eaf1c4..0000000 --- a/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.dproj +++ /dev/null @@ -1,138 +0,0 @@ - - - {400A9D75-6BD4-4E27-A2F0-25E5DB6EBC97} - 18.2 - VCL - ffm_SDL2_VCL_player.dpr - True - Debug - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - 1049 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - ffm_SDL2_VCL_player - $(BDS)\bin\default_app.manifest - .\$(Platform)\$(Config) - ..\..\..\bin\$(Platform) - false - false - false - false - false - - - $(BDS)\bin\default_app.manifest - dxSkinOffice2007BlackRS19;JvGlobus;JvMM;JvManagedThreads;dxSkinLiquidSkyRS19;cxBarEditItemRS19;OverbyteIcsDXE5Run;FireDACPgDriver;dxWizardControlRS19;JvCrypt;dxPScxCommonRS19;dxThemeRS19;tmswizdXE5;XiButtonXE4;cxGridRS19;dxPScxExtCommonRS19;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;JvNet;cxSchedulerRS19;JvDotNetCtrls;DbxCommonDriver;vclimg;dbxcds;dxFlowChartRS19;DatasnapConnectorsFreePascal;JvXPCtrls;dxdbtrRS19;dxSkinSpringTimeRS19;vcldb;dxdborRS19;dxDockingRS19;dxSkinsdxDLPainterRS19;cxSpreadSheetRS19;dxtrmdRS19;dxSpellCheckerRS19;CustomIPTransport;dxTileControlRS19;dsnap;IndyIPServer;dxPSCoreRS19;dxSkinFoggyRS19;IndyCore;cxSchedulerGridRS19;cxPivotGridOLAPRS19;dxSkinStardustRS19;CloudService;FmxTeeUI;FireDACIBDriver;dxSkinXmas2008BlueRS19;JvDB;JvRuntimeDesign;dxSkinValentineRS19;dsnapxml;dxPScxSchedulerLnkRS19;JclDeveloperTools;FireDACDb2Driver;dxSkinDarkSideRS19;dxSkinLondonLiquidSkyRS19;dxBarExtDBItemsRS19;dxTabbedMDIRS19;OpenCV200;dxSkinOffice2013WhiteRS19;dxSkinSharpRS19;bindcompfmx;dxSkinBlueprintRS19;dxSkinOffice2007PinkRS19;vcldbx;cxExportRS19;FireDACODBCDriver;RESTBackendComponents;dxSkinCoffeeRS19;dbrtl;FireDACCommon;bindcomp;inetdb;JvPluginSystem;dxSkinBlueRS19;dxServerModeRS19;DBXOdbcDriver;JvCmp;vclFireDAC;dxSkinMoneyTwinsRS19;JvTimeFramework;xmlrtl;cxPivotGridChartRS19;ibxpress;dxSkiniMaginaryRS19;dxSkinOffice2007GreenRS19;FireDACCommonDriver;bindengine;vclactnband;soaprtl;FMXTee;dxRibbonRS19;bindcompvcl;dxADOServerModeRS19;Jcl;vclie;dxPSdxLCLnkRS19;dxSkinBlackRS19;dxSkinOffice2010BlackRS19;dxSkinSevenClassicRS19;FireDACMSSQLDriver;DBXInformixDriver;Intraweb;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxSkinscxSchedulerPainterRS19;inet;dxPSdxFCLnkRS19;dxSkinsdxNavBarPainterRS19;JvPascalInterpreter;FireDACMySQLDriver;soapmidas;vclx;dxPSPrVwRibbonRS19;dxPSDBTeeChartRS19;DBXSybaseASADriver;RESTComponents;dxSkinLilianRS19;dxSkinscxPCPainterRS19;dbexpress;JvBDE;IndyIPClient;dxSkinSharpPlusRS19;cxSchedulerTreeBrowserRS19;dxPScxSSLnkRS19;dxPScxPivotGridLnkRS19;tmsdXE5;FireDACSqliteDriver;FireDACDSDriver;ZComponent;DBXSqliteDriver;dxPSdxDBTVLnkRS19;dxSkinOffice2007BlueRS19;cxDataRS19;cxLibraryRS19;fmx;JvDlgs;IndySystem;TeeDB;tethering;dxPsPrVwAdvRS19;dxSkinHighContrastRS19;inetdbbde;vclib;DataSnapClient;DataSnapProviderClient;DBXSybaseASEDriver;dxmdsRS19;dxSkinOffice2010SilverRS19;dxSkinsdxBarPainterRS19;MetropolisUILiveTile;dxPSdxOCLnkRS19;vcldsnap;fmxFireDAC;DBXDb2Driver;dxSkinDevExpressDarkStyleRS19;DBXOracleDriver;dxBarDBNavRS19;JvCore;vclribbon;dxSkinSilverRS19;dxSkinVS2010RS19;fmxase;vcl;dxPSdxDBOCLnkRS19;DBXMSSQLDriver;IndyIPCommon;CodeSiteExpressPkg;cxTreeListdxBarPopupMenuRS19;dxBarRS19;DataSnapFireDAC;FireDACDBXDriver;JvAppFrm;soapserver;dxFireDACServerModeRS19;inetdbxpress;pkgAdobe;cxEditorsRS19;dxSkinMcSkinRS19;FireDACInfxDriver;JvDocking;adortl;dxSkinOffice2007SilverRS19;JvWizards;FireDACASADriver;dxSkinSevenRS19;JvHMI;dxDBXServerModeRS19;dxLayoutControlRS19;dxPSTeeChartRS19;dxSkinWhiteprintRS19;JvBands;cxPageControlRS19;ZDbc;rtl;dcldxSkinsCoreRS19;DbxClientDriver;dxPScxGridLnkRS19;ZPlain;Tee;JclContainers;cxVerticalGridRS19;cxPageControldxBarPopupMenuRS19;CPortLibDXE;JvSystem;DataSnapNativeClient;svnui;dxSkinsdxRibbonPainterRS19;JvControls;cxPivotGridRS19;dxComnRS19;IndyProtocols;DBXMySQLDriver;dxSkinSummer2008RS19;dxSkinTheAsphaltWorldRS19;viTimeLineDPK;dxPSLnksRS19;tmsxlsdXE5;bindcompdbx;TeeUI;JvJans;JvPrintPreview;JvPageComps;dxSkinDarkRoomRS19;JvStdCtrls;JvCustom;dxSkinPumpkinRS19;dxBarExtItemsRS19;FireDACADSDriver;vcltouch;dxNavBarRS19;ZCore;VclSmp;FireDAC;VCLRESTComponents;dxGDIPlusRS19;DataSnapConnectors;dxCoreRS19;dxPScxVGridLnkRS19;dxPScxTLLnkRS19;dxSkinsCoreRS19;fmxobj;dxSkinGlassOceansRS19;JclVcl;ZParseSql;dxPScxPCProdRS19;svn;dxSkinOffice2010BlueRS19;tmsexdXE5;FireDACOracleDriver;fmxdae;dxorgcRS19;bdertl;cxTreeListRS19;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkinDevExpressStyleRS19;dxSkinCaramelRS19;$(DCC_UsePackage) - true - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - 1033 - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - dxSkinOffice2007BlackRS19;dxSkinLiquidSkyRS19;cxBarEditItemRS19;OverbyteIcsDXE5Run;FireDACPgDriver;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;cxSchedulerRS19;DbxCommonDriver;vclimg;dbxcds;dxFlowChartRS19;DatasnapConnectorsFreePascal;dxdbtrRS19;dxSkinSpringTimeRS19;vcldb;dxdborRS19;dxDockingRS19;dxSkinsdxDLPainterRS19;cxSpreadSheetRS19;dxtrmdRS19;dxSpellCheckerRS19;CustomIPTransport;dxTileControlRS19;dsnap;IndyIPServer;dxSkinFoggyRS19;IndyCore;cxSchedulerGridRS19;cxPivotGridOLAPRS19;dxSkinStardustRS19;CloudService;FmxTeeUI;FireDACIBDriver;dxSkinXmas2008BlueRS19;dxSkinValentineRS19;dsnapxml;dxPScxSchedulerLnkRS19;FireDACDb2Driver;dxSkinDarkSideRS19;dxSkinLondonLiquidSkyRS19;dxBarExtDBItemsRS19;dxTabbedMDIRS19;OpenCV200;dxSkinOffice2013WhiteRS19;dxSkinSharpRS19;bindcompfmx;dxSkinBlueprintRS19;dxSkinOffice2007PinkRS19;cxExportRS19;FireDACODBCDriver;RESTBackendComponents;dxSkinCoffeeRS19;dbrtl;FireDACCommon;bindcomp;inetdb;dxSkinBlueRS19;dxServerModeRS19;DBXOdbcDriver;vclFireDAC;dxSkinMoneyTwinsRS19;xmlrtl;cxPivotGridChartRS19;ibxpress;dxSkiniMaginaryRS19;dxSkinOffice2007GreenRS19;FireDACCommonDriver;bindengine;vclactnband;soaprtl;FMXTee;bindcompvcl;dxADOServerModeRS19;vclie;dxSkinBlackRS19;dxSkinOffice2010BlackRS19;dxSkinSevenClassicRS19;FireDACMSSQLDriver;DBXInformixDriver;Intraweb;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxSkinscxSchedulerPainterRS19;inet;dxPSdxFCLnkRS19;dxSkinsdxNavBarPainterRS19;FireDACMySQLDriver;soapmidas;vclx;dxPSPrVwRibbonRS19;DBXSybaseASADriver;RESTComponents;dxSkinLilianRS19;dxSkinscxPCPainterRS19;dbexpress;IndyIPClient;dxSkinSharpPlusRS19;cxSchedulerTreeBrowserRS19;dxPScxSSLnkRS19;dxPScxPivotGridLnkRS19;tmsdXE5;FireDACSqliteDriver;FireDACDSDriver;ZComponent;DBXSqliteDriver;dxPSdxDBTVLnkRS19;dxSkinOffice2007BlueRS19;cxDataRS19;fmx;IndySystem;TeeDB;tethering;dxPsPrVwAdvRS19;dxSkinHighContrastRS19;vclib;DataSnapClient;DataSnapProviderClient;DBXSybaseASEDriver;dxmdsRS19;dxSkinOffice2010SilverRS19;dxSkinsdxBarPainterRS19;MetropolisUILiveTile;dxPSdxOCLnkRS19;vcldsnap;fmxFireDAC;DBXDb2Driver;dxSkinDevExpressDarkStyleRS19;DBXOracleDriver;dxBarDBNavRS19;vclribbon;dxSkinSilverRS19;dxSkinVS2010RS19;fmxase;vcl;DBXMSSQLDriver;IndyIPCommon;cxTreeListdxBarPopupMenuRS19;dxBarRS19;DataSnapFireDAC;FireDACDBXDriver;soapserver;dxFireDACServerModeRS19;inetdbxpress;cxEditorsRS19;dxSkinMcSkinRS19;FireDACInfxDriver;adortl;dxSkinOffice2007SilverRS19;FireDACASADriver;dxSkinSevenRS19;dxDBXServerModeRS19;dxLayoutControlRS19;dxSkinWhiteprintRS19;ZDbc;rtl;dcldxSkinsCoreRS19;DbxClientDriver;ZPlain;Tee;cxVerticalGridRS19;cxPageControldxBarPopupMenuRS19;DataSnapNativeClient;dxSkinsdxRibbonPainterRS19;cxPivotGridRS19;dxComnRS19;IndyProtocols;DBXMySQLDriver;dxSkinSummer2008RS19;dxSkinTheAsphaltWorldRS19;tmsxlsdXE5;bindcompdbx;TeeUI;dxSkinDarkRoomRS19;dxSkinPumpkinRS19;dxBarExtItemsRS19;FireDACADSDriver;vcltouch;ZCore;VclSmp;FireDAC;VCLRESTComponents;dxGDIPlusRS19;DataSnapConnectors;dxPScxVGridLnkRS19;dxPScxTLLnkRS19;dxSkinsCoreRS19;fmxobj;dxSkinGlassOceansRS19;ZParseSql;dxPScxPCProdRS19;dxSkinOffice2010BlueRS19;tmsexdXE5;FireDACOracleDriver;fmxdae;cxTreeListRS19;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkinDevExpressStyleRS19;dxSkinCaramelRS19;$(DCC_UsePackage) - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - true - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=31.07.2014 3:17:54;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - false - Debug - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - -

MainForm - dfm - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - ffm_SDL2_VCL_player.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - True - False - - - 12 - - - - - diff --git a/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.res b/samples/FFMpeg/ffm_SDL2_VCL_player/ffm_SDL2_VCL_player.res deleted file mode 100644 index 0856338f6ae52d5c0d38f4c98529dd194f415211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59276 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 ?DJJg2FkT(4+OBOe<>>3 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 z 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 diff --git a/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.dfm b/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.dfm deleted file mode 100644 index 13470f4..0000000 --- a/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.dfm +++ /dev/null @@ -1,20 +0,0 @@ -object MainForm: TMainForm - Left = 0 - Top = 0 - Caption = 'MainForm' - ClientHeight = 437 - ClientWidth = 589 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - OldCreateOrder = False - OnActivate = FormActivate - OnCreate = FormCreate - OnDestroy = FormDestroy - OnResize = FormResize - PixelsPerInch = 96 - TextHeight = 13 -end diff --git a/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.pas b/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.pas deleted file mode 100644 index d4ecefe..0000000 --- a/samples/FFMpeg/ffm_SDL2_VCL_player/uMainForm.pas +++ /dev/null @@ -1,175 +0,0 @@ -unit uMainForm; - -interface - -uses - Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls; - -Const - WM_PLAYVIDEO = WM_USER + 100; - -type - TMainForm = class(TForm) - procedure FormCreate(Sender: TObject); - procedure FormActivate(Sender: TObject); - procedure FormResize(Sender: TObject); - procedure FormDestroy(Sender: TObject); - private - procedure WMPlayVideo(var Message: TMessage); message WM_PLAYVIDEO; - procedure Decode; - public - end; - -var - MainForm: TMainForm; - -implementation - -{$R *.dfm} - -Uses - SDL2, - ffm.avformat, - ffm.avutil, - ffm.frame, - ffm.swscale, - ffm.libavcodec.avcodec, - uResourcePaths; - -const - std_filename = cResourceMedia + 'trailer.avi'; - pixel_format = SDL_PIXELFORMAT_YV12; - -Var - sdlWnd: PSDL_Window; - renderer: PSDL_Renderer; - MooseTexture: pSDL_Texture; - - format_context: pAVFormatContext = nil; - video_stream: Integer; - codec_context: pAVCodecContext; - img_convert_context: pSwsContext; - codec: pAVCodec; - pFrame, frame: pAVFrame; - packet: TAVPacket; - frame_finished: Integer; - ImgBufferSize: Integer; - ImgBuffer: PByte; - pict: TAVPicture; - -procedure TMainForm.FormActivate(Sender: TObject); -begin - PostMessage(Handle, WM_PLAYVIDEO, 0, 0); -end; - -procedure TMainForm.FormCreate(Sender: TObject); -Var - err: Integer; -begin - if (SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) < 0) then - FatalAppExit(0, PChar('Couldn''t initialize SDL: ' + SDL_GetError())); - // SDL_InitSubSystem(SDL_INIT_VIDEO); - sdlWnd := SDL_CreateWindowFrom(Pointer(Handle)); - renderer := SDL_CreateRenderer(sdlWnd, -1, SDL_RENDERER_ACCELERATED or SDL_RENDERER_PRESENTVSYNC); - if not Assigned(renderer) then - FatalAppExit(0, PChar('SDL_CreateRenderer Error: ' + SDL_GetError())); - - // Register all available file formats and codecs - av_register_all(); - avformat_network_init(); - // Open video file - Assert(avformat_open_input(format_context, std_filename, nil, nil) >= 0); - // Retrieve stream information - Assert(avformat_find_stream_info(format_context, nil) >= 0); - // Dump information about file onto standard error - av_dump_format(format_context, 0, std_filename, 0); - // Find the first video stream - for video_stream := 0 to format_context^.nb_streams - 1 do - if (format_context^.streams[video_stream]^.codec^.codec_type = AVMEDIA_TYPE_VIDEO) then - break; - Assert(video_stream < format_context^.nb_streams); - codec_context := format_context^.streams[video_stream]^.codec; - codec := avcodec_find_decoder(codec_context^.codec_id); - Assert(avcodec_open2(codec_context, codec, nil) >= 0); - - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Set default colour to black. - Assert(SDL_RenderClear(renderer) >= 0); - - MooseTexture := SDL_CreateTexture(renderer, pixel_format, Integer(SDL_TEXTUREACCESS_STREAMING), codec_context^.width, - codec_context^.height); - Assert(Assigned(MooseTexture)); - - img_convert_context := sws_getCachedContext(nil, codec_context^.width, codec_context^.height, codec_context^.pix_fmt, - codec_context^.width, codec_context^.height, codec_context^.pix_fmt, SWS_BICUBIC, nil, nil, nil); - Assert(Assigned(img_convert_context)); - - pFrame := av_frame_alloc();//avcodec_alloc_frame(); - - frame := av_frame_alloc();;//avcodec_alloc_frame(); - ImgBufferSize := avpicture_get_size(codec_context^.pix_fmt, codec_context^.width, codec_context^.height); - ImgBuffer := AllocMem(ImgBufferSize); - avpicture_fill(pAVPicture(frame), ImgBuffer, codec_context^.pix_fmt, codec_context^.width, codec_context^.height); -end; - -procedure TMainForm.FormDestroy(Sender: TObject); -begin - { TODO: destroy ffmpeg objects } - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(sdlWnd); - SDL_Quit(); -end; - -procedure TMainForm.FormResize(Sender: TObject); -begin - SDL_RenderSetViewport(renderer, nil); -end; - -procedure TMainForm.WMPlayVideo(var Message: TMessage); -begin - Decode; -end; - -procedure TMainForm.Decode; -begin - frame_finished := 1; - repeat - if av_read_frame(format_context, packet) >= 0 then - begin - if (packet.stream_index = video_stream) then - begin - // Video stream packet - avcodec_decode_video2(codec_context, pFrame, frame_finished, @packet); - - if (frame_finished <> 0) then - begin - pict.data[0] := frame^.data[0]; - pict.data[1] := frame^.data[2]; - pict.data[2] := frame^.data[1]; - - pict.linesize[0] := frame^.linesize[0]; - pict.linesize[1] := frame^.linesize[2]; - pict.linesize[2] := frame^.linesize[1]; - - sws_scale(img_convert_context, @pFrame^.data, @pFrame^.linesize, 0, codec_context^.height, @pict.data, - @pict.linesize); - - SDL_UpdateTexture(MooseTexture, nil, ImgBuffer, codec_context^.width * SDL_BYTESPERPIXEL(pixel_format)); - - SDL_RenderClear(renderer); - - SDL_RenderCopy(renderer, MooseTexture, nil, nil); - SDL_RenderPresent(renderer); - - av_frame_unref(pFrame); -// avcodec_get_frame_defaults(pFrame); - end; - end; - av_free_packet(packet); - end; - Application.ProcessMessages; - until frame_finished <> 0; - PostMessage(Handle, WM_PLAYVIDEO, 0, 0); -end; - -end. diff --git a/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dpr b/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dpr deleted file mode 100644 index f1fab85..0000000 --- a/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dpr +++ /dev/null @@ -1,196 +0,0 @@ -program ffmpeg_sample_player; - -{ .$APPTYPE CONSOLE } -{$R *.res} -{$i ffmpeg.inc} - -uses - Winapi.Windows, - System.SysUtils, - System.Classes, - SDL, - ffm.lib, - ffm.ctypes, - ffm.avformat, - ffm.avio, - ffm.avutil, - ffm.buffer, - ffm.dict, - ffm.frame, - ffm.log, - ffm.opt, - ffm.pixfmt, - ffm.rational, - ffm.samplefmt, - ffm.parseutils, - ffm.swscale, - ffm.pixdesc, - ffm.imgutils, - ffm.mem, - ffm.error, - ffm.avfilter, - ffm.buffersink, - ffm.mathematics, - ffm.libavcodec.avcodec, - ffm.buffersrc, - ffm.errno, - uResourcePaths; - -var - err: Integer; - filename: AnsiString; - format_context: pAVFormatContext = nil; - video_stream: Integer; - codec_context: pAVCodecContext; - codec: pAVCodec; - screen: pSDL_Surface; - bmp: pSDL_Overlay; - img_convert_context: pSwsContext; - frame: pAVFrame; - packet: TAVPacket; - frame_finished: Integer; - pict: TAVPicture; - rect: TSDL_Rect; - event: TSDL_Event; - -const - std_filename = cResourceMedia + 'trailer.avi'; - -begin - try - if (ParamCount < 1) then - filename := std_filename - else - filename := ParamStr(1); - - // Register all available file formats and codecs - av_register_all(); - avformat_network_init(); - - // Init SDL with video support - err := SDL_Init(SDL_INIT_VIDEO); - if (err < 0) then - begin - WriteLn(Format('Unable to init SDL: %s', [SDL_GetError()])); - Halt(1); - end; - - // Open video file - err := avformat_open_input(format_context, PAnsiChar(filename), nil, nil); - if (err < 0) then - begin - WriteLn('ffmpeg: Unable to open input file'); - Halt(1); - end; - - // Retrieve stream information - err := avformat_find_stream_info(format_context, nil); - if (err < 0) then - begin - WriteLn('ffmpeg: Unable to find stream info'); - Halt(1); - end; - - // Dump information about file onto standard error - av_dump_format(format_context, 0, PAnsiChar(filename), 0); - - // Find the first video stream - for video_stream := 0 to format_context^.nb_streams - 1 do - if (format_context^.streams[video_stream]^.codec^.codec_type = AVMEDIA_TYPE_VIDEO) then - break; - if (video_stream = format_context^.nb_streams) then - begin - WriteLn('ffmpeg: Unable to find video stream'); - Halt(1); - end; - - codec_context := format_context^.streams[video_stream]^.codec; - codec := avcodec_find_decoder(codec_context^.codec_id); - err := avcodec_open2(codec_context, codec, nil); - if (err < 0) then - begin - WriteLn('ffmpeg: Unable to open codec'); - Halt(1); - end; - - screen := SDL_SetVideoMode(codec_context^.width, codec_context^.height, 0, 0 { SDL_FULLSCREEN } ); - if (screen = nil) then - begin - WriteLn('Couldn''t set video mode'); - Halt(1); - end; - - bmp := SDL_CreateYUVOverlay(codec_context^.width, codec_context^.height, SDL_YV12_OVERLAY, screen); - - img_convert_context := sws_getCachedContext(nil, codec_context^.width, codec_context^.height, codec_context^.pix_fmt, codec_context^.width, codec_context^.height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, - nil, nil, nil); - if (img_convert_context = nil) then - begin - WriteLn('Cannot initialize the conversion context'); - Halt(1); - end; - - frame := av_frame_alloc();//avcodec_alloc_frame(); - while (av_read_frame(format_context, packet) >= 0) do - begin - if (packet.stream_index = video_stream) then - begin - // Video stream packet - avcodec_decode_video2(codec_context, frame, frame_finished, @packet); - - if (frame_finished <> 0) then - begin - SDL_LockYUVOverlay(bmp); - - // Convert frame to YV12 pixel format for display in SDL overlay - pByte(pict.data[0]) := pByte(bmp^.pixels[0]); - pByte(pict.data[1]) := pByte(bmp^.pixels[2]); // it's because YV12 - pByte(pict.data[2]) := pByte(bmp^.pixels[1]); - - pict.linesize[0] := bmp^.pitches[0]; - pict.linesize[1] := bmp^.pitches[2]; - pict.linesize[2] := bmp^.pitches[1]; - - sws_scale(img_convert_context, @frame^.data, @frame^.linesize, 0, codec_context^.height, @pict.data, @pict.linesize); - - SDL_UnlockYUVOverlay(bmp); - - rect.x := 0; - rect.y := 0; - rect.w := codec_context^.width; - rect.h := codec_context^.height; - SDL_DisplayYUVOverlay(bmp, @rect); - end; - end; - - // Free the packet that was allocated by av_read_frame - av_free_packet(packet); - - // Handling SDL events there - if SDL_PollEvent(@event) <> 0 then - if (event.type_ = SDL_QUITEV) then - break; - end; - - sws_freeContext(img_convert_context); - - // Free the YUV frame - av_free(frame); - - // Close the codec - avcodec_close(codec_context); - - // Close the video file - avformat_close_input(&format_context); - - avformat_network_deinit; - - // Quit SDL - SDL_QUIT(); - - except - on E: Exception do - WriteLn(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dproj b/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dproj deleted file mode 100644 index 717ad02..0000000 --- a/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.dproj +++ /dev/null @@ -1,254 +0,0 @@ - - - {036F28BC-83B0-471A-B04B-5E5296551153} - ffmpeg_sample_player.dpr - True - Release - 1 - Console - None - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - ..\..\..\bin\$(Platform) - .\$(Platform)\$(Config) - None - false - 1049 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - false - 00400000 - false - false - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - ffmpeg_sample_player - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - 1033 - - - true - DEBUG;$(DCC_Define) - false - - - true - - - true - - - true - - - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - ffmpeg_sample_player.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - False - False - True - False - - - 12 - - - - diff --git a/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.res b/samples/FFMpeg/ffmpeg_sample_player/ffmpeg_sample_player.res deleted file mode 100644 index 6876088a6648ed90b09c480197508e4404c57dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57140 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 I2>8kW0h0=QvH$=8 diff --git a/samples/FFMpeg/filtering_video/filtering_video.dpr b/samples/FFMpeg/filtering_video/filtering_video.dpr deleted file mode 100644 index 4c5ba85..0000000 --- a/samples/FFMpeg/filtering_video/filtering_video.dpr +++ /dev/null @@ -1,304 +0,0 @@ -program filtering_video; - -{$APPTYPE CONSOLE} -{$R *.res} -{$i ffmpeg.inc} - -uses - Winapi.Windows, - System.SysUtils, - ffm.lib, - ffm.ctypes, - ffm.avformat, - ffm.avio, - ffm.avutil, - ffm.buffer, - ffm.dict, - ffm.frame, - ffm.log, - ffm.opt, - ffm.pixfmt, - ffm.rational, - ffm.samplefmt, - ffm.parseutils, - ffm.swscale, - ffm.pixdesc, - ffm.imgutils, - ffm.mem, - ffm.error, - ffm.avfilter, - ffm.buffersink, - ffm.mathematics, - ffm.libavcodec.avcodec, - ffm.buffersrc, - ffm.errno, - uResourcePaths; - -const - _XOPEN_SOURCE = 600; (* for usleep *) - std_filename = cResourceMedia + 'trailer.avi'; - -Var - filter_descr: pAnsiChar = 'scale=78:24'; - fmt_ctx: pAVFormatContext = nil; - dec_ctx: pAVCodecContext = nil; - buffersink_ctx: pAVFilterContext = nil; - buffersrc_ctx: pAVFilterContext = nil; - filter_graph: pAVFilterGraph = nil; - video_stream_index: Integer = -1; - last_pts: int64_t = AV_NOPTS_VALUE; - -function open_input_file(const filename: pAnsiChar): Integer; -Var - ret: Integer; - dec: pAVCodec; -begin - ret := avformat_open_input(fmt_ctx, filename, nil, nil); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot open input file\n'); - Exit(ret); - end; - - ret := avformat_find_stream_info(fmt_ctx, nil); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot find stream information\n'); - Exit(ret); - end; - - (* select the video stream *) - ret := av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, dec, 0); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot find a video stream in the input file\n'); - Exit(ret); - end; - video_stream_index := ret; - dec_ctx := fmt_ctx^.streams[video_stream_index]^.codec; - - (* init the video decoder *) - ret := avcodec_open2(dec_ctx, dec, nil); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot open video decoder\n'); - Exit(ret); - end; - - Result := 0; -end; - -function init_filters(const filters_descr: pAnsiChar): Integer; -Var - args: AnsiString; - ret: Integer; - buffersrc: pAVFilter; - buffersink: pAVFilter; - outputs: pAVFilterInOut; - inputs: pAVFilterInOut; - pix_fmts: array [0 .. 1] of TAVPixelFormat; - buffersink_params: pAVBufferSinkParams; -begin - buffersrc := avfilter_get_by_name('buffer'); - buffersink := avfilter_get_by_name('buffersink'); - outputs := avfilter_inout_alloc(); - inputs := avfilter_inout_alloc(); - pix_fmts[0] := AV_PIX_FMT_GRAY8; - pix_fmts[1] := AV_PIX_FMT_NONE; - - filter_graph := avfilter_graph_alloc(); - - (* buffer video source: the decoded frames from the decoder will be inserted here. *) - args := Format('video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d', [ // - dec_ctx^.width, // - dec_ctx^.height, // - Integer(dec_ctx^.pix_fmt), // - dec_ctx^.time_base.num, // - dec_ctx^.time_base.den, // - dec_ctx^.sample_aspect_ratio.num, // - dec_ctx^.sample_aspect_ratio.den // - ]); - - ret := avfilter_graph_create_filter(buffersrc_ctx, buffersrc, 'in', pAnsiChar(args), nil, filter_graph); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot create buffer source\n'); - Exit(ret); - end; - - (* buffer video sink: to terminate the filter chain. *) - buffersink_params := av_buffersink_params_alloc(); - buffersink_params^.pixel_fmts := @pix_fmts; - ret := avfilter_graph_create_filter(buffersink_ctx, buffersink, 'out', nil, buffersink_params, filter_graph); - av_free(buffersink_params); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Cannot create buffer sink\n'); - Exit(ret); - end; - - (* Endpoints for the filter graph. *) - outputs^.name := av_strdup('in'); - outputs^.filter_ctx := buffersrc_ctx; - outputs^.pad_idx := 0; - outputs^.next := nil; - - inputs^.name := av_strdup('out'); - inputs^.filter_ctx := buffersink_ctx; - inputs^.pad_idx := 0; - inputs^.next := nil; - - ret := avfilter_graph_parse_ptr(filter_graph, filters_descr, inputs, outputs, nil); - if (ret < 0) then - Exit(ret); - - ret := avfilter_graph_config(filter_graph, nil); - if (ret < 0) then - Exit(ret); - Result := 0; -end; - -procedure display_frame(const vframe: pAVFrame; time_base: TAVRational); -Const - ds: array[0..4] of char = ' .-+#'; -Var - x, y: Integer; - p0, p: pByte; - delay: int64; - hConsole:THandle; - coordScreen:TCOORD; -begin - if (vframe^.pts <> AV_NOPTS_VALUE) then - begin - if (last_pts <> AV_NOPTS_VALUE) then - begin - (* sleep roughly the right amount of time; - * usleep is in microseconds, just like AV_TIME_BASE. *) - delay := av_rescale_q(vframe^.pts - last_pts, time_base, AV_TIME_BASE_Q); - if (delay > 0) and (delay < 1000000) then - sleep(delay); - end; - last_pts := vframe^.pts; - end; - - (* Trivial ASCII grayscale display. *) - p0 := vframe^.data[0]; -// Write(#33); - hConsole := GetStdHandle(STD_OUTPUT_HANDLE); - FillChar(coordScreen,SizeOf(coordScreen),0); - SetConsoleCursorPosition(hConsole, coordScreen); - for y := 0 to vframe^.height - 1 do - begin - p := p0; - for x := 0 to vframe^.width - 1 do - begin - Write(ds[p^ div 52]); - Inc(p); - end; - Writeln; - p0 := p0 + vframe^.linesize[0]; - end; -end; - -Var - ret: Integer; - packet: TAVPacket; - vframe: pAVFrame = nil; - filt_frame: pAVFrame = nil; - got_frame: Integer; - filename: AnsiString; - buf: array [0 .. 1023] of ansichar; - -begin - try - vframe := av_frame_alloc(); - filt_frame := av_frame_alloc(); - - if (not Assigned(vframe)) or (not Assigned(filt_frame)) then - begin - Writeln('Could not allocate frame'); - Halt(1); - end; - if (ParamCount < 1) then - filename := std_filename - else - filename := ParamStr(1); - - avcodec_register_all(); - av_register_all(); - avfilter_register_all(); - avformat_network_init; - try - ret := open_input_file(pAnsiChar(filename)); - if (ret < 0) then - Halt(1); - ret := init_filters(pAnsiChar(filter_descr)); - if (ret < 0) then - Halt(1); - - (* read all packets *) - while True do - begin - ret := av_read_frame(fmt_ctx, packet); - if (ret < 0) then - break; - - if (packet.stream_index = video_stream_index) then - begin -// avcodec_get_frame_defaults(vframe); - got_frame := 0; - ret := avcodec_decode_video2(dec_ctx, vframe, got_frame, @packet); - if (ret < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Error decoding video'); - break; - end; - - if got_frame <> 0 then - begin - vframe^.pts := av_frame_get_best_effort_timestamp(vframe); - - (* push the decoded frame into the filtergraph *) - if (av_buffersrc_add_frame_flags(buffersrc_ctx, vframe, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) then - begin - // av_log(nil, AV_LOG_ERROR, 'Error while feeding the filtergraph\n'); - break; - end; - - (* pull filtered frames from the filtergraph *) - while True do - begin - ret := av_buffersink_get_frame(buffersink_ctx, filt_frame); - if (ret = AVERROR(EAGAIN)) or (ret = AVERROR_EOF) then - break; - if (ret < 0) then - Halt(1); - display_frame(filt_frame, buffersink_ctx^.inputs[0]^.time_base); - av_frame_unref(filt_frame); - end; - end; - end; - av_free_packet(packet); - end; - finally - avformat_network_deinit; - avfilter_graph_free(filter_graph); - if Assigned(dec_ctx) then - avcodec_close(dec_ctx); - avformat_close_input(fmt_ctx); - av_frame_free(vframe); - av_frame_free(filt_frame); - - if (ret < 0) and (ret <> AVERROR_EOF) then - begin - av_strerror(ret, buf, sizeof(buf)); - Writeln('Error occurred: ', buf); - // Halt(1); - end; - end; - except - on E: Exception do - Writeln(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/filtering_video/filtering_video.dproj b/samples/FFMpeg/filtering_video/filtering_video.dproj deleted file mode 100644 index 3a3b916..0000000 --- a/samples/FFMpeg/filtering_video/filtering_video.dproj +++ /dev/null @@ -1,244 +0,0 @@ - - - {79D5337D-614C-4BD3-8188-3A98A34FF744} - filtering_video.dpr - True - Release - 1 - Console - None - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - false - 1049 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - false - 00400000 - false - false - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - filtering_video - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - ..\..\..\bin\$(Platform) - None - .\$(Platform)\$(Config) - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - 1033 - - - true - DEBUG;$(DCC_Define) - false - - - true - - - true - - - true - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - filtering_video.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - False - False - True - False - - - 12 - - - - diff --git a/samples/FFMpeg/filtering_video/filtering_video.res b/samples/FFMpeg/filtering_video/filtering_video.res deleted file mode 100644 index 6876088a6648ed90b09c480197508e4404c57dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57140 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 I2>8kW0h0=QvH$=8 diff --git a/samples/FFMpeg/metadata/metadata.dpr b/samples/FFMpeg/metadata/metadata.dpr deleted file mode 100644 index 357322e..0000000 --- a/samples/FFMpeg/metadata/metadata.dpr +++ /dev/null @@ -1,66 +0,0 @@ -program metadata; - -{$APPTYPE CONSOLE} -{$R *.res} -{$i ffmpeg.inc} - -uses - System.SysUtils, - ffm.lib, - ffm.libavcodec.avcodec, - ffm.ctypes, - ffm.avformat, - ffm.avio, - ffm.avutil, - ffm.buffer, - ffm.dict, - ffm.frame, - ffm.log, - ffm.opt, - ffm.pixfmt, - ffm.rational, - ffm.samplefmt, - ffm.parseutils, - ffm.swscale, - ffm.pixdesc, - ffm.imgutils, - ffm.mem, - ffm.error, - uResourcePaths; - -Var - fmt_ctx: pAVFormatContext = nil; - tag: pAVDictionaryEntry = Nil; - ret: Integer; - inp : AnsiString; - -const - std_filename = cResourceMedia + 'trailer.avi'; - -begin - try - Writeln(Format('usage: %s '#13#10 + 'example program to demonstrate the use of the libavformat metadata API.'#13#10, - [ExtractFileName(ParamStr(0))])); - if (ParamCount < 1) then - inp := std_filename - else - inp := ParamStr(1); - av_register_all(); - ret := avformat_open_input(fmt_ctx, PAnsiChar(inp), nil, nil); - if ret < 0 then - Halt(ret); - - tag := av_dict_get(fmt_ctx^.metadata, '', tag, AV_DICT_IGNORE_SUFFIX); - while Assigned(tag) do - begin - Writeln(Format('%s = %s'#13#10, [tag^.key, tag^.value])); - tag := av_dict_get(fmt_ctx^.metadata, '', tag, AV_DICT_IGNORE_SUFFIX); - end; - - avformat_close_input(fmt_ctx); - except - on E: Exception do - Writeln(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/metadata/metadata.dproj b/samples/FFMpeg/metadata/metadata.dproj deleted file mode 100644 index d215c64..0000000 --- a/samples/FFMpeg/metadata/metadata.dproj +++ /dev/null @@ -1,244 +0,0 @@ - - - {D042FDC4-2AC2-458D-A0D8-0DFA6C296945} - metadata.dpr - True - Release - 1 - Console - None - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - false - 1049 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - false - 00400000 - false - false - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - metadata - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - .\$(Platform)\$(Config) - None - ..\..\..\bin\$(Platform) - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - 1033 - - - true - DEBUG;$(DCC_Define) - false - - - true - - - true - - - true - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - metadata.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - False - False - True - False - - - 12 - - - - diff --git a/samples/FFMpeg/metadata/metadata.res b/samples/FFMpeg/metadata/metadata.res deleted file mode 100644 index 6876088a6648ed90b09c480197508e4404c57dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57140 zcmce82S8N0_V-W(L{uzmS5QGfrHY6R5J3S&5ClQ06j7w9G^I-urAhBaI!N!mH|f3i zs`TDw=6=brliVaHxyi{XzkouaP}CqI$YunOe+o~D@#RF|9Rge# zCFORIyBX*~LJ1-@hy=KQ!NV^Eaj^%K273DH+8P>hin6kmin4N*;5qiCj?PnF-kZDs zt_fRf8&yAV?`ijs9})X^F31bbkH`xRXXL$&Gveathb8PY;+aE@;7z2wviB9jm^o-8kdleBu|V_ zP%SGiK@=XfBU;Z!0gY3LtJ5T+sxXY)xYCQbIZq<&=euw;nHzmY#Rwx9WBlhiBs*gPvA3N-dVAJzbu-cykg!iPh{lr?6W=zF8St$5Xz2Ug_<3Yv zVj?1Pq9P(oyxh~j*N5~>a*N9PN<)zlwKnbzu`?D$uo6RlP<=CM0kTG}bpf=;`c4 zJ_XcZ#qV|@Vs{6A8pVaXvEZHc)~04mMOnE3tcwqw?HvZggM-+T;ts6Vvs&!E+g-@L z+x@@CZtM$iE^y_}rf@B9H@ zZx-z6eo_>wfCz;$-((~BqMxSl9r!M+1M9xqzR6<{1o9z5T%8~J&>@h^0^&d6Lt8uF zwQColn3y<+ijwjhMS1xUX~~BPj~+@TJeF7Z^jPt+p@4t@J0S>L>-@^|>C?1Cdb)ZF z?`_|;I@sAE=ElZ|wz@i^BrlJPTHx9A%^SeKY_aAhrj07fDv!2rCkLbd_d!kV*$Kd7 zio!pIAijXFxj8!{KAwTdThlPCo=!AY7eot_5UjVmAC5PAy19Wp;)z(ATjbomD}40t zdN4G2&E)LhIO^}?g9HZzBK|&kh>Aih!b0EreShNl70gqXYXbdbV1xbrks!b)KRP)L z$jd7*{H%{RZ;X$-Iy;Ygy1F7!;W3D=b|V(@8+?0zmBM#kJg>n`(4t12!cw1&NK0MgZSWAtECB{@wk2{iKr< z5|F%{T*TmID~_lASpQdk>uNV(%S%cCkIhBizO}js2f)h8Opub4TwenCPD)}cjtBor zTR(dT&Q)qs3l{J#$iqrN^8}urK1}(bzsj<58#UfLaXyh(`KavH`p^XhJA_aIpGhHWATeFNTfipmm zw-47oGhGX|va||Y2Ik4z%SS0XGRi0Z^JnB!VCnaHhwY~&&wu~M5+Vc0+8P$g&0a*V zvG*Y3V;e|s_ZsfZL_jbx9RL0<98<7gAqLVM8vMyVG9u!0WLOyD^uFXT+rP-zjg*%z zAq(>ugrBPyF?={B15VJR5k@a;f_-4ys&kiGl1M9eRyQp9hHx76{GM)LO4{z7>jpVpEBs?V4 zHaRKzSvHufoXmVIGhGv|4@m#?6dI|nT1Hx$S8=q$@B2by6!%>q-Hz`kaDBmVF$La* z-w4vrbfy`Tk&=OiZH5GgNPqquM_XD{gslLwj=WSA7Sd5#yoA(Nuizr28Fy9#xkpoN z1gQaiLV4uTgF#$`=Q(`W*K-Q+sV;EdSFD%h=OcxAdFv)7rZ_%PSyoouSW|;Uhm~Sk z&$i*_9M1bcjqHr=*zn+j_3H9+1jrXjcm`BlR3g~g)P%HwsG(Mb5xdim8!sI5uSRj< z0U(PNtu}$Z+tS#GiH(it#J3OAriR9t?)G-1tr_rL`C^PXkR|>}RC`>p+E~|sX>Vyk zs=j>j-r6>N24mRM)zR73-_ry3PA_6)P=pZ`>PAF``u|Pr!I~RathKkcW14~N*;rry z#oODL{Kxj;@4CABW4+zoEkK?D>t_ndNUy~{e^QJQzSRQc8oW%inF`--#ppb*+{npn z*ccfaMmkzsk(Q?B%FK+c{Xc6PpI2X3zk6tKFl2gi3cIkdfIyk2x2GSQmC=NW3~xk7 zMKqyvvRXF=`iC$J^Yh5$!~`-tG=%Bw=~rw6&YnIgJ6I>=KM zRphap9HJyAkD~?VnE~3~+t}b_L!cXDbzkYG^6=b%s{20;1bVvq+FtJNEAR{p^z}uc z{O0cBiiC$o0r@fs$eMZB*Lo$`*Sf`6Gou`=vwb`^EI1tW{SkrsI@G=Wy}c19dxwR` zkCmPP0)A;OsHmuj%uUTbq5KMEOE~t3kT7s2l>t4d9m{sE37jWC*U2w{G7YsBY;Zsx zHY6w*2>^9r8@^uNSRHMh4}gY$Cu#=XxjcHOW@Ds zpQmleQ{_f%Ty#3n?*ec%1b{hw^-}lU-_3)Kwe52-=ZF{RJJ>$}oOiVd*QI|h)8c93 z=4`=6hLvEU&JYq9hy?iuU^O+gFx-NLu_|KWoJM^;7#uB^7Y7J2@p?Ym5cZ{xpB;d%h)JCI|lfNY$%0eIMVeJLjT zb6`IT!<9q7a*dd_s@ifMW`jm#{>B_8HtIk27PbpruhDc0sZ(ng>wyUZg?3T>I2s< z_8{NBZs2Huwk|kUXy1at&wEpM!q51$4CyA=#jCWd*?rUvI4(p6Emgez+W@;NKRrkxO952kij#pnz$*0jV# z#KYb5Ra8XO$MDclBswAjoGn%Vwto($ZbV0Y6xRp*9#DRRHo@eCd0Za+XJrM8%ir2B z{@F;cXd@Z$fdnvKUvFR2sK_Yi2yn(kherS#T_pzp-q!KM^?UPLFOcy!b*6Wg-!}UP z>k+;OV<@ok;lnpzpS%k6L3~?V(>JdQHWESKP>=HS@imE#inff2j08L?3i)93hpvh5 zAL=m=MF)XxVd#5=Ivfm82ZH%<9Y8%4hOgtB-@c@93E^bfT=!f1w=&IHPmYa6l0fwF z_SK609QQZ{*cf2^6j1Ol>kryms`ZTz&>AT zjp6ienBnOe49_cm$hK>R$@*5S8@YvAKY*SjGh;Y_)iSwPRr1iDiZ!g{t2w+8Uz zhkIxq=)W+c(VJt0Z9^R&+JqD1=HO49UijqkFfK1RU~_#gFJS;L9r@0mSm^7}xfxkF z9WW;&10yRdcSKoPnGonyqou$OQdU$9>`oQ9H30ixUdC>T7@RGks&W~zeftfk0~+a% zB1dPPLVl zNZpq&NK{x6;J+<6Tf5YKpet^TKzD>TYkb7%k-wMY^YH1`vRhnz$T^x;Y-mu227DRnfpSs>7--ji2-^N%M7VbzJ;+~%dQyDZYF9@G0>=){-qn

Kh8r_W0MZhm6875US#6yS72*t#Hv5Z#E1xVA)gBG8T1d0x0$Tivt) z+kt(zHaDY-i;AUw?C)p4+uGVR`+IuPa1NlpJ_TZ8LJ8)XY9{z5HCW+WeTXnP@BbY8 zfDBNF)_z{FmXY>leSB;T_-6)jbKc(Cx>8wD`S53b{Z(E^N9V24;gM0Or_asJfqlM+ z)9Jgrdw`#+9PQ~=g0{0M+IVkUyy5LxzMh_1z24u~kA}Ma%=9$i!{fl-HGuSVcXxgH zQpNFC{rp`%sJCZ)Y}^_2zXJOQIzQm^Yv7#SKrnzY;`M&`ys^Fx&b<|2E8Oh=+t;u2 zeZ74a5fM?pY+Lv%T7VDc@Z{vA5ul@C6&O{2+CQLaWqBD5zE#EO=%^0x&FuNB_Wqmv z!ouPMqoZT|QXKfjC%@Uef~C(=)fb4g=SD6>@*ifR^x+TD*r zk-}I27*zv;`FLGQ3{tby6H+U66RECjj*DN?RL8t16&>)6OD?z-LJROD!$L7`$U`VS&Ipz{iHsP}gX^bLZ|W3JQw9 zwNw5tMhN_j6iQ0UMmE+qQ_!veFcJvxu>mZ?AM`^S)t@{;lob>ZMHv|cU@w4drGU$O zp{a=&>gwYBlXlkDK<}^zJ`)$j#mNcL*E1Lq7QUwg{E|EV7qtG+2C$_`a+#T$H$yuE zv@Jp39kh2qJcm8-nQqR%A+WK%L|*IZBfw7z@+{yS1N)W5A87sYCy~0khJmxA(@IEC5RenYkWi398xgeG zK!2>Cw=eK>Wg!W16Az(R$%* zW*)${2I=<$?FE4E3FA8(+qrx9M4kdd{+-?GM_T{%`}}!EG6Mrcf47e=IGY%>Nx^xC zv;*51(0x;ptn_9;TL<>q#X9U+ApdUFS$_5mZ4}oyYJu&q6`P#!1q=L9VD7ze^auWK zcZ0S!4_7w~@C|<;At53C6H&kTgN22a6s(s>Xj6nXNF2?;w&(-;ivJvkF!9qP0(!Di;zOYZ8sJU<3wvFT$$;Q7%Xl`cV1NRor zrU>YVYbC(P4`5g-0k)&RSM+f7oLD#IPWk*8#M3@0vkgs@Ndw8 z3+?!M;peWy78lfDp-mRzAd-N6HWAn@tSqfF0Z!sC_X4n|>cmFJ;A~pZrkk0T0d$}C z-`C9F&l|q)|5Yj>Qj4wmQj0Cj%Lh1)9GsmI;4ZLoa`Mt!=N$ih@1E$+$cV`Cj8w=I z({VQ8`kH#g7VOn?zuN}?SG4_FJ00MhtH(6d)&ae}0)aRZ7{U5z0kY!1$V|YdqXliL z`CzQYz@}VP@daQQ1^}OF_@D8aU!(hv@5~JNQel1@2HKvX?YFMF8YwO;LcqBofuDDn z0!$21bkyf&Xs0g*_Mk826-Y-Lu;(gl;t&35zyHhkmE`I$J)K<$^!G#iIgGBZ?%9Cs z?`QMdx7HW4GqW&|{!(D)fpcF{)DQUNA9D{eHePO1{}Q3?*c@OQAkGltWAL;?Yy-qp z;Op2}{DINIzk^RN09+`xIM%|L3aY5-pC4_^qh!$J(n-vwxg?(bU%^6?+o8%wjVf2yLVGq#1UKgQ}0 z?B)0XZH-E@!+(0u@Kr6k4cKuSYHM+82(Ax3Jp(m7{n1e|CD4wU1J*yZ?*nWCumjiP z?3r*LeuaK~|1gDiUbeHFHuQqr#qUKB`^pDwYJbdaCk}H1ZKe3&=k>3)|H~JuF>TE) z*jiwRgFXltU0vLw0R05uY$i{Li=RzTNdbPER3O*n0DjeuJ$vd8`QS(Tp?&wM(g-eU zJsrh;`{AKKf1mJ>862Gua|G?;_)rWmKzP5=C1zl60^bZD{>pa%Wxmv;%8g23zl8e} zV%I`Gg>(QuL}F=aeI_YB0m!~_xU&NKbbLITfi3qBU+s_dYXX|L&LMn;{)OD%eL9dH z0I5J8+}p$uL9Fi9Ikq(2T;C8Ej1SNjECOs~Kemhi?fAZIqZsVZyzFcw53Ca)LoU+N zp83tq&4WK4oNY0{4-gjm(i6@KX{Ju|V}c8x#~G32Bc6SoG+~2qZH#9eJkG_#e>^ z`}G7o3LiS!S8-#9`4D^F-L>g&z?b7wi21{>sh`mf^Au$&)^otwn)16WkqYD*1qH>+ z;o*^wqJR%7EF=UcD`lpoBl6O9|Cs(uz~=(7dUgP}jt>jKPbDukh>OsN1pPG-7q>M) ztQy=Se?>Pw|Ka_LwXCEhoc{`9Mw5YGTTM-!3(^mLXyL!ppOKmd`m6mV`k|lh7Iz;a z1AG^cWrlFk{o~|!@*w^Y`a|$#8fqgr9N+gBz(ai<^nd=rOY!vnm`aM4uVw;S4*I_! z{m?J}^r`ywPoF}?KZD=6^#jHMaQKLt(%;js4elrKUGD|HsZGBeq!AyJ;{WgmLjM%> zli|zoKFY21!)Fh`&!CU>N1C_(mX|77%>eX6{~`35CIg=H__6XuZ*M>DgxEOX!`<}d z!S7o@d2(WgO_6nJHU-@rFrYK zhFbm#q#yeKpezmM9}VyjryLxdPNXCzVPPJWnc=>0b|?q*|26+~wx7hEJ9xY&OyPM@ zSF?gA3Fi~me=&x8@1^D_&R>Qvgm_@Mrn)-+*w66%fIdZteceho{@Kbbb0rJ#o>b^F z2Yy7L_fMZadv@3B*G42MNh#wvz68oM)6$TH*fI>msrv8j{K!8u(-&~}IN)850Dv=w zzu_H|tsyRE4(I!X^WW06`n_o48yc+75nS18-SO}KSNK8}XlGN7`tw?Xe!cME)Rk;N z8$4%W3hvBQgYy@s6Q?AnrouA;FF%);lp^3A8Dq!ckIUqe4M z^hd)O8=Z$?I`ah!dBXp~AN^0-fH)3D+FEo>c;+(n(boXFp%1&d@(aeq#GLg<`t|i+ z6IGN~G(oHtjL@gu1a#*Yn#pLUGi^9o@~`f4{a@r?IM<12K24m1YXM@>f5&+v>1i1d zNB&dWbXI1LFwirxIG;7pcRGRJy0WYSxqTxAEpVe3kpS}W|BonqyARl#(iVW8g~s`i zAwB@m0`9l1+S@xY|2X&f-xd}Y1XW+EVmpB^AJPu->(Hm3k(!UaaV--qezzZa0Q~g- zml0wB__*?yb21B8A?5(;jgX$M_6|7rc6eIe{KAi80oeYVU7ej9 zJzZV6`5yxGe*=E;tc(JT#Qg-cs8H{JglqUaEQF{~A0jK2xmcK2x;oI;hr@f|cnR2x z0NXGF?g%jaNax@EuCA_80eA>BZVcd#!q~_Nkj*AxTiBOcVd#4Tb=Y6QMEu%2O=x4o z#KqQ@7BsjU0M<(TCLe@+q@{H!At90f?`Zw2vikZ4oj!o4=mpT=! zBGFN47&++}wD7IQf4K_*v30)^g>ScDR1{KHQj-f-;rxsa4ujDs1H7kJcxd!(EY#)cq0Cz|i7UtnSQaBE@nsVrd5PvrM4qqFDOsX=}tUJz}8?E!Ce!0mlon=V4EXgZu-GD?gMKT?7eDmx8%&fqwAlP=jG+^8ypz) z1A73ym41j#ff3+CfNs0~9isxVA}|j|G})xpYXZzM8h!(OfX`rj8(^$sQ&ZD<02^fk#(%@j&5i8; zn7n`7d`L(bNpf=PZ)Ihbw1EGf1$WTS78aJA{`@(9pM!(r{~R}iAO%FNZTwLqZyBL#RRfLKDI`e6z@=lHY${stZg zd}o>`CI71|L%wRc>2M3@Z-Xd7e9Xde1NIJ&CmDwDge!b zOaubBUE& z*Hrt(<=WVaZ(nV1=BqJ}1+FoZz;uG8`&2*qf9}ztP}3c?8^QVp21b3e>ut6&ot?Z~ z`S~ZuS1zr;EetA=;&Gu7zQ13%k==UFsXHz-na8bm+_>As&RDxsyv_9%n>YK;)4{%@ z#=83Y`fv30)wMv>RZ$t8Qw#7uapHs{!8;<#rQ4#U=Ic`3g-qF#NjAQ5xoNqv+1c4A z_dhyJZtby=gAJ1pjJVm9azJ>2_`1B4f(uQ{&|J~b9FGUBs8FF7@t3Ei++~crs@MuI z+dlSsS3dNvT$zR9rc?RgLM5Lu#{s86$J+8+qam*_;^N{aL$0oL;ApzXwbU$rnsoOG zKVs+4+-X-(&E<#5Hm1`1dXru+jJhA!)I56XV?{U*O9m4q+4+?X45I~4!9H@^;AcnZ z!{XN~U)FvUpkcXi-61nGa}~fMSG&7qXBL~A2gFaGHWJyjbE+>3}U+Cv-2p^vuB#QpAr-2=0!Pk&g>^o<+y#Sd1l3ua;2PxZ>iHDQCZ^U zwUg%Pc+V^8YiqClP8{8LLA*&>yh;3aSy`F^K(qdP$vLjwgK!>oI^^A)zKqIKWcy4aZ-$V|HX8FUMZo1J5%D@y*O81 zboG&t5%M;gy)r9j7ruM%-r(Z+_~dFy$$)rqG4tZm()Fd`CXpHA@nG9~ge>2ZLw2DK z4mxu!M3`kgsj=DFmYSN@yVs5{jXgarEtT&Pb*0Nq{{xh7v&kP_J{eC!TuY4dL%Hp~ z^%YrIsYFwp46-t(Bo|7~*F18j?4Hx($>#C)il~qNbQ|j@`qltjk?;rf-(j z*l8i=^E#}2a`HSt`Y4?~eL5SQ(o|hbMLV3(RhRM-BX*JKp*Xe6%DJ&~0aeVoiw?*A z{nOJ^)3v3OLc1mwHrU=ONgp6SNJ)9Pkoinb3)x!cE>uT6=Z%xwNJ>Zu&m>l7@`v2_ zo177$*hMjUrMGJ%8GK^&z{X5ILjA4R8j$^bC~G2aNB+?9nT%ky()TMV2D;rDx?dY@ z6zSchM;NQlN_{=IXI+UG`^^`XN`R_u+UV+{r#&3Y;}UAG&vNyGWp7@dx2uUs*UEIq zLV-yiW;)*S*k!f{fv>?QmMB+1mnwYD9{=>AH&^3pqk%r7bW&Pw?s2z9`+|ewGYTJ2 z{b`I;C_kPXWP$_)M9Rw_UO9gJxMy)?>G)N{@p?p~FAsy&HrwdRo_KWQII4EkId8s{ zIWJFbs&ls zEBDf$e8;cMsgG_)H-y|aTWegXGuxO!2B-p1EOLPXdMGKk#23mjGa*!%Zq4iGB+*(c zjbUv}a#{9lf^Sv5cNM17y<)gw5=&_AyIqt4#hHGg4798w{gy_MMR=b{Zth@vqH~hu;&=pOT)gZs|LLbu^ZDHGnkE)z|VF4 z;L9}__DskhT=m~=GH!A`M$$yLC0b&__w*i_noEpQ-Djny4jx6-PH~zG5d_U9s}oSi z99OA)Am|cA&!!?xa*{YgB(N;llGJIsJ9UCPZ!wG+Gge<;uV`|sjUeb#qDBYX)CDu_ z*o=JYo27Eec)9GT%*?}nue`!lvuBCp4KK=*p&m?(${3^QPi&Jq$6VlzGH-JKMojqS zP#I`AFV|>yUW#&gzS;CbAY#gX=o4h+=Iw`YJ5+cR!K zcfF#jIn7TUPZuLKPrgm)L2AyfsDmO-I)6jrH~RO4LJapD{EB*Wjr6Z$n#C0`UHKc? z2myOQ?H=tY3;`Xx9eyT znv07InAyJCVMSSyL?J95OixZm_QuF4(P-tI)AjZGn+oVM@U5OV_t?g3qB0h0uXbtY z&6SD7NoOzDO2kNR90H6Qv|BW|7R|*&R#TGhDKl~ogT5;(OLimDWy)!E?HJ68>`V{j=jb1zh1ASIY>i>63u`=)1xnNUCqYA*HY z&iwXJZmG<1c~|M+0T;pJHjjtN%&uhD?2@59cpl~V>fAnpvo-qqeRaDo9^frtp`g(_ z?ooP@)h2D3BQqjGZNX+~LR+S#>GTP+K|AGyn4>KO{k&9xm})f+OeG!n+S0lBoO$u* zt#O*6Zl|K?KHlv-YbM$LO8k+3SJM}9u0z8+I+QXA4w9p47nt3j$Zp*4nen@fdgnJ~ z)$Z+48M;fZ?WC1?c+|Lj7JG_u$Gl8j-ugGj_cS}Fd(ySXQ^R-WJV6D;#8fS$#v6|e z#b=NDXlr#Osftq{;$w?C?JZEmLSgG8B7`y*pZ!2opj1xawsHPo7bIFCSg7Y_ zCXuEPmnM2uF>)Jff82V}(gixw8)QL8Nn9#vILDk-4+9SS?Th>MHjSRF5xu1If!)~# zGyTtR9L=Z~p#tTmalUfoeQF~=hz zQSqKo+M|E&sp$R|$1K;8WA&A{#=?q&?(8!iL8Duo%{%hH4$Zoe@~Ds%PA;Pbct4)a zQ_9};8^2B8jBR;{#Vbb>qm`QLbF1-r=&#w+>uRV7W)R% za4cgiBg@@=c6@uYvOC`7>wEuyAubb!1BK`B2I)*2aJ8@Ijkr&yILJ_UUF54md(+MJ7W{Mt{`a8hQyNK;(oHq0nvB2e0&9;%ba`mT$7)s(O!{- zj6d<_tEs(1pCUKnyuwAJj@C2Or;+rNkW6>-a8X9Sf2+uX5^hpFM53R!I5=yWzgntb zGFPR5n%%|ja=X3R>$}M4D^1pUQLEyESv`gwd`mPO7fDOzNJ_#u2jwTq*kz6=qW%Qk&nqU-^UQd1_w8EHMfWI z`}l-8E^~DD^f)*=>a(+31=9PVU?&an0 zJ7CAxZ7)(sQ{8d+W`L8J$ayAf*DIQoiZ^&^xK&+5JnTFLMQKT_*#z8pPtlwn-cQ^- zP+C!ut7Eo)3bS`vVHd%!qsKlsSM?veGA1B(K*@t)^n8_{wZPrIG;}nAfi3&5PtQq_ z5r-;foUHF`{PtX1)7?{_IqaO|`I|;YSB<%}ZQSc#?%hFZu1hWY=xD_@)O6PR7}W*; z&Z(t0l;k8qk>ufLA`&oBQzEADEE#qc;aZ!wR@y5|iJG;pGsF5+rE6iz!tXH4ovva7 zeC|^N=lKs2RvDD2BwmpP$@N7epYrIY_sXcouAW9K&EPRFU*Gcneo99wZbz&u9oP+p z%5#UDYHMj~Dl0>;UAS$T$oZU&qLt#5HI4MHFKlzH+s`VCioIpBFyGV8tEI5h@52T! zRYJwa^YZrXI*;#|yEh)9ILQ{oQpH&P$b;)1pN3n*s#i3P5?6fb+Z(Z$8;^X`&|YDh zn0^u?8C&K;E0Uh!gAL-AJ0$Xr_bc+BbVWTm9|W)kR(2yLY_;I$lT72B^fE zH&a)>lyb3Ca0wD4FFiSVJ~uidljvdFLFt@rUk3K=cRWa{xSe1h2lXLdYAs8GGu8r* zV%57V&+9)D*E>h4D9jie9OqbD@P6c6sNVB7a8B+!;Y7;Y-fJ%eWIh?^DxzU^qI*n5 z!aFKjxHMRT+)f>uEuLAi5PO?zv{Gh@O%61fp231k%$HEfV;9K$>QK~hum%dIYa@a3 zX}Sy-@9s;KA_Pp`s&RktsO;RUhXyh%$xqB{QuejA^a)}|Hu@F_3Nl?-%D`DvR(5Y_ zykUs*%_99h2miqaDYx?QaF@Zwj6Gid%2R?j)r0RobD=rlqGCvIEkv*K*6m85Tt}T} zq4=mJElQkhoR^w`^OK*l%d6-1k47c)h~b=hG6?;d3!&j~%&jC823PX(10P>3nc}yvQ|l z#c2c^C1UdJ73!Aw87T9YWh}MISQ;4j6Df2hsa9?H`uGOZ>G6fIj@yh-ugtfsOs1ve z29ls6uChENqL&4iEjz-t(+DvP&T+19km~gJ-&kB(`4Hv(EWj)9!cs$nm6^It8l7&G zgJ_tY;CULsSuyh8N+c&L*XU;533-oD?Dac+hWO03^jnAgCmxP;h@W5-JX(|&=NMNe zaqeN%LAex*^Kx0l(a}Zhv3}tU)<<{_5R+d=Wj-=jwR7{S+rep${&G`#Phxsh^jjTH zG6@M*RxU?{>&xwR*l&P64+A^l3)GY2r~|K!7elC~GS+O4PWL1&z4y)KVs>E|xWpK6 zFn9DokEaN+n5TPw#!R2^D*qch0nBvw59W6_>U6X?Dz;9o*t8ZckOXa zYQq8nb*_+_rG~(EgTU-5=EifT%M}LNIEkh*p+!!+znW`}RF? z-S4tz)$%<}h?h;0&O55GZ5N`yCcoQ*S)sS3r^lqG8C)41%FP{<;B9zKgfi$eS)q;3 z$F5V!fgN{npAfL7?D;?|dxDGMowotu4gHpg%g9(6V8v5`-ZW7XW>4ObWb5a?rAy~_ zz}PM?*v;KP&Ba2wdvR&uqHEK)H+Kvr1(KRiR)yYo=~tsTn|K&~ERT!vomTwIK;~ih z-Nb4mBUXe*DO7la!V3yS7@iICP6>?%w;C3eD>tkuN8B#owR@M>P0O1;0qjpX_rJZp zu%AqW=}CBCm;eDG!!%MoOHdTnOE8~xxTD`ifaV5Ikos8HrJn-Q-m+`7j z-x?v|*ftcprpG`5lcm{pB4gO)jwBCR$q+}!*pr(5B>ls2>-SJPGHX+sYej+CVwAir zmkyRrKU^OC8WC8Ay-8X!yy_LT;%{%eE~3=a?3X6bBXfq~vvATwqur{`;@Gt}hr5T1&cCRdx}|Y3r#a*t3M$^^7Pt?8Gj#6J>94EhfW-BIPcnIW5e=5qB2G1+=C~L zoq;;l9|t9M5^piRzNPTQlvek+xp_3bRFaBdWK8k`NmbIDm8mX+L1Su?j@Q)awmhw_ zG%Bs`l&GpCF=^wh`);)rq^Pb@HKrIY#;?n-$n!7oo{yq?Fm(!tu*X_jj`L4>Xh0za{)k`*AV-*3b=?yCqH{ z!hTmcu4(w6xEd?ya`)zdXta@Y#eK4u7YQN?Jiq9CuC}6!8uMw^(_sn{*n8#bRg7kA z>?NI(>&w$UM#shs3+gZLM44@*n;9)kq-kyp*nD8tO69zLD){Cl`y{{c3vTH;EfL=B z<}bO-P7)ic+erBh4OiZ{wosjHs9JaKP#~w~*W%*sbsv>SeJT%Y#!`RVD;>T^@Rqrt zC>7Fp9&=o{9=mSLwU>feLr;G8TKrB1^-~#jr!R?^cd2$hv5!02|MsQ} zjjpclo35@$+Na!hP50(*RAf#b=Tsx;2O3!3vX5q$sbPc7&YJGQcXYa5;nIbj7RU6s z9`--8_!g)~FdF^g*+7JqqPjZCRs9^R<5%SiX2;2#92{ufi^~^(izpkpC~N2;D5PGR zZmBO7^;`a-fzdO~VOAO420|9LU9b1=TNE3UC+`-LQx4l0CL$0dBH%Z-l@g&CXbl(vS6eUQfbC-7qYNLSE~0 z*K`E@hLz3Zp+0&{>ByN~$FIDP2s9<3Tfg@%^Q&O-HDmUM7H)yIZ{cd0G=i~rZ#gH< zzg3{Rcwu)^FVTDR(h-lR=a1RbwTtTNuePrmYA6{OMbMM)v@MF-uRdVNl*xMBx=Z%6 zsm0!&z?V0uUjFNpd6|B;LruLWi?MNpj{)q884JQ zpGoV-a>cx4qHRmPElxO-w|-T^jG&!Q?Cd3DC8fP}*H;MjXI^h}y&x_*I9zFk^qXrLf*6kMur5xsDSv%q{vj9H@Lr1!cdm((^m6pABm@E5j{xk(Vk)0cx`TuL`aaCB?THQ^Eh8M8gym}6(co)zr~GOV;x?yCu5_tgO2{~ zxoVff$HHF^@@W^P8^ud`vR}U*eI{Lqjj*}4BxVQp^5{isVz#h)GV8!snY2fqt0ZQa zKGj#(QF$Z8q1V*Z-cH6Zc}%r$#{~Cq{Jd7U#XjPfg**k)Hyb%*wyD?!CnsNM?{0iq z8eD8^VDI4I5O9uK=N_s+_)^dQH!D~B)^e+u`;vAtu$875wiNBA4w=6&dJi2oF@Cw2 zn?O-V=TIHj!m)LdbxL11zb;qK0I&4mQ); z_GQLIuP)pyS347u`1Bej8F6IaOqH%)EwibQ_QutX9V!F69A(XzX&@c`{Br?v2Ou z_C|H=mvt3GEYA(bdz_ zOG!;-G+Q084J2Vf)GZ5QcA*e#JhGk{`%rey3~h?Ml{6hA58OHb_%Z>v04w^d$Nf3O zV^ToAG{8b=l19jZ|fyU*L~5H!n57t+x>=)-iD^u z#=UO_E9nBQdp-)}oFVA{pnx7EP1ovK2Y)2*fSCWR>)ZW(x}EX9QzB$F4`Naczoc_t zb~q?+NPr>22$Y39S!@$2m)S)n!I75oCX1bUyBLY}sEhH32C)fQ^(Kip--g%QP+zSr zP~@o=L3>KN*r|3T+z^w_^N!jMWS63%NaV?IZ`S?eJ2q^4t>V^kAC}&OZ{N|c@5|L&x#$s zD13NPZS7Z;smqm`6TdfAnUv7JQd2N@t+}9JwUBSot@O1r3#E#D;3fAn)vwfVWjrI$ zqIv9d==?*D+NAR=yp+3a1;v${S~D{{dT-k9rrM?mEQ|fMS7#>krq?H^q|zUo*gkud zkP&$Z>&IaxxvF`T$#rl-XRYIPU&p$3Zmx;p+K8N&L(O)~Fi-btWnImQrg^y(6^7?- zG*6qEvL&bvMn;%Z8q(OMyWaJuOT^GPYwtejyS1Hx3+IuUNiCe=ygwp4!`EL{m z@2kl26IU%GyAeuz>e59HdDHRPf#V?|A*T(0`?Rg@3JRQxhBIjYzRa1%JIuLka!FC| zQ@IyJ{a&NLx_EunWFOg{a6aJddcjG~@{b|q31*0V$zq1UG0sD!B2@dIUyL`?ToF5> zL?IN7mNb!Vr>5RRDC|;yw({hQ9M4?#i>6W!Rq`J$Jq;FRiHH(xeLhUHZ9%3ilmBV< zh^LCU-8K~O_Rh}Ex55LnoeIdjXO~`;4_8-czci`2*=o^2?6>(UrVZz4b$#mt0~9Gd zf)eMRuVlAO-nLmyF6L&`(F)Trv$#pRd#Iw}rof>qA~_isgs6<&Vs~F!m1LF^BD7b1 zfK3u)3R^7bc8$ems|wjYTzs7w8YC2_d2-|7`o_r1--P50!uapLAHF5ZOHCk3yS?Uw zlfw1hF|!xCt31^)l_#VZY1R$BJVDrg56z?bWL}aN{Njgv5f;))5Qd@ zx}Qk*nP5ye3(KF$)9}diY&pQnK)`3!o=Uo3`j%^3#M=7$QT?3(*Vqrv7RE#di$)R< zmkJD5aYK~;%NXmGmv6f%WwshxS`+dZ?zb)Adb525%aDd*p~^Yrnk)D=_~CkLBHF{t0<^xHvruTGqaRqD`h zUUx`FNse63JV!u4=4fL>a)jKL`Lh0G`yJp!ys7qKH>b>k0;br>49(4<*{N%N+~naQ zJ&En842fkukF_*wg;1-$0^t2&WoIMP@|Ii-zWu55)z#*uLgzHywU>q$Q?+K=NE<0! zKGBm!NAEv!NTcI=y_pKfvBvAstxriQK0fI8q93pDi_aZBak=f7fOcH?7!4i^aEGc$ zI^CJfqSfPo0t=M33ma*s#gP zK3ZBwiOK9z)A;T+_l=!m!*ooV&4Ua;82kTcAMgzjuHy{bqJTK#CT8#$hqI^2a^!fhrHuEb;sD0+YGxlW`Gi4 z;-E?xN6l6`nP@DyKa|rGxqaLAiMM3HtfvCT-}{kuiNc$aF>n2Q9?u3==adg!zDS|v zeQiD2_S5_V^Rwr<@~JVYzhMPR8U$_KyhB4Lhog+=-8USB@@2@Wh5V^%c_;al?khsrKR}FH@)Vllv)D&)(>wb{-|3&m~&x zJoiGnx_@sv4|T@2__hy>b@RRwPd+xg zA<2y`*(Y+uhSiS$^GQI9PFn;w#;(Rw3!Ct{qMw>aB8FRb;j@3Xl!a$ zu)C1|ec{31tnMA`#H_Vgv2_Y&vF+sa@jV?I9X^mb7GQLOM=9~H1wWCwlgXsAr);9? z#3h-oM;EL1nx8gK*X>YEAN9=~|EhuVW*TO_a^-ztuxr9Q9(0u2*b*s~hvaj4k!+gN z_07bYQ4FQcK{*PUjafz`R!MtVBEtjZ!}>)XoN|0-_7l;&5ws|+#5DGuKX_YIUFLGa z*_Q}yJn8uZwrxo?bzkSo{F}r{n;p}53MN)Ui*2^mwW#nnoQW;5KB{v`fh@S+W1Fz} z9x~$A-Mc9!C%9kFa~@!LV3>&F!C?9}a<$|760oOgH3yhi5}GnQrm0b6H`rcayvv*! z1_HhOiVAqR&z}mK={WkK7df3ICYkI1o;*LAcWM&#SkG3$&t;jEFZc|)RLbNmoJkUuFLAQwnl$1VA4{M(-5f~ZcfirX52Gt@canc zipPPE=Vswcn@1+ix3TYuKSc%s9YyZ8Ijd8zkyvkh(#^u~@H9p03Kc;@s~%^XbM={1 zU*4T*6O{hWKc#=tc)`*-0vfI@+79W{7mnBwX?~j;9Tuo7}kKdgj;%>Hqh1bEauL0;& z=TbMobn3+BLdubak51^CGKZtui9_GQqBZWMFA7GSaemfcvF*IpV?#sAhLUUV;$$Lb zGMT5ZULK#C+xFCpwSw3D;-zfxC#5yeLK@{l&o>^LkztrEp{eG)5-+fOg_ zV)uxllTdB&UgsE(asrIl;Wltodu>^iXSHTd&1qY5$e63|i+D%~ zDe&GqeX_|UOm*9}21G=(XX^7dt%UQtc*D-dR5`o&m>(ZeYl;JU#Ubz~vOm(&1ekDf ztuzHDpNJQE?yeH)_Eu-tkzE!SIYJc=hYd-Ye^WL(8zo|UHvQpIwVTn`Za1&WR!z<5 z@4jD{>9OAH?I)h8?EWU4k~)ck>k_GwkD?oos{NM;x+D5@O14E+9vtf?ru-i6ITsz> z9;o}ZSidX`p54*Swr7{EcZt--X(z6AVsoFcooy5->^d_t&*;mcl~pydwC4srS=40x zbZpL!>%?C@x+_B+8yfDL6ATWUb1gd<)$HOmx%1$+6JNyUFvMaq=iY_yr&GOOXmvhq zchr%lvt7F$9DMfSY~4p3u?lCEyxsQjxly)S@7G{Bcul(GG^&_5(CO{oY_=3nvCA)B z@?1Z#NTvDondZWVF}s|B*gGNZB%P<_nU(y{TrW+no#LgYB-1TZP7KD7?wSSiX{&c?>KN40Y1(sSjtccVu98c^8r5GoTST-cZE z6TQ&c{s=Z%hFY5^OEe#|PQE3&&~)J)-6)T$;N4y%Br#(a-%9i0$2-P(9SpNs}2Q?$o@OprLv2t~M=W#+}5DmIJ|& zt=mTQ9b0U^1PCTNyc~OAFBiX@UN`L1Q=8j3rW5|S>@w30^5FkR(^ZB=^?ltt!vI4M zAth4MNVjweBHbt{DM&~+LxUhG-3W*vjUZhrAl=f<(A_cf&hP&`@8|h)=bn4cUVH7e z*4cxNl`dw%JV{A1_!@3bIwMscTXmc4UDp)S~qS z=CK~q7v~ciEF{r<&qle>W6|rrBjjNuPy6+nI8*fOFS?4YgkLEHL-ZD9ijCH;su~(# zRX}HAx>Ne$O)X#Uv8My=+R(oTqavFMuBQDUp^940cV;H9E7%Fyeus5ryQCNte{`<; zgK2P>JzVt2yLd)-2r(rUX@8V6FRTJ^ciP(U=jr^*gh#@x3p?`StF~$1qG#&=mmrv`irS!f>+ZYeE+x5^3bq6jf*@JfFv+1yiZ_%Kn|pQi2@lc)v|%dM&q&J+s+@w(vX;)tfv)hr6RMz- zkDQfIw4m+$>LD2T38QK>oNN!kYa77pp+WlQDSLytcbf-tC`xj)z)mguA@h>?h zq)a8)vmdx->rpW}!K4eS-Mo$_?fp{YBf99jGE509UH=hTnqC^KNqj>NP2muhQwf&IJkVH%D=-o=;AdI^~ygKFyB+mIXG_n&B=RTG1e`Ut!*og%k z0+7eh+WGf7S#QYoFV5YUJ?9-8!N=?PU!D$=0rkZuCLI*G;rpI%K0nGgX1`k|fQ(c0 z>a4bxykks^lGT2+vXS7kOFUHpg&$F z6@324t4d+RV^&-vwQC6q6wubs_y25>QRKbJ+8~lkP4{^GlL8BWb-jM}g9D!U2rRVe zwajys(bP!2as#vW59@yhK;Gm}faxkT)M09BDm+CS#i>~BFVyQ(@UDv@q^BMqYBB57 zLE*JKhJjryJoKuqSQm9$8ei87{=C@30Wk5}ymK~w9Kk1IQnp8#r2YZr9vQ?A@>W?-V{n~J~qfVnG2&=O#9B( zZtGP~m_tp)Par9dGC`kys~VvgJeFAh7DArA`f2xYyC+vL%Ard|srv}H|AVe`WYG$~ zKdo)=tq-V7wI96Zo~y&E$0PTcd%w=9OCZbHF^mxluF#GwD*99EPf?6E za8d~6&);K@dxlp)1B?(Mv#TA)yCv;6k5;A$oq7yvODh! zds-5+TvxaZFIhJl#P~_Cm;3kE&FlQe~=skl@~QOd#6tC zKnSI1T8n!Q3a5q#K;O_BJTnVC$rN%B29MgKMd}r1s4VnQ*~*9<@WtB5I}7l<(8wZ6 zwU*Pej#7}rM{d|Q=kYP?4(&SA(a4G5mIE_pRc!{;5PN@B3tiJVo-devwcp#1wa>24 zHz+CepJVaz;0$xAzu4F$afxg?;Kh)!Fe0CupO=_#hCuYiL2^StRpQB|RkLA{@?shq9(V#lTQTK2bpHt7tjAJ6*yAbS|@ebC~XZ3q3 z%AqY}>bf0fgtaX;?#$N)m?u_hK>Y&sP8P;r%MA3{4b*(i6QgW87;=P!h=nh)Q#knp z2%wl|ILW8!U5_wTX&Lo&m5Cn#TpjqTB|BUF5m*VOyI=WD@aa>U^+PlE*PAMH>^!#xHl&{A6;^Z%RhSkUZ?2 z9Fxbf9htuq?erl2^`zkU45Q;4pQs{2sFN)Zf5XoZCWu{U{L1{2rN-`S*jh<=Q=TMr z@7%k@c)DCz6#K*u+J<3lmQ4bI zz~3|JL4n}k5}>|SNcP`Pj?@XU{5%jP1Fx%(|IL+Z9cC(fgfQSj<@$?rlmE6?Q!!z) zKd>`hu7xMk4$1D{zv0PsID>*-;E=^*?HTgWEjJ~jYy4Su!Lr$}b^5Sw)Z<3@Z7U-C z9f#@!R%rjrbor;Fes}qF;vh?N*z|e5+FKRvgMkcEu!9YGJ{eMENxQD6HiGw0$F*KU z2#LP!O*=JK$k9C)WEt6z`DEg`WZWzr63S$){n3h~Td;h3p-8t-Q^z@IpvJ&-r)A?~ zdAA(wwK0ZE8EW>b$s}TYG5Xz$CGpUos?r#}w zse{4HM*5PYK~LkEwL;JZB&sZz`Q6BGY70uunJUF&$Hpl#O%~+NvU#qQqb;Bfrv1cN z9B<(93|E{xf3f!7FE=ptq`Xo^laPnUP|!^XZpYJ+=mW#aUHj9lKs?C_?A(30TxRbH5y{QShHCW7={GqQH z>>6=dQ~j*k9O&{|aB9Sm*1)>(ruXvfbek zX=oQtTqie;@0KY%_Yr5M!+X19*WoT%;}}XS&NQ;-XSF^f>{!W&5-E;a$V)wo!zEj0 zCH4MKcrYYB5wAG5Aq`@WJ`?L8NzLwl`>5ao6+pWxzJ%RWF~qIX)G3P1_-ZtswrB7v z$WUA$zXr5Q)Y|AP{F8_V~pKV?ny6c*XfZ||*3`qR%k@TO|^v5bB znO|+Fv2p{P;#39)KeqL;2j{hay6HYjHAvR6f000+=(V4Y-k|h3+ZxZ|_gNp`s&*3OV^in5eoi$rPw{2f zN3m|o%A~tD9U6w;f3)Jb(V4t9YF7Pq8-q)d3GsRt7~~-W@zo5TX`XMlqaQ z_PR+j%XMaE8dc8=ACTZ*5(u8tNlCn*>{kv@cQ*%78NMI$!0T!}Qd9D~D;pjjPGL)a ztVsg==hqM;!)^Gd7%kO{+TEuJTeJdOMdDFRg*AM?J2c@6<~7 zrYHB)Pbj?JA`6t<1_HIvyVu$~JzSfD+S=|T>;1a8X?;2)RanCNjSiO)T=yC9&z9EW zL3pb2ub_T3PiFBInk)c@E9*?`VIa*-jVxEGKmGDKd?}`}6s;-ogUFIBvqX+5`R#W9 zK?EaTzY_ayn?L8{zq@*NHv`g2+c_Q9^QE?(1TZ~C_d9_osS~TA;Q_bb`qxgaODqHA zLx&;--%Z0;4u0r7RP?`8U3AM^ROhaGl_JDvQHK(u`ZFQNz5?|uG;a2g6<>D3t(Xui!O*1{|K4e@I3%h2b zYVTSd?M&=RR!z!g;PWXDY{vpVm$7A6l;iNKj7`lp(RvosH`xQ;18>Y;_BX9O)p4h%P?#0Xi6j2hu3iQVI0lEmDZlT$Q+?2t4*R@5keyjUN~S8u1uHOrLRp z6m3D4;Prp4e6<2qSg45TDT*%rOHd$QwN_ zuXNvRtw3e@?)Ojljn@SDZ~vR-SZ^K6FU_7k5f{}@*Oc{u(aD9@Da2V5`lh6oHpFjG z2*MZJN-^R)+seAm+qF)H>qp@n_1s9jC)%$dLqWH_n)+2L%)fO(;H21D>_Gg7?V8LS zjcduHu-2k-;mmL}*BBcijua_v6fW!F#a9hDGc^flRM*E-fn+*$?|G}eIvXE z2#2psqxHx{`-)lGALA}BQ-I8v6QI(d(Q&>(KX0aGZc9l4vpgueL1{QZ6uTHg8;=V! zw?S|xXRw@UM)>xRP}_qOp_x)hZ1dHGA=9+&p0ql()B-xm2sE7WI#3NB5bi-mJZ5nJ z(kyJO&Oaeo@ZC6g#d(T*4BZLxZUvqvtBMMKIAw{@($St=#LtHYE8iCM;OeChQ*xEv zQt&Vg$2{vaQY-vcQ1Fx_+PzSD9X4Z?A2VHfaAKEvfI_(JEM%3J6givArkYD_CS8{0D2iRIe!#CJTme! zX=Ch(O_n(21{PFolUw>GuE(<@Ql24b=@xVPW(m#FiZk0iV^W@4?M6lQcb+FZCtf&@}s!NNaI-TTPj1*R+khJn9OzD zmBsy0M^s4bw2CgOaRKXMjXl64{xdQFmf?l{D=o7x;r2le z4p$wS?VK@%6)gmjd|wK58XDrS>c#Wqwnu%NN+?wsVhN36&A+;km-Ymo#Un|ynZO69 zL&uB9zHFSSJb$gxkXe}NicaCQZ)|Y)%~C{yIU#}NmN+W>kMy;&+OT}fImz{s3+Yx6 zQd2#`r2o!3Ga-#f{`d*HM4*e6+<9WJad@7RB`+4%$nbf{q9PkC#7geh0kxc ztj<_a7;Nxp*_mYEEv?Fk$z8{^&?XyZA`?svQ;W<{M<+e#*dq2}6Ty3`Gd%MlrL+;u5!Wha}zlrqi@JpdGFC!YoK_?V)@VJRTj#gX|vU5EW$iNibG)=lB+t&-ihb5x;1V&UJM16pjf zLgq?hR#Bg_R6-JY)%sqgP3vCd1>Mg?NuFhMQoPNUz;STh{Z1jmOg~B)D&aXN9^mV5 z>IqA_agss&%?k)?;(u)z+CxZvdiM}qSy|~Rq9N1uNQp7Am^NOCRIZbQYHlEA3xn(@ zuFo8*3a&!(>tA{`3+p$fx8@#KX1Oo&>5=Qp*Hu@%oyd2H6N7w!b`Gz8g=bjxStRC*}MJB;TOaNL>G0;XE{{&?B z2)ErNOJe!5ZwkvbApKiN1R=m1`64VunfDX_sPBD8`C=uVc-#q(f4@zUgCKg1iKZuY zJ!~E)G7T=FEVp|#CT-U4{GmZB0mAGVW={-eR$Fdf*rmNMBRH|AOm9a>9qY=Ie^b%eN8P3Dy>w2`y>#=fm?3o^*)7Q#Yo|{efv|RpOvO zo%DmNs|Lj)^4vr+D;T9xf`z^2b*;e(XlzM}N8z++}o!T;)bCO5oK$DK;c^>d9t z#EM-DJhU&+DB(xOy=herXMP{7pUGcjNwaQSp7zt*-CV!A9DlZOUN!W}cTztQXAN8a z!vqf3N;tvcB9CEaif%f`lra^ir;(7=Cp?p7d@L=qa&`B3C5h}a1~9-#jGjslft7`h zpADi$YU3m{B-!7ia`d(60YxntW-Q|Pn14GT*hrr48)L&=1GW|#DCQgI0zC*X9*3E4 zVPDNVl~Kb!%{_XWgFau@!L@ju-hL(SnVd+C@6qFX?c7AA?I$jGbX$=r+5BIL zUq|nP?H)=63BrfI8pW4KCcMPTY(+PvG&vbBRlb>57|V@(TBYDV?R9HUc52510`quQ zPP{|<@Q?#dq~#*-p#!xvs=WZ&o<*)h=*ClB3n@4pUf7o(3leba&dmFYD~S$c#cbT4 zdb(&=Pbs5YTah%P0w+pjN)MG!586MWo?WJBX&m9uGZGEpuC=P$McstXWq=zysMPYV zLo>q_d%ar2w!d`Lngo9C&dioO9VI?)x^Yvv7Vs1)*0kjF34F`QK9Iy_ymN*li{OZl zJw}9tDhn;uEIX9#zO%QtXTt%4OG*+LU$&o9xCQ-_#Llm-_;9=Y9tJChe6;sM5l>9O zPDHiXFeK9+0WtE@zJry}GY+BCLEE)29sUd48f}^a`4x|}4G>gUl=NjEx2y6L_IGR@ z>Tt2Zn!fteTQzE`=C|!fC9cAd*kIXhrTEzo*oc*|r`1ov);(5Z6JIOpSvx(nNL)Y| zKl|Q#emTJ1&=gW5zzQuEg3Hj4b~3#jqKAHXvvVe!U)|WGtS3f6D6W*s3{$aC)4+3j zt;@KvPy$3B$c@M6p;;DZ0Yuf-ZWra?7~d~5?{6%<+B4r9j0!RTRZcA5RAv6*c(!ni zNJm~?ndj0*j(RY~(}atO>Y{0>h9N+XJ}b3IL!Fp~ZxsT3WnVEgiE-Z`Ib5jBA(g=h zmSMvLemw&GGs#n}XGP!uiNx)n=%_FZ@I#Av|FDMfa=Ds%1KRY~adC`3 zE1C^5zsiL&ptAe32%!BqY5s3!Za9eA^3vY#$cucTqE!Fs?XP5X!H_@`ModIB;JjQh zR=q$2S|ERV|CwbH6I(GRr;n41W3NVBUDqx|c;?c-7D6c8k6^3{nw?4(olRAx>8xO|;r( zz1{b|3AdKk-J+m6XG0?6WEN5zmNYfWz&;{;(vxPJ9 zLAevsGgrf4-S9I`EPA1vp)o%6zYX)T7YuhgAB>W1bP{Eb>ik>@MH6{G+sEA%@RAp! zF4es8^-1KGJ`2D0AEYCe=C5{%8~T~lQ5VaMm)(RdJR4%2v$_KqePNy1S0^Q?=mvHVzidXmgSz@Ky*)X%QlTtcUq#N5|*fN;nw`g%4)ZfM#rlDa$XkHL00IZZ&N>IbINh<1&!*Ia{qO~6Z-hYZU*(PsP zzi`S%88^~@!T-z;LtE$RFfqkC8~_{Y7sK+>?qs*CUuIKmYgp-vJ;y#$|6A0v#U^ig zQX9L`C7=FqqA_y&CF;lXxm+HcV zLamHaUxDGz23#|P2jgXjm1q#H?7X1UQb2{BjT!#if+;ya%$Sl79tQm47EF|If!-!s zdXB$T(WKa9Wk>hHddd0p)02jEw1Em*yjN$~i3=^L?~8#_0--e>_cRI;A51In)gk$i z{1REUVF4W3L(le7I5yiPC6pn7`Q?j#V?gdb0J~AOwCGJ*m{jO}*^~`fl7(qQhb?wq zK0e?sVq2NqsAFMCkno10|F&mfQ^3il_-g7J=4qoAE^T~Irm1%uK#iaJ{;6pkQU5ZF zDxS_&;8&I!+?3dpple)`yGx4H3n>&CAkI0>TZ*Qo9V1$buTw<`PUSAT>hNkD-;5Sg z1I!A4>)GWP`VnME{|b5x!oE+6>Ig8YoJ<%XqNW*wCxF970MXGw<+UBfC6_lJJ>2+aI%Y*?$XHz~Yc##mD%LCHF$U;H_cZ9OVgSkszs21fO8+h9nWq*{d9%HFl=J z4?K1RN}+j%FnW3x*4Q(#*A95PyN@*gPA*nGvU*HX?1lkkx65liFM>rr%zE_s++cr) znFoecRKD?7SeZ0w&^%Eke_hTEQ`dR~`tgAYM12=OQ;CkAQYy|{~*iHW#syGl1vN6op7 zor>gD?yQXchGK~_X0}#$BoYOoqQ9V|*{`mXCF~!umXlp#gOqEEfM0~DXq`;dh)#YO zFk;m?@h<&~C4Hc@9TWby0+1j{1IO&?iMcJGH}XjGREzGTx&P`*ffSn0gnG$zE9^qT zv=alA4|VZqqcV$C(AD>;l?~k!3}q6AurBJa%Gs@*zS!)az%a6}kVmo6e|;O|`V4Z9 z0yh_K86A$c+PsU58OXS(9jIZl!~|?Vge%#=y^npxxU)6Ms*Q*3^%(~8(bg6=e0CBn z94s!s#gcu6R2dAVj-7CeNf!L{8DwTe#MQ#<33e&Hj`4NbyC-IUjw=^=Eho!qh*Icd}c)=t^8v%@ zn6$N!enfa*kX?XY$#wP{sStOp_h2|vu(u>V60oBOsBuFeae)dAnv+c+b8g4H8Mati zN)~Sp%w;j#g4M-Fn#NaKM$<73Jg6ssr0;H$ml)U}z)P&e(q9=a*|;Bq;X25V_yyTHJhF3x&LCdpxdA;@=GDr#wgKG*w z6*2QNKsb>O{9KW?b-#}|4#ZN3xcF=`a0kP9@zDd9QIEZXchg5@xYYQCXLl%G6jhke z>qM``kcF7XiPxKL`9i>NQuJNJ-d3xLlG<80hyWL#OEug|aRyN+F>?t#8T9k!Ck)Jj z_&)h^1q>v+>5#2m7JD$>uowM8zO{{=lNHB(ntz55htCuIjeaJ7d560gvbP7d6GrIE z$4{qzK`J|rnA(YZ21D+DH*0l)oIbfmKEQ6U&WeSta+!CZzdpR?_qWaSk>gg|qd$B<-!uf{6olap~M6rj3t$ZtL`XbBIyQhg`<^u)y`MBMgZLnh>N?*^PaNgE5*j z*G}K(GVH>$48%2l<^%rW%Rzz9Bvs2qoYk6<@Tad!aF%ydgg*H1MBaAkupcXsNMvAX zeC-l2IyNSh)8pbANq?FZ)=U>BQ%cR)xDd7-Ddp159X+`ab}8OrUqck=ddNA9sm#X2 zWK`IiZ})Pn=@90c7NDULp4W_uBePDRiimEC2&K*}aT_)<(^O$KUNMjHY5x#$h8Ls7 z2zI)nDEi#Jyr3Gs!nzmm8q!b*M-5TXJRs6p22VZ=)F^+m9v+%X&Mzb#3$y*rUmviE z$0|V~?LEtEhm462aoBz7tpQ?zNF+kjN)^Oxxo_A*fDdrc2T6qfKNk$hckboa!~ll? z5XzV0=7d)lv)4q}ZS4j7T!viJxs>HgmUSUye0kjXLwi{9Wt&C7kk?n`Ro;*^WB+q% z*2FL|J|ih^2T-pZ)5nIY0325XMBz_~p}bqskTf&j?!QU#3lKo{ZYc!zS9J^K57%D% zOYyWQsX~Jj{RGz}qV7GT2rHn(VncPJz9YT45aje%_Ty+0O1n4h%jnUFC&abo>$Nvi@R;z6e=xC=rE*D8eKsP0$T3Hr_?5AV6Z*ZW9&-!(wbeCfmKDnTq z?7Fj#0LXZO(Fmv;#hRY^V%Xo}uMR=p2K}r!HMtqo++8 zJk1Up;_L49fky!; z+2^4*anIfli`j|BUbZ+@&7PZDuiL1i)`=WEE2y3Qq|slW)uvcBBt}*ytrTq*3gJ_y zT<5-Vdye{RB3NIRm!DsXlfUzPe8=5J9q2LvE zkPoUe`qh5(%B0*zRtZV#R35Vd#nRJ_|s>+h#gFy2#AelkY?IS7f{< zkfjpA6#Wx9B%K$etbKxRR3-#-)xJ&ugJl3L=66zaiFL)G^lm=MAO1zeuB@IReMc#v>Zrs-#O3`t-M~bd~*xZ{nV^bhKR4)Pq-|x{nI>s^rf{ zq_peYVo)1q1x~YAnjim}EQ4cu9Zs8EZCU5qFPUM{Z}}Xk2S9yY;K1q8r9(co7vG~Y z-dtvPn{eza7JOxf%i!6BmX-N(WT;~BmVsr0f`a5`F6uE0i=I*BCwYy%e8`cWkg%U! zWtN{{5RD|mNmh1v?EZ(QO=Wk_rM_j;S<3O^xV-Bx^3ceO<+z{|hM#^HXs9DexYUxu87d?{&pi|7yGIaLe+*(ccv6Gk^=eoAy zD-+d%eXaAOZzop#?*sr{2z+*S7Cqt>0Az4}yzxpTxeFcCxYOwk1)3|33OZ%rf|u?( z$$U=Jj_@AmgzS*M7H7pCKc@0ze;o*>i?4pa7FX?!rZ05pbcS+(&pU0+uwBdx{ff6HLSDyo!<( zD=wZLN3CvSfp-)R`rAnXtBU23C~*BxO+CTDI$E_CWux4AHsF~HsY6rEq z%lFt0hjLsCphW2N!{)`ZoRyf7?G5m#Xz0SC_1{`mkHu&nl38>ppj z=V0`sK@vnjWneh^OH)E0JCs1hJu{|KUJOzP_PXeyn9YVVViO91i8^93e8x4I`~=_a zuIj0C$7v2cH!1gXR+G}D_c+49tBnqK>hzkZDj~s@AKhDAOOdZ-c6`Sp-Lwlk8!!!Il|sk66@lZp`cZ`=JDg7RA5X5O=cM=R{n5@p?%AyGM&ZH1ZhH@ zi6FaPt|ym7Jvbldxaq4&`&}-h2CUua^pQdYLwWb2V2X}nn_k%6w3o#>5zSJfGJ8qK zgCu2WkI;?%+DZOFT$Rk>J}~$@k(mvk%@{&s>8#>_rn=C~iQ zsY{Rj%>rUe=X^v7{ORqDtegFgCH{EyCVV<={3BsU;SiCCxCwo z&xgg{2&?LBJG%g|5}X3ImGdXgc9iM&PJTfc~sVp1CtBb*oy?_}A3JRq8UxPub1~ z1?Y7NjJ4?TF|=O^Fdq41HzRK%w@tjHGm-ZiaT&)BEm!7Stf*RGw<>>CvT?e;!s`@q zMSnIapfvd_Oqs+`BJP`bhminJ`{elhn#WaFVG&p!T?G&f8-x$yrK$+K<@c3I&WjGc z;U4z*8-#q6zCubUUqt`6Z!dv5;4im1vqmi6llUWjbjdQWwl~xIN;+diYwU!gkW313 zEB%PuMY&P@O4-f1N_l^oXktCM75ex&Nqp}d(>U=lsfuhXt!4+EwhrkAv*dAw5dkV| zy4!1bHer4~PI9cziuYnuypxn2w!8|GK?A6A{lbfZAhWtw495|vL4Q;pd8)UrFP*=X zmDxY|Eb2;H=CI4ri{ z*v=_5@yr>LM0ZzN%JHK2PXwq)GYLbJ0Qhy?*LP^e-`~@fuc%B|N0kjWBZizF5rb8@ zv4=&ABCy5-kXakwOj>>(Qn=T6czzvY^F<=0-(yb_Lqip0{iR0#^PfCNI+lma>}M^@ zI-RB7{D3w32{$aBJnD0-_#p;S>zRDA47_5Bn@f{vGyR3yF@v@4lU&c_>Ljl_AScaa zW`9!s{iD{~mcdQ|7MlpGw=X9C_~PLt+Aus$s<5b;oS8+YI3NSe(7)B?fmM?lzuEdZ9L+|ix&|Vo51nSHQ=&6T5zJkKijLQ)iYv(r@2=A?0|5? z8?AL#(*Y%S`7Mbt!9JlgAxk4M92%3Zq@ps=*~YC;jO8X^t=n97$U(E|eag=>4UEVU zloZc|C9(ug@wa3s{UI%=YS#94*f=zGeL+T{Qw62>xO;1SfIGFxV$>fiUwl%kV-!6) z20GKH+#KGbvy)Vc|ClQRzghu6hC@pHuDM{3`DA>TL2B(7t9c?^>phA66$`ow=!eEI zOV;o0*D34Igll2L=b$JIB8%N}FY@}WRXu5J$M*_%GacyWb9(R!*0TP1rO9|GD_lE| zs19|Rrzz}IIcxhu`W&R-)PC|)2(}8-L=!+>8Dl?uQ_S=P-(KACL|m!tIc@2{5vssi zY}cqqY+M{6Mii*j+jZ(Nj*n0H^7Zo^Zf{aVCD`5JmLJA;3B`~}7_h1Ehik%23``iP zBDzw1O**xzerW{7edAejy5ZVl_wME$y=}}3KiZ$OelmQ&omb$r82H}zTnD$ZEWP>6 z=~%bfCU4gBj$+lQ{ro2{NC#S!fwP=7Ja!+PUsPt#kUafJQr;&?qh>fS^#Zex6}HLx z!J3~6ow`N`PLK(Qb{Yflw!5ni+W6kO@UV~`K*onM;qwLS2rE9j7(ufW5c|~qhWR)` z&Zfi(i$<(i5MLG5bH#h{!`U#_F}LBnre2tHD`-r*xx%J5DZm1Q1a(no`Mf&WyKU5T zIXHvvp~xnW-OHo!;F70_b&cjrv0GgINUvXI6Lq&$QVG=~+(1nRP!z2xAr45OqCL09 zaBzF?NE*rsHs^-^CvBU{Q)MA~O$e2;jWA<2lj*Wp&8D!UAjv3smjNolIm#5OUmp}m z826YQfe*$P1(`T>2thAXCI}19;<6H;8o;-MCKu0`a6XP0cJ&Z2 zm*qS=7obG0C?%jd!B^|U2HX2gahLNQ(59Ahn_hv3MLL<~M%1;{4DnlQ$|WC>f2yrE zbn~}OBb`?zKYG8r|04slPr$Fb&wiLQF|vzcrrbK|CW)|K@Hn*DW?|fH(Dm^0it>&U znbXKrmR$%?=ulD72C^qA{|jZDwfF)8RG#CuXnaq2rhxM~8{AVp2tS@OAaUmXHQu`Q zI_&?o0I>y2%yzU{cJFDD&8|8ANS{!lQ4tnF}tPbejkOz4g5t@t!^op+Y+$%^^oI+l{Jy`iT-3q5HmSOYitXQNq2lj_aZHANVF5ik@)8`GZ*AsxN zwO5b;`d`w0HL5c>0I<vCc^yiHE&=cfBSLcNI!hW&WeaO zX2DKpX|>H(Ps?`We(5mxxLwpvy-V#Y-yI$5Q^D0z#Ky?c57lx^n}0YakwFJdb`SF- z(_{%~z#jQm1ZfxwUyk1hAYy#DP8PaTMPWM2oqcs!mI(v(Q9d6``MNW}-P&2jPR*yL zU#JlN%7(mIP!B{5CM6~P8!R7r2~yUtLlI#E=-cf@VOhC>CQu84=nHZY3aalds~QJ^z$)k#qGI9xzZnx1xnoFAOgfqw<=s@ zxGGJ?m8u`~rGDSs0AVm*cLEx4XlUrueyiGLPvG<^7yx$0PEM9>-Nb`U5VWF8SvZPMb2He|gm zdt}O1!OB`HnC#DuD?>wX&QF@*j%AMTdZgXFJ6B#DTZR+f@gXPp&k8K*Y9W41`av{e z=?k-jTw;5Yt^Oi+BkrKvQTng(@IWv6 z$j42)hcyJ3S*I2_h8>cWiRIgM^LnN%Wyx3=drP~tRQUlx2cjR{-~RpU7i9j2-xc9J zGH)VIY$1*$OT>98;Ovvgq3P1RUoh->6r1*lg!WKYbSfb^IRyQ{YFui^*R6IwR}~3# zzWrANiSkj;qaP8LF!0*NbcyySzCIHZyN|YEqnMvr(P7Dl;b#x5QojEg5gFXO&bShdZ zpTL7zTQl@zzEcb%W#g%*_Gg(Vf_jSFY4TrYVmcKm#;p-;(L|1m9IxeQU4H@e5N{T2 z+QFRs_H}(8pi4BYQr?c*n*~o;0K<&~%hCmk7EqicL6lFwnAhPzd(e0UW>ncEg9C8o zJuq#=5gxy<6rMyOt_;sG?_<8kCHK`%z1ZJde$gu(IAAZv9Y<@JDgBVv=ji+B&*(96 zh8Yd`ok{42KRa`~<;%Mhk3La0Ysm)w?cGdi|C%&NEN8w=ttuZ`R`#zh2t^C@RL{X< zzF-1wGlz>EerGp`Ap4tI)4X@v$A5F57Ah1$Ag7NscC4rql_7#846o2^)xrEd$Ey!4 zckI7IctncLGw@$XpK8I3o?C=sE3{KZRfd+AVM3bG0Wc<;ioi<_+y_4QeByZQI@FEM zAQGYBVDmJKlvIf8{97@5Lcrk_W%C75g~RKZvlOOdUEB@m9#QGbYm)jrdBT*KT>1VSZYbge%v&hTFHb+G5(h^>V z1sqasPE-#AcPH{_0w9&dfsOn!j*!~eV*=+dIpqe_CtVB*-@-Z*jopVWVqTd5fgmxp6ft=vWwcTIV_nXq=f8e5t4B zcU}3z;CqimwP?w_OT3&TNnx*KMj;%V`1e=Tz#+O#>WDimw;Yg z4&UYDQCH!zn#VHas6K^3We)A0a-uo9@oSOx-{Vqw8(+?&ZXpTlhVudZ-$mvw44)y& z-QuWBlzN6l?9>hpf+q)`iBgaQ{}?rm?vj1}N(Yy5^146ySh(Uba3dm0cS~fxRBP=t z*Z%OWCOR6wfUKnQ$&>3Axsd6XXvY{DR8q1~FFmNwEi4Y%;6Hg@Ws5mE)88ZtuYX6s zIAxK0S3uOytID1>V8q^1nV%twTPv3^U?l_X8r?3fv7T?30XD>eFZuxe<>9{?2P=2? zrwE#e%1}2?QR!^OJH@d-ACQM&3@~Lxv^zgR7iH@}TCxxwGQX&l;}xE%27Xx;n&Hj1 ze1R6y?O^?=@cPD@)ep}YEKcLf=nIwc2$InodQaVFEwCbIzT6%VAW-v<+i+D{Uk3mZ z7Q9wEn|Hivd;$XJ`A><`P!sBE&mNWl=n~PD~&%+6lkE#po%qeYFfJ$@03iYXU#s` zx$9Tfu3lLDAuhe7;KZcS?#V#fK!)xgjzBlN_BAAeTP8hd#wSkoIi?)+_V$hx9nj|g zsFP`H^+B2hK&xi_tAor}KIrLnW#CK*s)Pj~Rr47Oae{RjL5sXVkHT4`l#ICk_Z6K? ztcqdq?jDm7zKr%vg3+91_Em=zV~=35`*TMElN#(b^6)m@Yee}&g{*jHC7LdOKi}XO zS@Q1A+y^yVgZ^XaZvJwv=jr;o7!16qE}6Y26VrW&1^SbI(R}s*xT`5WPpr4WK6g)^ zkVYaVCp`qZC=J`*$OLemri|RiWU$PkwuLK-TLzNVODwiaHcynaLNTUNR{d#rbV*>H zqkT~|J5vT`SiIo!JD#{l!12L+qw^C=8sibM(06v``^S=#9KisB=KJ4%RvXe$k0)|7 zW9LZegw&23In{Ep#Pth{wTmBpKRRIPdXGvG+25)jMzI5o1?)I7A^>CR_HCl|20EF+ zft$3Tc#Cb#S}K>}8cW2mJQ``tn=_**dr1HY{MTMpN8s{?ZtNRsKdIr)H5>{aF!nnB zGgNEn9A#$Qufgwn?bME)@A4kVn8Ru_e2dKkxLgnNtnqb79&t*Y@YV5Ar;tWN+$Z30 z7g3a`sBMFUxq97C>W7h{iIr?i4sz0}_Y2pI@Ib>Ks5L`0XsEW$3%G1T-)%a>0Kr$| z8ojxZ!j0-ZQJ29F05Aj9LDR?h06k}8ygi=8&uVJL#ob%^GfQ9ip24qb#gP|rx`!& z>6taR`(pPe0*+ko5B{&Hvw(`~iyHl%VSu4WLK+688$krAp`<$%N$FO)hYk^u?k+(A z2|_6cs-PxC^`-HtThQl#7(RSE+`R0I`i8TlbiY*dsLqwQ z|Ez8zgCxFGdF^P&xv;4X30qnfLE!e&-yOW?8{8z;Gn@hwZ&_lffsKYNJFw}0x1auP zRDlgZ5(|V~pzIR+_0i=;lDh978;&C!tpGoO1Pb;!1 zDJU)o&=@IJTTWlWRr6mx)0=4Uytj6?Y|RHl7`@7}P)rC`zbw*&ntJ697z6B+JO$&D z+`pP}-n-s6oOT_ zteZ&n-JI%MJ{~!5_6OJ@t!KNlBrV<-%f`Ijf*2`6#8&||08(4$SIzetnPeUV_rgg! z4B5{DEP20H$(`d%&6+|=OWwfWk}~!G7{Ra zYoQW1SsVIQog#vwQPZB#pajq&mMT4UDSCYO-lF}7Jyuxhqfhcn%W`yH-p-yEeEJLb zJEIwLTn)?z;0o`13MR&ngRNT_BjVr4L3{2c$0a6vWso8Y1$#G56O@a9iu3#%QXNBl zFgu83`60NcMF!Kn)P&heF=z$zr zLwvDd7wK{wZv+PXNV+Fvsn?=9Lhz~NBh*qx_2&R)?yF}GK|6=BsCjyIsY`abQ_ zkp(5^?Ka%@VRFWsp}#_w6zWwraE40%jh z`m`^D53N2MsYi$P<=?FbRGRK7$1e))D&gKLb2nl_7{c#3)ckDIO5ff+Da<_8bL$e+ z4)Bv0U`1qPT1{eWvJ#hp8?UN5`JamhffC~V{*hT)WA#+A=(XG3j6|{m1hGL+VRAn2 zv3T33y+sN5>7#z#AA;*+=?w{q*1Vx1hj%i!m|PMg%litdqcRxarHed5s@GuPa>NfI zNeMyHfuy6;<54n>-VKr#3(AgIsW|OnqLPX znANUsCt&+ig#$z;bY$^H)89=cG#3mnqHXaz>ibIl%&D2Eb-QxRzsn2*fV5_0q){0+ z`(CQh($bo?y^P$&NM5PX%!@s?GGfiCbb-nrei42nUp!`Q>lh@LcaYtjCPPidcX7fm z^*9I2jnc*ryee%o12l^QB`u@&DtsjymxvZt#>Xfdoc6^x8kWa)LSyuFV1CUr#?FLH z$(T&Aiv6ii%^;%2zi9gkOP@C2!>de#uRbit%FOZbaH-}(rKF!vDR6_{a*&NFdboSw z^e0O_yoIr11PAdKws(?(m>_c(YX=7iCZgfMmr4+y@1Py4&7#Z*RVsqHy=^ThfR45? z)7O&eV38;?yy{c)jI>eo@z|Gso*0I74!@?rSQ*3(Pv$l57NQ_2zq*gose+C?#gyU& z?=GS>j`QOnm9zz`5>K~9g7ZH?=DxJlw!F%r`?{u}*a|0<>I5 zG$s%tW*v-R6~=7H%`Ys(l!41|H>G&@u*lro8K6Yz{#FE|{AfcDtSCFwx$%Y__9rVY zj>tv*KXUFa`T*aiYQz#AFAfKFn9~&XwY{_nXz}G4R7?%nV-^M#RZBD_J8a$4v?DBV z@n-GWJ;subK3j|ZHw*wf=O3ws6mJxG_k{haz{>ml+^+hpO zW0U|&ON%5zX4Lujs`idVE4IgeV9yGJxF$Gluj<9pSMVQC<9CWI<{EpQPZowb>x;YQ z5Iye5|MP;ptIBBH9OSn}^Zg_7%Q$OEglk9MHTuBd3?^H+j8gx>BUX~n7X#FoGySnz zB`1(O9-`oIfsFYHkQp*F*J$2na3h}W_DRUTCyO7aL{n3yu#^_53ad z8(i{hxzgcSU`aF{FvwyvCqe%tBH8X-le*;H5Smqhpzq@XiE1_kW@+^o4#TjH0ITgu z*1UGZQxpImyriE?U(NXIy(|{bP1P*R~?)%YmYah9A(dVL3O+II28{%&s zu3EW!*jwp+8EY~SB+5_Iisgq}q5#js)nqw(qq@CfsfZ7iX?|%ve|T}ihP>C$<6H2Ecga`3k- zXST&^T6LK3xJ+2;lmJye0UQ$}mWo<_pjMB><=jZTK0u;`09up9qHfIUeJxi-X+7Ee zyZ%USktI`X{++!UZiSN{ZCYtC9{Md-eEO0gkiuLoc73TL|Juh(T+1IoIb%)rN%MR$ zUcBFU^YNAxm32kkb2L}D;^tRu_U#jsnAju;oeYJ4dl6*7B%KGfMCdu9YG2t5c`+<( z?KEONGD%@BDmJsWx0ey3fPIjW-*(f}a-7B=fd-Ca z6*qSt;6>FaDl8u9VDMd9L%^A|)_;M>B5jZ^)?ltUL|xBx_C~t^2*FWgbKjjy{qaAN zv}DVrMC04A8MpvV`plm&17C~Fw$sA8UnuT$!Zl7CBD{XduZJd>LW{*v07X&Y=SUox zM-OD$O-D=+Unh;_RzKT_S6XnSFg}ndJgr%Nw(%qs)vtPVczfv3o#?U1R4edw;LYPV zQ&%&BC25vAXK&XwR)*V@@$jSYlhBB*nZ{#&C(KqA`2-Vt-`AoSOTjI4G<5!?Ns|%~ zn(MX69y|aBxL8|TgB9s_H}vM&q#FUjv!9pRycpg^$qbD(yWuG24C zDi>TxnjgkfPMpHAaZC>oCj#bROep5`t`#-WZ=0(hr~`18p3($|WRnm8URtQxfTh;9 z@}VKT#)ig5i^!n&ngKv6iDX&RUO$Pm41&`o_{}?Cs8PivJ4n45Ei2C%P15DNY4^_3 z*4c{xij{x*yj{!ZB~#NM;NvF~G*9Dk*;QBeMGDKtsUr3{ef#&X6&;)>M-|LB<+Pi` zcVi97?~1d3=?Y_nCO*Gu4GD#j-)JTgD+rQ+k` z6GCjJhDA)sf_!UOX{KMTp@n-!p@%F0l+WXkj^QU?H;YZGp8oPDJotbX~PuO-P=`fe; zR_=6@vJEJO&&_P8E26lXQGm008;Z5-j8;VRd?DaoO=n;FEgyR`)P0W~N_S$+QjQ_|c~z?ZBgaS~NLl?Ejw+$Sj4Q?s6)dQqO;zTGPs-E(B6srdfa|Kh2i z{k-@K>b%`=BhGmQf!;-Wi+zwyGV{t{5+pd6A9#xbu$Tk~4Mp}8eA%8Hgeo%%^trtV zlS2-~>8L8B!;b&N?QNHby{pV70@J$UHUEA)#@uScQltCo1P?68eIu{aTJBfoKl(8M zJzmi;w#|gRKHKS7`%odJL8f%P-gsI+Gx}Ti0+S!r3X+zyeD;3$eH6R92*B{f(e>du zl`-Vlge`)(E#uF4E9<^~-3^L~iBWx-^yQ#Lzy4sowxtUe(V-BpM$LUiX%dbjyiP$) zD=nBVYv7aq)UV`gqU*djKhBk}ndi8j=%)eAzAQ0yD-4#vKkNAMKRCOk82%hywg_@J z-VVHz^GN=(N@_oI!S234^M>iur=K5tNBa#Ts5Jf4_ugS3@S|ORp7e7(Ci-e{ZXErM zTs^q?jzt6{pyzITo4HzVm>Bq67dkjNsKlB7zT)~P{%WwZ#4g1T}}1oO7p@Q=w6)@a9SD!=uYx|VH+v0pQvAwyYHQB z-quxX-A)AYEZ^=z$@#MU%VC?fAFvZq^5t zobID0=4ZD}!xW4bn=#S_o1C$=OrgQKKhP=+hr4u|-#Yj9tsrL(b zZQ!ZLO#LIJ%Kre;w2)QGdE`x@?oGQ?8{_=G=EFvx`0*8Y_d49FmtfC72}vt!@G2rV zxSmmy-!3%@t%PkiNmeAQs&rQ_hbB93EHRXs|IE=|a>k|SSbo-)N+`v8wmYBhchH8t zpPG{9P1EWQj0=U4`LjF*NKq!G{hW9sY)#ebvu7&TNqEXyux~<*=Xsgy06xaWfpVA@kZF#7=t5y z-KY2(g<*p=RNllu_|;VncED*Fc34=LzXRSqEJnjBTMHAw1tf%pg-clb?Ul5~3spXR zFhUv&%a>UP3@ROy`1D5%D6{4UL%Vh)71=<82i7%qtYQ)3gWw~?f%K8L!gwh8Na211 zX0yCZ^#1IyRgqPM0&A`ybqR)~1Exf-9fj7rl+8^u+Uy&=Y`{ol>}e%bIws$L>rXVHe?dT2RE~xUO)OT3fz}YB)ARF+V4WrYFcQ*j ziD@9mdAO&i=Q{qg_80IH{aaMTED=Hg4be3R5;WzW#4`Q+<5I&ZlM;}rf6{s@$@&8S z$f6J0I(Q-g_8klg%2Uw*w=ccRyf#fYnhhs^Jle@|BS-zNr<8rer~rlu)kmcmZ4ah{ zX`t-nDZjO&KjZ$LH~ez?Ccx6j_x#yL>2}3&h%`ef8~cB&%kg~t5dcsUDac4_^Ei28 zlEiCOIyp!l;1wD5d47&kcq7Mf6IR|jqJvO;TUnvz1tQ$(cB(@H@X(`OtT*o|fg^D` zH!wF9nW(Dv0;DfQy~u~e5iKR6(FU_3b~Rjx${UP{+*>6T%sOd#Qk_r?IID8Jsjn+O z$Vo$nMo4=qCd@0gRJzR+bCDD(Jj9pJ zPBHFQpv%cGa(6_smfrFf+t9CLR_v2}$h-O0X0hvUAainb@fny$D0_}qlu=^F9+!rJ zE@$I)BSXTliRcE!!A&+su(b5Ysk8u6bhCcNd0!=U6ELG&VRSo0y?7WSqL=0VD!f*M z6@FSzgI-ldJp)=5jty1hGR5Y+Ol{vvy3F3cY9UdV;;IgG5vUVf$*5g7>9XMfJtDa2 z`X72O|2g?{oZat``<|U<#$~(AkiwCiK1(d8X8G?Nh$u21Tcyccvuhevn-*7R))|#!(^BMdqedR4Dk_?qasL z=X}F87<)=z=Wut}#d*U5R@FjdqwJiV_Gg_M4!cGEd@*XuP{)lGg(GHRNJ4(}Ljk`} zkou>7wQYq%pUYJNR!k_zhl#X+shOE*{-Nh29C}|vhSxc4v1M1QE9^=A&hHhY#m_}~ z#U6(?8I5fmGsrV}F1B96XmtC_yD7#R!Wj8;ztwr3i2QpD^W>Sr1C;VH!7KC87pCl74J0lLmq5-mw{ z{?;V5ceBl_U;Y}TM8d#iedjAmyUME*9ncZW?ZYf0)Y+ZwNqkEr(XQ2auK7}@Fkmr!+pj^-=&)h9G@Qo@#Qw6KU|)5XZwc{ ziJsP|6Vb$(>lB)P#5S!U2P@7btIK~MUNX1Drb&|KuGp*&i;1?8!okEebfdCsxMFWU zTBEkvPJ7C@bgtxem;sWc@BFYwKucz-GFAduq`0C(FjyY}z%>qs%WzwA?LcED0F5d& zTPaex&bruj3i!NzAFf!R_Pb__Q`lk&2@#`%iPBw^z=#-PBf5kia!B`*yk&-^AV!44 zZK-;xu&RK;BGzP8pc z);hc91pS{%R-E}3ek^r-h_JSOXv>Wu1t*S#{c)PA-2Ab4ebIge#NGRtl5f1^d>XUyKsR|iJ^U3_u#j}%ZwOKi^F3FuJ`Oy>tnr(zMIO^A zNF;CNa%ngJW6~QI1_xo5VPLh|{Kn$OC4oVn4qi`pPnpg-`>u^+p2}2**+@P??os8W z3xN2*b1B*4f)R&KYL_m|d6hbLg>|Eyd&*3zl@$8?jk*d+l#LVvniA*j%y>uedPdjt z@}C)JuU#KFY;1;2Zgat#Y|=p0wWAFqoL4|7M41@_0aeJWbn(Dr(Q%(w(){`HAuyL> z_Dx!m?LP~=)`$*ff@ZXua>}si`P@Djf_KIH<#SUwP*4efcfH68#7dkY(R(h#;@3@j zhF+_SoCe>&1Ov#pXcJcG^h#~jl|4&Nqi!n!pc;?nYepgvL(I;YSSEFeK>&?7W;X?E zp|zuJd)4Yd<-1iy5Ea(8ecYfL0~z6`%%Y}~G+TG%`*x}GaPbG;RWB=9HBO{0l_<26 zMd=|@{)uP;>U;HrLf@WOQ=hducdJW!O`@_sJwnd7HzI)G-;JaHXt3UZ0rB0G0?-uk z7Q`s+q%=K)w$4cHyMB$M=pV|typEGx}jCzz1fuU3p!_2LzXt^W? zr3t>pHm`*CtjDH!0&EqBtoNxj4*(&FV1ANmWoVJ<kk?J^5Uy^LAsNRgU!^TDeIz8=|5DC~_4q;dV+gv6b41u0U9^^C9tQv_lZRI^w83g( zw{s1yq3K=|keqr^AkF-x`1$Un@x7iM2t52_Eue_GesCEKe{gKtBt^`}TsDSeCDzuC$pTb{!n_t6XtF`|0Sy zC$i0BNc)?n{ui+3ry5KU!^bGM7J-}$d(j`hdiILsjrT|NXt72>o|bj#KIE` zp4iDF6BSKu-{E$2JO+2*U9R?2KQf>QR1%}Q0(XH^K60YQT#1+*&zbp9Uh}kn_y;8C z3H+aArY24XzxlXAi7jD*Cg_lkQUS5=cehukL@qzp5jl*`Uj4^uikmyX+Tx?$@yCWG&arX^;HZ4Aj2 zB^klt-LA&@#JZ+RzMAnkzV8v;$2afHh{1ZwDJdzP_M(J38f~Fy&c0Z4oH*K42vZlS zjTFk-hM)ZJOzKbp_qy0Xuo=@s6uWtpE(XNvZ*uN-Zvlx(5!0-6M@Q;nh4KAFmY7c# zI&p5?3QVroMx<$R-81f!Z*1)B_-@zg8Q*T|l<8*fpI;+kh$w-aTn1c)I9h5uM}QUg zi?edDTQ&L!k>?^K-~kD(q*hz2ZCM(kbDe9$k6JRJD%zDNjkUn>Z=nZSjMk2hFO-z{ zLCD$&g@cTi7Abg{Kmq`x>^kODM=3CKfKXN=c7QDX@UH8YX-GxexabQ5>A8BWEew%;qY}BQ4 zOW8q#=k)y`2wMcny+#1&qj|NjV7K4$06@0<1k!*Ew_i^uZ>DElhP;do4AQe*2toFf zwF^g3n=?a_F#*6yus(#ypoXnsp~r^Vtpj{6LY87i*YkRDg~$o-gMa5Qn0FmcTvBfy zdLxydfKJ&PfBK(B^i))j;8++SZY4(>n#lTS**TX$@LSXTrfZSO9tEhl6eCj=!GQCU z(kOdD>~7_aFq?HTg!;=Wm|+}>31?z2NBQ$_tw4mWSaM5qjM>-reJ=+?<^$&oyCvN1 zHRE(@V9gQ|nn5U)W5+)B8KyjLyTteOsfGQ_&&w`7K}TPFUGaPW^rLMd%%^Lg8%i9A zIbXWX*gSjfy;(^ApXZLMq6fUUJtEK$sI8GY^OQvP3u*{|B_~u9=efYnK&q?W%i_ql zVglSQc_ZNqS1;i#tWy%R(QVM^zd|+b*AA5?gRTMG0F=_hCDYi;G!nUFIis7xA zplJ+DnVb>G0w%cTF3mXNupysQA{B7BY;TBj-S{zHjZNm()TWD6^JiZf8V=}rT&z;J zTaGLItFpm^u`Gd&alzLDUneD zH(ZJ%xGhIc=UuPmcx(wQd(n7G{&!6z8F~3hqt=R^Nc2&*VTY1>TvSGdrAt!HLtpqG zRnAk6f9Zzs2;x!|E&>%cMs~?K>p&d&1gSW4`MA>x&e`wYf$igF42iU202`UWx{G6G z9MNRr>So@%`);$5#nj*GX)VSAY#I2uRKF^2L;_3AKSiraYq=mpOuW5c1soQFgwCVQ z;($+z#R1@A3a)H8i_+4OSG53oc}P&Y@CV!b`-^nxX;cT7zVo21FPJz;nH?glv2=R1 zbb8rOfp)n|zg~RTR-Q%=XkSEc0qP~noDdi{J1KYK-D?xBpPuGFFGSf-ItK>Q&~L(m zxZbv##*;T~IV=9eqc}41(ZGb2jh`OHW>tHZ)pX}ih?Y36lV3|{DVlCj5m%4*7Q~~M z)CC9{&vz(&kNQ{wYOVGc!gnE=K0v1`CQkq@5Y>pnh)q*ryzt_H< zl_%Dj#_<7-{Vz2c$&}EPGR#J;smuvlZd>Dp+&-?#)#>y^muKvDem$aKWgS%(KI-hS z(lr!{H(kE+D;Vq+u(esdPfJ7Pjo->l`sVtIS^>FW4J?^qM3u(S2|1f6iPF)ZcsK2~ znN&(AF&4z(6lmfAFmU`r)RWQA8zacpA4ZfWEDDd!-OelntvC-8yVa7FMc5DJ5^Qg8 zu9bep=K+zAc3D<;tJw=R8b5mr!?n#Ig-2VY=C2M!5|Z9($-U9@AVe_%52TRsstn>J z(%i{d0Bcm#?e#g4==Gcnk<)DRt)4sPqN;xNrK*iV3n8%jzAb9=zl72@a2d6fmTW~& zZtvn_LRDnoj3m|a#c@F3E^7iVgP71G>_lEm?j-e@P-||0^%O55NQJFe8=Tx)_d+qF zG_m#XO_^E#Ti$A)`C}7=F%)nzc`P7~fy1*GzZ*n!q6ib{S`g4wWh(w}Yy(5#=v-MGi+TCQB9+;3OpEnD#>8|RFVt-Q zu*&w?Yu4vHBmJ_~bo)JC%_raK?m1BZE2suxX7=Cp2HqmSzhe-nn4G0Nz?OQ=%SeI) z&S}bENY4t_1i5w;y#8||D?bK1PJqUe(k~$4g!jvrLyll58wONLz0F5eDdfk=kH-P( zio0{Sic-dzXX_tL%kfbiys?VRykcN~p6m2ZWu#;%+xzdHDL+R?9#x z+gA6L&ci>o794T*k&oE2Zh56`JXsIFH*$>)0T_`rnA41l>5G>yFx4?CEh)Okt%kGw zs;>{0kKN0DYw3`gQb;9{Y1=)Wpyt|WkbD#^nG#3xSXQ|2Z3;WP*?V-JGQ)6He`O9X zuO4N}-JIqKV}B376SO|xezeSgNPIULF}o_QF(CS6CwDyFW8UPLCOr}S_0a3Ma8 zy2FlX`PN*>|F{NC4@yzQl`AeDJBv~L6cZP|oLpXBuFG1d4Vu`y$FF)&+(Yl63f%vy z)sUPB|D&xVcF_~hV!Xe%E4E)V+ZbkwV6&A(^>OCw+U1xhG4zc|5k!1>fs-SRwc!Qr zjYB#)?_ypAN)y{PeWU0*<}~o|N^<997>n)tjxA-SsXqX&&J& zPw@|a!FfFi`Ad<<*!Gs@_2S%XI(phBq36Pv-0+~sfD=k^MIJq@=c@{|M8es@8uxUx zG&H_H?l(q{9qXoz$9yx{5N@mk8SqDrfW?XAWMtOnyY2gj?c z+xaUi0nPrmSD5Hzq}PpI?2#cM*pK^hyF!2!!x}oZdFq{gvwOHwAwDyA^Tp`vcMDlb z(l9g#_)yjyaCUbGNU7VOp&nix)=f^jjoJal_IzN7ZFXDZ_palJK2xcXDtFpVJ71SE$! zeXvfeG2MD%MAUr9?}sR=owq}eJS8A-%-^2phPQgycS$Wgl5xalk;}iKq7h>UXRQ{eMb*p9FtlyER z)Bf?P(f+tMI3g5b_`rh?y1gqr&yd^p#Sd~q+wWlX-!Pwbu&ohfpUpZ(^y1hi8SsBwaqVnLf z8o6U)1iisLMT4Gkvh_R=a}2aS72iHF=>t@A26^gl3A{7c1c}%2N=#YEI*r?nwq!3a;2G>v}f11Z?+~`a_BLf56G=2mSG2`*aRxE+Gf

6fC+Rr2K6~5E2QOp8CEU?c`K(b$hp|w!Ypo8QiAS{WCyG zQes6?OckKdd!IArDVc~x^la<&YR|I5qq6zCySkHryUO^^RzrDIoIF4!TSFOsa{Rts zD&GmBF4#q`k;-?Y2xaZRuYOdp{|L>bQ3+*SmNJBEyRmBAN9MuHx37{c2*Nv-W$)M4 zPL7U_T%V+71Q+Z&mZ$~vptI61z+opfkFCeCu%)d5?7?~tAD;;d($%K_YI^ncyVjFm zF-0~-d8~NjUZbnnSfKS%aCE=;TXW$HRObZKoh>wik{s=4a^&#q{RgejB8VP7-^K9l zh8Tz04ls0Hm;!&O!pU(cti!aborrbG38GASoE4l!(wcqMpd^4!K}ccB^i&#r)%E$R zYuEVOeouhv1J}5~B)*{&d#P=I6{o@kl|H~5^Gz|jWW%={D`!c8b(X=EGbMD>BTQ;Qs%Yi(xWHM z6QeMxMI)y{DyxBz{j`rAxb3qr_;x>UQ`v=WI z25{kd@ArUGbA-aKEr&1EJS~nfQ9y-bv(%O~DvvEHudnKhVjLr05E2J`#4$#oDT+I9 z-l4GbSfel*qB?k^{t894^B(ja_%3EQX03Z?t%sOyXre?gD+n>KG9W&kkYOD3$3;51 z*p$!eaj_eAM@ECn5HP_RzcXg!%w?hUa3<*bL~3 zHDAzMM^Arofr&HMnSOgyL<~AS0R>rAnQ|$UAZ749FZjH_Cj?XgNk9Qm1)tJ@8u@eO z{%ijoft7y1Ujc*mf&XIM?(cB{bwC;XcWvMW_|KYPPqe`!O+XHi1>b?0C;!uUf&bqR I2>8kW0h0=QvH$=8 diff --git a/samples/FFMpeg/scaling_video/scaling_video.dpr b/samples/FFMpeg/scaling_video/scaling_video.dpr deleted file mode 100644 index cdbcd89..0000000 --- a/samples/FFMpeg/scaling_video/scaling_video.dpr +++ /dev/null @@ -1,168 +0,0 @@ -program scaling_video; - -{$APPTYPE CONSOLE} -{$R *.res} -{$i ffmpeg.inc} - -uses - System.SysUtils, - System.Classes, - Winapi.Windows, - ffm.lib, - ffm.libavcodec.avcodec, - ffm.ctypes, - ffm.avformat, - ffm.avio, - ffm.avutil, - ffm.buffer, - ffm.dict, - ffm.frame, - ffm.log, - ffm.opt, - ffm.pixfmt, - ffm.rational, - ffm.samplefmt, - ffm.parseutils, - ffm.swscale, - ffm.pixdesc, - ffm.imgutils, - ffm.mem, - ffm.error, - uResourcePaths; - -Var - src_data: TAVFrameByteArray;//TPointers; - dst_data: TAVFrameByteArray;//TPointers; - src_linesize: TLinesizes; - dst_linesize: TLinesizes; - src_w: Integer = 320; - src_h: Integer = 240; - dst_w, dst_h: Integer; - src_pix_fmt: TAVPixelFormat = AV_PIX_FMT_YUV420P; - dst_pix_fmt: TAVPixelFormat = AV_PIX_FMT_RGB24; - dst_size: AnsiString; - dst_filename: AnsiString; -// dst_file: File; - dst_straem:TMemoryStream; - dst_bufsize: Integer; - sws_ctx: pSwsContext = nil; - i, ret: Integer; - -const - in_filename = cResourceMedia + 'trailer.avi'; - out_filename = cResourceResultDefault + 'trailer-out.avi'; - -procedure fill_yuv_image(data: TAVFrameByteArray{TPointers}; linesize: TLinesizes; width: Integer; height: Integer; frame_index: Integer); -Var - x, y: Integer; -begin - (* Y *) - for y := 0 to height - 1 do - for x := 0 to width - 1 do - data[0][y * linesize[0] + x] := x + y + frame_index * 3; - - (* Cb and Cr *) - for y := 0 to height div 2 - 1 do - begin - for x := 0 to width div 2 - 1 do - begin - data[1][y * linesize[1] + x] := 128 + y + frame_index * 2; - data[2][y * linesize[2] + x] := 64 + x + frame_index * 5; - end; - end; -end; - -Var - Buf: array [0 .. 511] of AnsiChar; - r:Integer; - -begin - try - if (ParamCount <> 2) then - begin - WriteLn(Format('Usage: %s output_file output_size' + #13#10 + 'API example program to show how to scale an image with libswscale.' + - #13#10 + 'This program generates a series of pictures, rescales them to the given ' + - 'output_size and saves them to an output file named output_file.' + #13#10, [ExtractFileName(ParamStr(0))])); - end; - if (ParamCount < 2) then - begin - if FileExists(in_filename) then - if CopyFileEx(PChar(in_filename), PChar(out_filename), nil, nil, nil, COPY_FILE_RESTARTABLE) then - begin - dst_filename := out_filename; - dst_size := '320x240'; - end - else - Halt(1); - end - else - begin - dst_filename := ParamStr(1); - dst_size := ParamStr(2); - end; - - if av_parse_video_size(dst_w, dst_h, PAnsiChar(dst_size)) < 0 then - begin - WriteLn(Format('Invalid size %s, must be in the form WxH or a valid size abbreviation', [dst_size])); - Halt(1); - end; - - (* create scaling context *) - sws_ctx := sws_getContext(src_w, src_h, src_pix_fmt, dst_w, dst_h, dst_pix_fmt, SWS_BILINEAR, Nil, Nil, Nil); - if not Assigned(sws_ctx) then - begin - WriteLn(Format('Impossible to create scale context for the conversion fmt:%s s:%dx%d -> fmt:%s s:%dx%d' + #13#10, - [av_get_pix_fmt_name(src_pix_fmt), src_w, src_h, av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h])); - Halt(1); - // ret := AVERROR(EINVAL); - // goto - // end; - end; - - (* allocate source and destination image buffers *) - ret := av_image_alloc(src_data, src_linesize, src_w, src_h, src_pix_fmt, 16); - // av_strerror(ret,@buf,SizeOf(buf)); - if (ret < 0) then - begin - WriteLn('Could not allocate source image'); - Halt(1); - end; - - (* buffer is going to be written to rawvideo file, no alignment *) - ret := av_image_alloc(dst_data, dst_linesize, dst_w, dst_h, dst_pix_fmt, 1); - if (ret < 0) then - begin - WriteLn('Could not allocate destination image'); - end; - dst_bufsize := ret; - - dst_straem:=TMemoryStream.Create; - - for i := 0 to 99 do - begin - (* generate synthetic video *) - fill_yuv_image(src_data, src_linesize, src_w, src_h, i); - - (* convert to destination format *) - sws_scale(sws_ctx, @src_data, @src_linesize, 0, src_h, @dst_data, @dst_linesize); - - (* write scaled image to file *) - dst_straem.Write((@dst_data[0][0])^, dst_bufsize); - end; - - dst_straem.SaveToFile(dst_filename); - dst_straem.Free; - - WriteLn(Format('Scaling succeeded. Play the output file with the command:' + #13#10 + - 'ffplay -f rawvideo -pixel_format %s -video_size %dx%d %s', [av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename])); - - av_freep(@src_data[0]); - av_freep(@dst_data[0]); - sws_freeContext(sws_ctx); - - except - on E: Exception do - WriteLn(E.ClassName, ': ', E.Message); - end; - -end. diff --git a/samples/FFMpeg/scaling_video/scaling_video.dproj b/samples/FFMpeg/scaling_video/scaling_video.dproj deleted file mode 100644 index a24c08a..0000000 --- a/samples/FFMpeg/scaling_video/scaling_video.dproj +++ /dev/null @@ -1,254 +0,0 @@ - - - {48D2DD59-2918-4148-8EF9-6F12C0233241} - scaling_video.dpr - True - Release - 1 - Console - None - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - false - 1049 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - false - 00400000 - false - false - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - scaling_video - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - .\$(Platform)\$(Config) - ..\..\..\bin\$(Platform) - None - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - 1033 - - - true - DEBUG;$(DCC_Define) - false - - - true - - - true - - - true - - - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - scaling_video.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - False - False - True - False - - - 12 - - - - diff --git a/samples/FFMpeg/scaling_video/scaling_video.res b/samples/FFMpeg/scaling_video/scaling_video.res deleted file mode 100644 index 6876088a6648ed90b09c480197508e4404c57dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57140 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 I2>8kW0h0=QvH$=8 diff --git a/samples/LearningOpenCV_Code/LearningOpenCV_Code.groupproj b/samples/LearningOpenCV_Code/LearningOpenCV_Code.groupproj index 5209af6..a7e5cc9 100644 --- a/samples/LearningOpenCV_Code/LearningOpenCV_Code.groupproj +++ b/samples/LearningOpenCV_Code/LearningOpenCV_Code.groupproj @@ -3,9 +3,6 @@ {B8FFAD51-22D7-426C-B047-EC116C5C089E} - - - @@ -35,15 +32,6 @@ - - - - - - - - - @@ -108,13 +96,13 @@ - + - + - + diff --git a/samples/MultiDemo/FaceDetectAndLockWorkstation/LockWorkstation.res b/samples/MultiDemo/FaceDetectAndLockWorkstation/LockWorkstation.res index 95c5693964fd8625add9a7f4f1906fee73d7ab6d..ad8e124c720ecdca2eb7ccb11daecb0405d07e78 100644 GIT binary patch delta 29 lcmeAc2iHz+N85y@vWMryV0sxw*2~Ge2 diff --git a/source/component/Delphi 10.2 Tokyo/dclCommonOpenCV250.dproj b/source/component/Delphi 10.2 Tokyo/dclCommonOpenCV250.dproj index 50a4c58..e4bc278 100644 --- a/source/component/Delphi 10.2 Tokyo/dclCommonOpenCV250.dproj +++ b/source/component/Delphi 10.2 Tokyo/dclCommonOpenCV250.dproj @@ -154,6 +154,12 @@ False + + + dclCommonOpenCV250.bpl + true + + true @@ -185,12 +191,6 @@ true - - - dclCommonOpenCV250.bpl - true - - 1 diff --git a/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dpk b/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dpk index 6b35a91..dfa3f66 100644 --- a/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dpk +++ b/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dpk @@ -1,7 +1,7 @@ package dclFMXOpenCV250; {$R *.res} -{$R dclFMXOpenCV.res} +{$R 'dclFMXOpenCV.res'} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} @@ -37,6 +37,7 @@ requires contains ocv.comp.RegisterFMX in '..\ocv.comp.RegisterFMX.pas', - ocv.comp.ViewFMX in '..\ocv.comp.ViewFMX.pas'; + ocv.comp.ViewFMX in '..\ocv.comp.ViewFMX.pas', + ocv.fmxutils in '..\..\ocv.fmxutils.pas'; end. diff --git a/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dproj b/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dproj index 668ce0d..c729e4a 100644 --- a/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dproj +++ b/source/component/Delphi 10.2 Tokyo/dclFMXOpenCV250.dproj @@ -183,6 +183,7 @@ +

dclFMXOpenCV.res @@ -222,14 +223,13 @@ False - - - dclFMXOpenCV250.bpl + + true - - + + true @@ -239,11 +239,6 @@ true - - - true - - true @@ -259,6 +254,12 @@ true + + + dclFMXOpenCV250.bpl + true + + 1 diff --git a/source/component/Delphi 10.2 Tokyo/dclVCLOpenCV250.dproj b/source/component/Delphi 10.2 Tokyo/dclVCLOpenCV250.dproj index e8a4f9c..149d30f 100644 --- a/source/component/Delphi 10.2 Tokyo/dclVCLOpenCV250.dproj +++ b/source/component/Delphi 10.2 Tokyo/dclVCLOpenCV250.dproj @@ -152,12 +152,6 @@ False - - - dclVCLOpenCV250.bpl - true - - true @@ -189,6 +183,12 @@ true + + + dclVCLOpenCV250.bpl + true + + 1 diff --git a/source/component/ocv.comp.FFMSource.pas b/source/component/ocv.comp.FFMSource.pas index 748a3ca..0e2ec6d 100644 --- a/source/component/ocv.comp.FFMSource.pas +++ b/source/component/ocv.comp.FFMSource.pas @@ -41,7 +41,7 @@ Uses SyncObjs, {$ENDIF} ocv.comp.Source, - ffm.libavcodec.avcodec; + libavcodec; Type TOnNotifyFFMpegPacket = procedure(Sender: TObject; const packet: TAVPacket; const isKeyFrame: Boolean) of object; @@ -88,12 +88,12 @@ Uses ocv.core_c, ocv.core.types_c, ocv.comp.Types, - ffm.avformat, - ffm.dict, - ffm.avutil, - ffm.frame, - ffm.swscale, - ffm.pixfmt; + libavformat, + libavutil_dict, + libavutil, + libavutil_frame, + libswscale, + libavutil_pixfmt; Type TocvFFMpegIPCamSourceThread = class(TocvCustomSourceThread) @@ -246,7 +246,7 @@ Var end; if Assigned(pFormatCtx) then begin - avformat_close_input(pFormatCtx); + avformat_close_input(@pFormatCtx); pFormatCtx := nil; end; if Assigned(iplframe) then @@ -256,12 +256,12 @@ Var end; if Assigned(frame) then begin - av_frame_free(frame); + av_frame_free(@frame); frame := nil; end; if Assigned(optionsDict) then begin - av_dict_free(optionsDict); + av_dict_free(@optionsDict); optionsDict := nil; end; end; @@ -298,14 +298,14 @@ begin DoNotyfy(ffocvTryConnect); - av_dict_set(optionsDict, 'rtsp_transport', 'tcp', 0); - av_dict_set(optionsDict, 'rtsp_flags', 'prefer_tcp', 0); - av_dict_set(optionsDict, 'allowed_media_types', 'video', 0); - av_dict_set(optionsDict, 'reorder_queue_size', '10', 0); - av_dict_set(optionsDict, 'max_delay', '500000', 0); - av_dict_set(optionsDict, 'stimeout', '1000000', 0); + av_dict_set(@optionsDict, 'rtsp_transport', 'tcp', 0); + av_dict_set(@optionsDict, 'rtsp_flags', 'prefer_tcp', 0); + av_dict_set(@optionsDict, 'allowed_media_types', 'video', 0); + av_dict_set(@optionsDict, 'reorder_queue_size', '10', 0); + av_dict_set(@optionsDict, 'max_delay', '500000', 0); + av_dict_set(@optionsDict, 'stimeout', '1000000', 0); - ret := avformat_open_input(pFormatCtx, PAnsiChar(FIPCamURL), nil, @optionsDict); // pFormatCtx + ret := avformat_open_input(@pFormatCtx, PAnsiChar(FIPCamURL), nil, @optionsDict); // pFormatCtx if ret < 0 then begin DoNotyfy(ffocvErrorGetStream); @@ -313,7 +313,7 @@ begin Continue; end; - av_dict_free(optionsDict); + av_dict_free(@optionsDict); optionsDict := nil; if avformat_find_stream_info(pFormatCtx, nil) < 0 then begin @@ -368,8 +368,8 @@ begin Continue; end; - img_convert_context := sws_getCachedContext(nil, pCodecCtx^.Width, pCodecCtx^.Height, pCodecCtx^.pix_fmt, pCodecCtx^.Width, - pCodecCtx^.Height, AV_PIX_FMT_BGR24, SWS_BILINEAR, nil, nil, nil); + img_convert_context := sws_getCachedContext(nil, pCodecCtx^.Width, pCodecCtx^.Height, Integer(pCodecCtx^.pix_fmt), pCodecCtx^.Width, + pCodecCtx^.Height, Integer(AV_PIX_FMT_BGR24), SWS_BILINEAR, nil, nil, nil); if (img_convert_context = nil) then begin DoNotyfy(ffocvErrorGetStream); @@ -385,13 +385,13 @@ begin DoNotyfy(ffocvConnected); while (not Terminated) and (FSuspendEvent.WaitFor(0) = wrSignaled) and (not FisReconnect) do - if av_read_frame(pFormatCtx, packet) >= 0 then + if av_read_frame(pFormatCtx, @packet) >= 0 then begin if (packet.stream_index = videoStream) then begin FOwner.DoNotifyPacket(packet, (packet.flags and AV_PKT_FLAG_KEY) <> 0); // Video stream packet - avcodec_decode_video2(pCodecCtx, frame, frame_finished, @packet); + avcodec_decode_video2(pCodecCtx, frame, @frame_finished, @packet); if (frame_finished <> 0) then begin sws_scale(img_convert_context, @frame^.data, @frame^.linesize, 0, pCodecCtx^.Height, @iplframe^.imageData, @linesize); @@ -409,7 +409,7 @@ begin FisReconnect := True; Break; end; - av_free_packet(packet); + av_free_packet(@packet); end; if (not Terminated) and FisReconnect and (FReconnectDelay > 0) and (FSuspendEvent.WaitFor(0) = wrSignaled) then diff --git a/source/component/ocv.comp.ViewFMX.pas b/source/component/ocv.comp.ViewFMX.pas index bb36f16..e73d417 100644 --- a/source/component/ocv.comp.ViewFMX.pas +++ b/source/component/ocv.comp.ViewFMX.pas @@ -129,6 +129,7 @@ implementation uses System.UITypes, + ocv.core.types_c, ocv.fmxutils; {$IFNDEF DELPHIXE5_UP} diff --git a/source/ffmpeg/LICENSE.txt b/source/ffmpeg/LICENSE.txt new file mode 100644 index 0000000..8f7ad0d --- /dev/null +++ b/source/ffmpeg/LICENSE.txt @@ -0,0 +1,22 @@ +FFmpeg Delphi/Pascal Headers and Examples License Agreement + +A modified part of FFVCL - Delphi FFmpeg VCL Components. +Copyright (c) 2008-2016 DelphiFFmpeg.com +All rights reserved. +http://www.DelphiFFmpeg.com + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +This source code is provided "as is" by DelphiFFmpeg.com without +warranty of any kind, either expressed or implied, including but not +limited to the implied warranties of merchantability and/or fitness +for a particular purpose. + +Please also notice the License agreement of FFmpeg libraries. diff --git a/source/ffmpeg/Readme.txt b/source/ffmpeg/Readme.txt new file mode 100644 index 0000000..98f9430 --- /dev/null +++ b/source/ffmpeg/Readme.txt @@ -0,0 +1,30 @@ +FFmpeg Delphi/Pascal Headers and Examples + +Ported from FFmpeg 3.0.2 + +Tested on Delphi 6 to Delphi 10.1 Berlin and FPC 2.6.4 (Win32 only) + +********************************************************************* + +FFmpeg Delphi/Pascal Headers and Examples License Agreement + +A modified part of FFVCL - Delphi FFmpeg VCL Components. +Copyright (c) 2008-2016 DelphiFFmpeg.com +All rights reserved. +http://www.DelphiFFmpeg.com + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +This source code is provided "as is" by DelphiFFmpeg.com without +warranty of any kind, either expressed or implied, including but not +limited to the implied warranties of merchantability and/or fitness +for a particular purpose. + +Please also notice the License agreement of FFmpeg libraries. diff --git a/source/ffmpeg/ffm.avfilter.pas b/source/ffmpeg/ffm.avfilter.pas deleted file mode 100644 index 6a2b439..0000000 --- a/source/ffmpeg/ffm.avfilter.pas +++ /dev/null @@ -1,1708 +0,0 @@ -(* - * filter layer - * Copyright (c) 2007 Bobby Bingham - * - * This file is part of ffm. - * - * 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 -*) - -(* - ************************************************************************************************** - Project Delphi-FFMPEG - Part of Delphi-OpenCV - ************************************************************************************************** - Contributor: - Laentir Valetov - email:laex@bk.ru - ************************************************************************************************** - You may retrieve the latest version of this file at the GitHub, - located at git://github.com/Laex/Delphi-OpenCV.git - ************************************************************************************************** - Homepage: https://www.ffmpeg.org/ - ************************************************************************************************** - Original file: - avfilter.h - ************************************************************************************************* -*) - -unit ffm.avfilter; - -{$i ffmpeg.inc} - -interface - -uses - ffm.log, ffm.dict, ffm.rational, ffm.avutil, ffm.frame; - -(* - * Return the LIBAVFILTER_VERSION_INT constant. -*) -// unsigned avfilter_version(void); -{$EXTERNALSYM avfilter_version} -function avfilter_version(): Cardinal; cdecl; - -(* - * Return the libavfilter build-time configuration. -*) -// const char *avfilter_configuration(void); -{$EXTERNALSYM avfilter_configuration} -function avfilter_configuration(): pAnsiChar; cdecl; - -(* - * Return the libavfilter license. -*) -// const char *avfilter_license(void); -{$EXTERNALSYM avfilter_license} -function avfilter_license(): pAnsiChar; cdecl; - -{$IFDEF FF_API_AVFILTERBUFFER} - -const - AV_PERM_READ = $01; // < can read from the buffer - AV_PERM_WRITE = $02; // < can write to the buffer - AV_PERM_PRESERVE = $04; // < nobody else can overwrite the buffer - AV_PERM_REUSE = $08; // < can output the buffer multiple times, with the same contents each time - AV_PERM_REUSE2 = $10; // < can output the buffer multiple times, modified each time - AV_PERM_NEG_LINESIZES = $20; // < the buffer requested can have negative linesizes - AV_PERM_ALIGN = $40; // < the buffer must be aligned - - AVFILTER_ALIGN = 16; // not part of ABI -{$ENDIF} - -Type - ppByte = ^pByte; - - pAVFilterLink = ^TAVFilterLink; - ppAVFilterLink = ^pAVFilterLink; - - pAVFilterPad = ^TAVFilterPad; - - TAVFilterPad = record - - end; - - pAVFilterFormats = ^TAVFilterFormats; - - TAVFilterFormats = record - - end; -{$IFDEF FF_API_AVFILTERBUFFER} - - (* - * A reference-counted buffer data type used by the filter system. Filters - * should not store pointers to this structure directly, but instead use the - * AVFilterBufferRef structure below. - *) - pAVFilterBuffer = ^TAVFilterBuffer; - - TAVFilterBuffer = record - data: array [0 .. 7] of pByte; // < buffer data for each plane/channel - (* - * pointers to the data planes/channels. - * - * For video, this should simply point to data[]. - * - * For planar audio, each channel has a separate data pointer, and - * linesize[0] contains the size of each channel buffer. - * For {packed} audio, there is just one data pointer, and linesize[0] - * contains the total size of the buffer for all channels. - * - * Note: Both data and extended_data will always be set, but for planar - * audio with more channels that can fit in data, extended_data must be used - * in order to access all channels. - *) - extended_data: ppByte; - linesize: array [0 .. 7] of integer; // < number of bytes per line - (* private data to be used by a custom free function *) - priv: pointer; - (* - * A pointer to the function to deallocate this buffer if the default - * function is not sufficient. This could, for example, add the memory - * back into a memory pool to be reused later without the overhead of - * reallocating it from scratch. - *) - // void (*free)(struct AVFilterBuffer *buf); - free: procedure(buf: pAVFilterBuffer); cdecl; - - format: integer; // < media format - w, h: integer; // < width and height of the allocated buffer - refcount: Cardinal; // < number of references to this buffer - end; - - (* - * Audio specific properties in a reference to an AVFilterBuffer. Since - * AVFilterBufferRef is common to different media formats, audio specific - * per reference properties must be separated out. - *) - pAVFilterBufferRefAudioProps = ^TAVFilterBufferRefAudioProps; - - TAVFilterBufferRefAudioProps = record - channel_layout: uint64; // < channel layout of audio buffer - nb_samples: integer; // < number of audio samples per channel - sample_rate: integer; // < audio buffer sample rate - channels: integer; // < number of channels (do not access directly) - end; - - (* - * Video specific properties in a reference to an AVFilterBuffer. Since - * AVFilterBufferRef is common to different media formats, video specific - * per reference properties must be separated out. - *) - pAVFilterBufferRefVideoProps = ^TAVFilterBufferRefVideoProps; - - TAVFilterBufferRefVideoProps = record - w: integer; // < image width - h: integer; // < image height - sample_aspect_ratio: TAVRational; // < sample aspect ratio - interlaced: integer; // < is frame interlaced - top_field_first: integer; // < field order - pict_type: TAVPictureType; // < picture type of the frame - key_frame: integer; // < 1 -> keyframe, 0-> not - qp_table_linesize: integer; // < qp_table stride - qp_table_size: integer; // < qp_table size - qp_table: pByte; // < array of Quantization Parameters - end; - - (* - * A reference to an AVFilterBuffer. Since filters can manipulate the origin of - * a buffer to, for example, crop image without any memcpy, the buffer origin - * and dimensions are per-reference properties. Linesize is also useful for - * image flipping, frame to field filters, etc, and so is also per-reference. - * - * TODO: add anything necessary for frame reordering - *) - pAVFilterBufferRef = ^TAVFilterBufferRef; - - TAVFilterBufferRef = record - buf: pAVFilterBuffer; // < the buffer that this is a reference to - data: array [0 .. 7] of pByte; // < picture/audio data for each plane - (* - * pointers to the data planes/channels. - * - * For video, this should simply point to data[]. - * - * For planar audio, each channel has a separate data pointer, and - * linesize[0] contains the size of each channel buffer. - * For {packed} audio, there is just one data pointer, and linesize[0] - * contains the total size of the buffer for all channels. - * - * Note: Both data and extended_data will always be set, but for planar - * audio with more channels that can fit in data, extended_data must be used - * in order to access all channels. - *) - extended_data: ppByte; - linesize: array [0 .. 7] of integer; // < number of bytes per line - - video: pAVFilterBufferRefVideoProps; // < video buffer specific properties - audio: pAVFilterBufferRefAudioProps; // < audio buffer specific properties - (* - * presentation timestamp. The time unit may change during - * filtering, as it is specified in the link and the filter code - * may need to rescale the PTS accordingly. - *) - pts: int64; - pos: int64; // < byte position in stream, -1 if unknown - format: integer; // < media format - perms: integer; // < permissions, see the AV_PERM_* flags - _type: TAVMediaType; // < media type of buffer data - metadata: pAVDictionary; // < dictionary containing metadata key=value tags - end; -{$ENDIF} - - (* - * Filter definition. This defines the pads a filter contains, and all the - * callback functions used to interact with the filter. - *) - pAVFilterContext = ^TAVFilterContext; - ppAVFilterContext = ^pAVFilterContext; - - pAvFilter = ^TAvFilter; - - TAvFilter = record - (* - * Filter name. Must be non-NULL and unique among filters. - *) - name: pAnsiChar; - - (* - * A description of the filter. May be NULL. - * - * You should use the NULL_IF_CONFIG_SMALL() macro to define it. - *) - description: pAnsiChar; - - (* - * List of inputs, terminated by a zeroed element. - * - * NULL if there are no (static) inputs. Instances of filters with - * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in - * this list. - *) - inputs: pAVFilterPad; - (* - * List of outputs, terminated by a zeroed element. - * - * NULL if there are no (static) outputs. Instances of filters with - * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in - * this list. - *) - outputs: pAVFilterPad; - - (* - * A class for the private data, used to declare filter private AVOptions. - * This field is NULL for filters that do not declare any options. - * - * If this field is non-NULL, the first member of the filter private data - * must be a pointer to AVClass, which will be set by libavfilter generic - * code to this class. - *) - priv_class: pAVClass; - - (* - * A combination of AVFILTER_FLAG_* - *) - flags: integer; - - (* *************************************************************** - * All fields below this line are not part of the public API. They - * may not be used outside of libavfilter and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - - (* - * Filter initialization function. - * - * This callback will be called only once during the filter lifetime, after - * all the options have been set, but before links between filters are - * established and format negotiation is done. - * - * Basic filter initialization should be done here. Filters with dynamic - * inputs and/or outputs should create those inputs/outputs here based on - * provided options. No more changes to this filter's inputs/outputs can be - * done after this callback. - * - * This callback must not assume that the filter links exist or frame - * parameters are known. - * - * @ref AVFilter.uninit "uninit" is guaranteed to be called even if - * initialization fails, so this callback does not have to clean up on - * failure. - * - * @return 0 on success, a negative AVERROR on failure - *) - // int (*init)(AVFilterContext *ctx); - init: function(ctx: pAVFilterContext): integer; cdecl; - - (* - * Should be set instead of @ref AVFilter.init "init" by the filters that - * want to pass a dictionary of AVOptions to nested contexts that are - * allocated during init. - * - * On return, the options dict should be freed and replaced with one that - * contains all the options which could not be processed by this filter (or - * with NULL if all the options were processed). - * - * Otherwise the semantics is the same as for @ref AVFilter.init "init". - *) - // int (*init_dict)(AVFilterContext *ctx, AVDictionary **options); - init_dict: function(ctx: pAVFilterContext; options: ppAVDictionary): integer; cdecl; - - (* - * Filter uninitialization function. - * - * Called only once right before the filter is freed. Should deallocate any - * memory held by the filter, release any buffer references, etc. It does - * not need to deallocate the AVFilterContext.priv memory itself. - * - * This callback may be called even if @ref AVFilter.init "init" was not - * called or failed, so it must be prepared to handle such a situation. - *) - // void (*uninit)(AVFilterContext *ctx); - uninit: procedure(ctx: pAVFilterContext); cdecl; - - (* - * Query formats supported by the filter on its inputs and outputs. - * - * This callback is called after the filter is initialized (so the inputs - * and outputs are fixed), shortly before the format negotiation. This - * callback may be called more than once. - * - * This callback must set AVFilterLink.out_formats on every input link and - * AVFilterLink.in_formats on every output link to a list of pixel/sample - * formats that the filter supports on that link. For audio links, this - * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / - * @ref AVFilterLink.out_samplerates "out_samplerates" and - * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / - * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. - * - * This callback may be NULL for filters with one input, in which case - * libavfilter assumes that it supports all input formats and preserves - * them on output. - * - * @return zero on success, a negative value corresponding to an - * AVERROR code otherwise - *) - // int (*query_formats)(AVFilterContext *); - query_formats: function(fc: pAVFilterContext): integer; cdecl; - - priv_size: integer; // < size of private data to allocate for the filter - - (* - * Used by the filter registration system. Must not be touched by any other - * code. - *) - next: pAvFilter; - - (* - * Make the filter instance process a command. - * - * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only - * @param arg the argument for the command - * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. - * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be - * time consuming then a filter should treat it like an unsupported command - * - * @returns >=0 on success otherwise an error code. - * AVERROR(ENOSYS) on unsupported commands - *) - // int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); - process_command: function(fc: pAVFilterContext; const cmd: pAnsiChar; const arg: pAnsiChar; res: pAnsiChar; - res_len: integer; flags: integer): integer; cdecl; - - (* - * Filter initialization function, alternative to the init() - * callback. Args contains the user-supplied parameters, opaque is - * used for providing binary data. - *) - // int (*init_opaque)(AVFilterContext *ctx, void *opaque); - init_opaque: function(ctx: pAVFilterContext; opaque: pointer): integer; cdecl; - end; - - (* - * Process multiple parts of the frame concurrently. - *) - // # define AVFILTER_THREAD_SLICE(1 << 0) - - pAVFilterInternal = ^TAVFilterInternal; - - TAVFilterInternal = record - - end; - - pAVFilterCommand = ^TAVFilterCommand; - - TAVFilterCommand = record - - end; - - pAVFilterGraphInternal = ^TAVFilterGraphInternal; - - TAVFilterGraphInternal = record - - end; - - (* - * A function pointer passed to the @ref AVFilterGraph.execute callback to be - * executed multiple times, possibly in parallel. - * - * @param ctx the filter context the job belongs to - * @param arg an opaque parameter passed through from @ref - * AVFilterGraph.execute - * @param jobnr the index of the job being executed - * @param nb_jobs the total number of jobs - * - * @return 0 on success, a negative AVERROR on error - *) - // typedef int(avfilter_action_func)(AVFilterContext * ctx, void * arg, int jobnr, int nb_jobs); - TAvFilter_Action_Func = function(ctx: pAVFilterContext; arg: pointer; jobnr: integer; nb_jobs: integer) - : integer; cdecl; - (* - * A function executing multiple jobs, possibly in parallel. - * - * @param ctx the filter context to which the jobs belong - * @param func the function to be called multiple times - * @param arg the argument to be passed to func - * @param ret a nb_jobs-sized array to be filled with return values from each - * invocation of func - * @param nb_jobs the number of jobs to execute - * - * @return 0 on success, a negative AVERROR on error - *) - // typedef int(avfilter_execute_func)(AVFilterContext * ctx, avfilter_action_func * func, void * arg, int * ret, int nb_jobs); - Tavfilter_execute_func = function(ctx: pAVFilterContext; func: TAvFilter_Action_Func; arg: pointer; var ret: integer; - nb_jobs: integer): integer; cdecl; - - TAVFilterGraph = record - av_class: pAVClass; -{$IFDEF FF_API_FOO_COUNT} - // attribute_deprecated - filter_count_unused: Cardinal deprecated; -{$ENDIF} - filters: PPMonitor; -{$IFNDEF FF_API_FOO_COUNT} - nb_filters: Cardinal; -{$ENDIF} - scale_sws_opts: pAnsiChar; // < sws options to use for the auto-inserted scale filters - resample_lavr_opts: pAnsiChar; // < libavresample options to use for the auto-inserted resample filters -{$IFDEF FF_API_FOO_COUNT} - nb_filters: Cardinal; -{$ENDIF} - (* - * Type of multithreading allowed for filters in this graph. A combination - * of AVFILTER_THREAD_* flags. - * - * May be set by the caller at any point, the setting will apply to all - * filters initialized after that. The default is allowing everything. - * - * When a filter in this graph is initialized, this field is combined using - * bit AND with AVFilterContext.thread_type to get the final mask used for - * determining allowed threading types. I.e. a threading type needs to be - * set in both to be allowed. - *) - thread_type: integer; - (* - * Maximum number of threads used by filters in this graph. May be set by - * the caller before adding any filters to the filtergraph. Zero (the - * default) means that the number of threads is determined automatically. - *) - nb_threads: integer; - (* - * Opaque object for libavfilter internal use. - *) - internal: pAVFilterGraphInternal; - (* - * Opaque user data. May be set by the caller to an arbitrary value, e.g. to - * be used from callbacks like @ref AVFilterGraph.execute. - * Libavfilter will not touch this field in any way. - *) - opaque: pointer; - (* - * This callback may be set by the caller immediately after allocating the - * graph and before adding any filters to it, to provide a custom - * multithreading implementation. - * - * If set, filters with slice threading capability will call this callback - * to execute multiple jobs in parallel. - * - * If this field is left unset, libavfilter will use its internal - * implementation, which may or may not be multithreaded depending on the - * platform and build options. - *) - execute: Tavfilter_execute_func; - aresample_swr_opts: pAnsiChar; - // < swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions - (* - * Private fields - * - * The following fields are for internal use only. - * Their type, offset, number and semantic can change without notice. - *) - sink_links: ppAVFilterLink; - sink_links_count: integer; - - disable_auto_convert: Cardinal; - end; - - pAVFilterGraph = ^TAVFilterGraph; - - (* An instance of a filter *) - TAVFilterContext = record - av_class: pAVClass; // < needed for av_log() and filters common options - filter: pAvFilter; // < the AVFilter of which this is an instance - name: pAnsiChar; // < name of this filter instance - input_pads: pAVFilterPad; // < array of input pads - inputs: ppAVFilterLink; // < array of pointers to input links -{$IFDEF FF_API_FOO_COUNT} - // attribute_deprecated - input_count: Cardinal deprecated 'use nb_inputs'; // < @deprecated use nb_inputs -{$ENDIF} - nb_inputs: Cardinal; // < number of input pads - output_pads: pAVFilterPad; // < array of output pads - outputs: ppAVFilterLink; // < array of pointers to output links -{$IFDEF FF_API_FOO_COUNT} - // attribute_deprecated - output_count: Cardinal deprecated 'use nb_outputs'; // < @deprecated use nb_outputs -{$ENDIF} - nb_outputs: Cardinal; // < number of output pads - priv: pointer; // < private data for use by the filter - graph: pAVFilterGraph; // < filtergraph this filter belongs to - (* - * Type of multithreading being allowed/used. A combination of - * AVFILTER_THREAD_* flags. - * - * May be set by the caller before initializing the filter to forbid some - * or all kinds of multithreading for this filter. The default is allowing - * everything. - * - * When the filter is initialized, this field is combined using bit AND with - * AVFilterGraph.thread_type to get the final mask used for determining - * allowed threading types. I.e. a threading type needs to be set in both - * to be allowed. - * - * After the filter is initialzed, libavfilter sets this field to the - * threading type that is actually used (0 for no multithreading). - *) - thread_type: integer; - (* - * An opaque struct for libavfilter internal use. - *) - internal: pAVFilterInternal; - command_queue: pAVFilterCommand; - enable_str: pAnsiChar; // < enable expression string - enable: pointer; // < parsed expression (AVExpr*) - var_values: pDouble; // < variable values for the enable expression - is_disabled: integer; // < the enabled state from the last expression evaluation - end; - - (* - * A link between two filters. This contains pointers to the source and - * destination filters between which this link exists, and the indexes of - * the pads involved. In addition, this link also contains the parameters - * which have been negotiated and agreed upon between the filter, such as - * image dimensions, format, etc. - *) - Tinit_state = ( // - AVLINK_UNINIT = 0, // < not started - AVLINK_STARTINIT, // < started, but incomplete - AVLINK_INIT // < complete - ); - - pAVFilterChannelLayouts = ^TAVFilterChannelLayouts; - - TAVFilterChannelLayouts = record - - end; - - pAVFilterPool = ^TAVFilterPool; - - TAVFilterPool = record - - end; - - TAVFilterLink = record - src: pAVFilterContext; // < source filter - srcpad: pAVFilterPad; // < output pad on the source filter - - dst: pAVFilterContext; // < dest filter - dstpad: pAVFilterPad; // < input pad on the dest filter - - _type: TAVMediaType; // < filter media type - - (* These parameters apply only to video *) - w: integer; // < agreed upon image width - h: integer; // < agreed upon image height - sample_aspect_ratio: TAVRational; // < agreed upon sample aspect ratio - (* These parameters apply only to audio *) - channel_layout: uint64; // < channel layout of current buffer (see libavutil/channel_layout.h) - sample_rate: integer; // < samples per second - - format: integer; // < agreed upon media format - - (* - * Define the time base used by the PTS of the frames/samples - * which will pass through this link. - * During the configuration stage, each filter is supposed to - * change only the output timebase, while the timebase of the - * input link is assumed to be an unchangeable property. - *) - time_base: TAVRational; - - (* *************************************************************** - * All fields below this line are not part of the public API. They - * may not be used outside of libavfilter and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - (* - * Lists of formats and channel layouts supported by the input and output - * filters respectively. These lists are used for negotiating the format - * to actually be used, which will be loaded into the format and - * channel_layout members, above, when chosen. - * - *) - in_formats: pAVFilterFormats; - out_formats: pAVFilterFormats; - - (* - * Lists of channel layouts and sample rates used for automatic - * negotiation. - *) - in_samplerates: pAVFilterFormats; - out_samplerates: pAVFilterFormats; - in_channel_layouts: pAVFilterChannelLayouts; - out_channel_layouts: pAVFilterChannelLayouts; - - (* - * Audio only, the destination filter sets this to a non-zero value to - * request that buffers with the given number of samples should be sent to - * it. AVFilterPad.needs_fifo must also be set on the corresponding input - * pad. - * Last buffer before EOF will be padded with silence. - *) - request_samples: integer; - - (* stage of the initialization of the link properties (dimensions, etc) *) - // enum { - // AVLINK_UNINIT = 0, //< not started - // AVLINK_STARTINIT, //< started, but incomplete - // AVLINK_INIT //< complete - // } init_state; - init_state: Tinit_state; - - pool: pAVFilterPool; - - (* - * Graph the filter belongs to. - *) - graph: pAVFilterGraph; - - (* - * Current timestamp of the link, as defined by the most recent - * frame(s), in AV_TIME_BASE units. - *) - current_pts: int64; - - (* - * Index in the age array. - *) - age_index: integer; - - (* - * Frame rate of the stream on the link, or 1/0 if unknown; - * if left to 0/0, will be automatically be copied from the first input - * of the source filter if it exists. - * - * Sources should set it to the best estimation of the real frame rate. - * Filters should update it if necessary depending on their function. - * Sinks can use it to set a default output frame rate. - * It is similar to the r_frame_rate field in AVStream. - *) - frame_rate: TAVRational; - - (* - * Buffer partially filled with samples to achieve a fixed/minimum size. - *) - partial_buf: pAVFrame; - - (* - * Size of the partial buffer to allocate. - * Must be between min_samples and max_samples. - *) - partial_buf_size: integer; - - (* - * Minimum number of samples to filter at once. If filter_frame() is - * called with fewer samples, it will accumulate them in partial_buf. - * This field and the related ones must not be changed after filtering - * has started. - * If 0, all related fields are ignored. - *) - min_samples: integer; - - (* - * Maximum number of samples to filter at once. If filter_frame() is - * called with more samples, it will split them. - *) - max_samples: integer; - - (* - * The buffer reference currently being received across the link by the - * destination filter. This is used internally by the filter system to - * allow automatic copying of buffers which do not have sufficient - * permissions for the destination. This should not be accessed directly - * by the filters. - *) - cur_buf_copy: pAVFilterBufferRef; - - (* - * True if the link is closed. - * If set, all attemps of start_frame, filter_frame or request_frame - * will fail with AVERROR_EOF, and if necessary the reference will be - * destroyed. - * If request_frame returns AVERROR_EOF, this flag is set on the - * corresponding link. - * It can be set also be set by either the source or the destination - * filter. - *) - closed: integer; - - (* - * Number of channels. - *) - channels: integer; - - (* - * True if a frame is being requested on the link. - * Used internally by the framework. - *) - frame_requested: Cardinal; - - (* - * Link processing flags. - *) - flags: Cardinal; - - (* - * Number of past frames sent through the link. - *) - frame_count: int64; - end; - -{$IFDEF FF_API_AVFILTERBUFFER} - (* - * Copy properties of src to dst, without copying the actual data - *) - // attribute_deprecated void avfilter_copy_buffer_ref_props(AVFilterBufferRef * dst, AVFilterBufferRef * src); -{$EXTERNALSYM avfilter_copy_buffer_ref_props} - -procedure avfilter_copy_buffer_ref_props(var dst: TAVFilterBufferRef; var src: TAVFilterBufferRef); -cdecl deprecated; - -(* - * Add a new reference to a buffer. - * - * @param ref an existing reference to the buffer - * @param pmask a bitmask containing the allowable permissions in the new - * reference - * @return a new reference to the buffer with the same properties as the - * old, excluding any permissions denied by pmask -*) -// attribute_deprecated AVFilterBufferRef * avfilter_ref_buffer(AVFilterBufferRef * ref, int pmask); -{$EXTERNALSYM avfilter_ref_buffer} -function avfilter_ref_buffer(var ref: TAVFilterBufferRef; pmask: integer): pAVFilterBufferRef; -cdecl deprecated; - -(* - * Remove a reference to a buffer. If this is the last reference to the - * buffer, the buffer itself is also automatically freed. - * - * @param ref reference to the buffer, may be NULL - * - * @note it is recommended to use avfilter_unref_bufferp() instead of this - * function -*) -// attribute_deprecated void avfilter_unref_buffer(AVFilterBufferRef * ref); -{$EXTERNALSYM avfilter_unref_buffer} -procedure avfilter_unref_buffer(var ref: TAVFilterBufferRef); -cdecl deprecated; - -(* - * Remove a reference to a buffer and set the pointer to NULL. - * If this is the last reference to the buffer, the buffer itself - * is also automatically freed. - * - * @param ref pointer to the buffer reference -*) -// attribute_deprecated void avfilter_unref_bufferp(AVFilterBufferRef * * ref); -{$EXTERNALSYM avfilter_unref_bufferp} -procedure avfilter_unref_bufferp(var ref: pAVFilterBufferRef); -cdecl deprecated; - -{$ENDIF} -(* - * Get the number of channels of a buffer reference. -*) -// attribute_deprecated int avfilter_ref_get_channels(AVFilterBufferRef * ref); -{$EXTERNALSYM avfilter_ref_get_channels} -function avfilter_ref_get_channels(var ref: TAVFilterBufferRef): integer; -cdecl deprecated; - -{$IFDEF FF_API_AVFILTERPAD_PUBLIC} - -(* - * A filter pad used for either input or output. - * - * See doc/filter_design.txt for details on how to implement the methods. - * - * @warning this struct might be removed from public API. - * users should call avfilter_pad_get_name() and avfilter_pad_get_type() - * to access the name and type fields; there should be no need to access - * any other fields from outside of libavfilter. -*) -Type - pAVFilterPad = ^TAVFilterPad; - - TAVFilterPad = record - (* - * Pad name. The name is unique among inputs and among outputs, but an - * input may have the same name as an output. This may be NULL if this - * pad has no need to ever be referenced by name. - *) - name: pAnsiChar; - (* - * AVFilterPad type. - *) - type_: TAVMediaType; - (* - * Input pads: - * Minimum required permissions on incoming buffers. Any buffer with - * insufficient permissions will be automatically copied by the filter - * system to a new buffer which provides the needed access permissions. - * - * Output pads: - * Guaranteed permissions on outgoing buffers. Any buffer pushed on the - * link must have at least these permissions; this fact is checked by - * asserts. It can be used to optimize buffer allocation. - *) - // attribute_deprecated - min_perms: integer deprecated; - (* - * Input pads: - * Permissions which are not accepted on incoming buffers. Any buffer - * which has any of these permissions set will be automatically copied - * by the filter system to a new buffer which does not have those - * permissions. This can be used to easily disallow buffers with - * AV_PERM_REUSE. - * - * Output pads: - * Permissions which are automatically removed on outgoing buffers. It - * can be used to optimize buffer allocation. - *) - // attribute_deprecated - rej_perms: integer deprecated; - (* - * @deprecated unused - *) - // int (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref); - start_frame: function(var link: TAVFilterLink; var picref: TAVFilterBufferRef): integer; cdecl; - - (* - * Callback function to get a video buffer. If NULL, the filter system will - * use ff_default_get_video_buffer(). - * - * Input video pads only. - *) - // AVFrame *(*get_video_buffer)(AVFilterLink *link, int w, int h); - get_video_buffer: function(var link: TAVFilterLink; w: integer; h: integer): pAVFrame; cdecl; - - (* - * Callback function to get an audio buffer. If NULL, the filter system will - * use ff_default_get_audio_buffer(). - * - * Input audio pads only. - *) - // AVFrame *(*get_audio_buffer)(AVFilterLink *link, int nb_samples); - get_audio_buffer: function(var link: TAVFilterLink; nb_samples: integer): pAVFrame; cdecl; - (* - * @deprecated unused - *) - // int (*end_frame)(AVFilterLink *link); - end_frame: function(var link: TAVFilterLink): integer; cdecl; - (* - * @deprecated unused - *) - // int (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir); - draw_slice: function(var link: TAVFilterLink; y: integer; height: integer; slice_dir: integer): integer; cdecl; - - (* - * Filtering callback. This is where a filter receives a frame with - * audio/video data and should do its processing. - * - * Input pads only. - * - * @return >= 0 on success, a negative AVERROR on error. This function - * must ensure that frame is properly unreferenced on error if it - * hasn't been passed on to another filter. - *) - // int (*filter_frame)(AVFilterLink *link, AVFrame *frame); - filter_frame: function filter_frame(var link: TAVFilterLink; var frame: TAVFrame): integer; cdecl; - (* - * Frame poll callback. This returns the number of immediately available - * samples. It should return a positive value if the next request_frame() - * is guaranteed to return one frame (with no delay). - * - * Defaults to just calling the source poll_frame() method. - * - * Output pads only. - *) - // int (*poll_frame)(AVFilterLink *link); - poll_frame: function(var link: TAVFilterLink): integer; cdecl; - (* - * Frame request callback. A call to this should result in at least one - * frame being output over the given link. This should return zero on - * success, and another value on error. - * See ff_request_frame() for the error codes with a specific - * meaning. - * - * Output pads only. - *) - // int (*request_frame)(AVFilterLink *link); - request_frame: function(var link: TAVFilterLink): integer; cdecl; - (* - * Link configuration callback. - * - * For output pads, this should set the following link properties: - * video: width, height, sample_aspect_ratio, time_base - * audio: sample_rate. - * - * This should NOT set properties such as format, channel_layout, etc which - * are negotiated between filters by the filter system using the - * query_formats() callback before this function is called. - * - * For input pads, this should check the properties of the link, and update - * the filter's internal state as necessary. - * - * For both input and output pads, this should return zero on success, - * and another value on error. - *) - // int (*config_props)(AVFilterLink *link); - config_props: function(var link: TAVFilterLink): integer; cdecl; - (* - * The filter expects a fifo to be inserted on its input link, - * typically because it has a delay. - * - * input pads only. - *) - needs_fifo: integer; - needs_writable: integer; - end; - // # endif -{$ENDIF} - (* - * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. - * AVFilter.inputs/outputs). - *) - // int avfilter_pad_count(const AVFilterPad * pads); -{$EXTERNALSYM avfilter_pad_count} - -function avfilter_pad_count(var pads: TAVFilterPad): integer; cdecl; - -(* - * Get the name of an AVFilterPad. - * - * @param pads an array of AVFilterPads - * @param pad_idx index of the pad in the array it; is the caller's - * responsibility to ensure the index is valid - * - * @return name of the pad_idx'th pad in pads -*) -// const char * avfilter_pad_get_name(const AVFilterPad * pads, int pad_idx); -{$EXTERNALSYM avfilter_pad_get_name} -function avfilter_pad_get_name(var pads: TAVFilterPad; pad_idx: integer): pAnsiChar; cdecl; - -(* - * Get the type of an AVFilterPad. - * - * @param pads an array of AVFilterPads - * @param pad_idx index of the pad in the array; it is the caller's - * responsibility to ensure the index is valid - * - * @return type of the pad_idx'th pad in pads -*) -// enum AVMediaType avfilter_pad_get_type(const AVFilterPad * pads, int pad_idx); -{$EXTERNALSYM avfilter_pad_get_type} -function avfilter_pad_get_type(var pads: TAVFilterPad; pad_idx: integer): TAVMediaType; cdecl; - -const - (* - * The number of the filter inputs is not determined just by AVFilter.inputs. - * The filter might add additional inputs during initialization depending on the - * options supplied to it. - *) - AVFILTER_FLAG_DYNAMIC_INPUTS = (1 shl 0); - - (* - * The number of the filter outputs is not determined just by AVFilter.outputs. - * The filter might add additional outputs during initialization depending on - * the options supplied to it. - *) - AVFILTER_FLAG_DYNAMIC_OUTPUTS = (1 shl 1); - - (* - * The filter supports multithreading by splitting frames into multiple parts - * and processing them concurrently. - *) - AVFILTER_FLAG_SLICE_THREADS = (1 shl 2); - - (* - * Some filters support a generic "enable" expression option that can be used - * to enable or disable a filter in the timeline. Filters supporting this - * option have this flag set. When the enable expression is false, the default - * no-op filter_frame() function is called in place of the filter_frame() - * callback defined on each input pad, thus the frame is passed unchanged to - * the next filters. - *) - AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC = (1 shl 16); - - (* - * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will - * have its filter_frame() callback(s) called as usual even when the enable - * expression is false. The filter will disable filtering within the - * filter_frame() callback(s) itself, for example executing code depending on - * the AVFilterContext->is_disabled value. - *) - AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL = (1 shl 17); - - (* - * Handy mask to test whether the filter supports or no the timeline feature - * (internally or generically). - *) - AVFILTER_FLAG_SUPPORT_TIMELINE = (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC or AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL); - - (* - * Link two filters together. - * - * @param src the source filter - * @param srcpad index of the output pad on the source filter - * @param dst the destination filter - * @param dstpad index of the input pad on the destination filter - * @return zero on success - *) - // int avfilter_link(AVFilterContext * src, unsigned srcpad, AVFilterContext * dst, unsigned dstpad); -{$EXTERNALSYM avfilter_link} -function avfilter_link(var src: TAVFilterContext; srcpad: Cardinal; var dst: TAVFilterContext; dstpad: Cardinal) - : integer; cdecl; - -(* - * Free the link in *link, and set its pointer to NULL. -*) -// void avfilter_link_free(AVFilterLink * * link); -{$EXTERNALSYM avfilter_link_free} -procedure avfilter_link_free(var link: pAVFilterLink); cdecl; - -(* - * Get the number of channels of a link. -*) -// int avfilter_link_get_channels(AVFilterLink * link); -{$EXTERNALSYM avfilter_link_get_channels} -function avfilter_link_get_channels(var link: TAVFilterLink): integer; cdecl; - -(* - * Set the closed field of a link. -*) -// void avfilter_link_set_closed(AVFilterLink * link, int closed); -{$EXTERNALSYM avfilter_link_set_closed} -procedure avfilter_link_set_closed(var link: TAVFilterLink; closed: integer); cdecl; - -(* - * Negotiate the media format, dimensions, etc of all inputs to a filter. - * - * @param filter the filter to negotiate the properties for its inputs - * @return zero on successful negotiation -*) -// int avfilter_config_links(AVFilterContext * filter); -{$EXTERNALSYM avfilter_config_links} -function avfilter_config_links(var filter: TAVFilterContext): integer; cdecl; - -{$IFDEF FF_API_AVFILTERBUFFER} -(* - * Create a buffer reference wrapped around an already allocated image - * buffer. - * - * @param data pointers to the planes of the image to reference - * @param linesize linesizes for the planes of the image to reference - * @param perms the required access permissions - * @param w the width of the image specified by the data and linesize arrays - * @param h the height of the image specified by the data and linesize arrays - * @param format the pixel format of the image specified by the data and linesize arrays -*) -// attribute_deprecated AVFilterBufferRef * avfilter_get_video_buffer_ref_from_arrays(uint8_t * const data[4], const int linesize[4], -// int perms, int w, int h, enum AVPixelFormat format); - -(* - * Create an audio buffer reference wrapped around an already - * allocated samples buffer. - * - * See avfilter_get_audio_buffer_ref_from_arrays_channels() for a version - * that can handle unknown channel layouts. - * - * @param data pointers to the samples plane buffers - * @param linesize linesize for the samples plane buffers - * @param perms the required access permissions - * @param nb_samples number of samples per channel - * @param sample_fmt the format of each sample in the buffer to allocate - * @param channel_layout the channel layout of the buffer -*) -// attribute_deprecated AVFilterBufferRef * avfilter_get_audio_buffer_ref_from_arrays(uint8_t * * data, int linesize, int perms, -// int nb_samples, enum AVSampleFormat sample_fmt, uint64_t channel_layout); - -(* - * Create an audio buffer reference wrapped around an already - * allocated samples buffer. - * - * @param data pointers to the samples plane buffers - * @param linesize linesize for the samples plane buffers - * @param perms the required access permissions - * @param nb_samples number of samples per channel - * @param sample_fmt the format of each sample in the buffer to allocate - * @param channels the number of channels of the buffer - * @param channel_layout the channel layout of the buffer, - * must be either 0 or consistent with channels -*) -// attribute_deprecated AVFilterBufferRef * avfilter_get_audio_buffer_ref_from_arrays_channels(uint8_t * * data, int linesize, int perms, -// int nb_samples, enum AVSampleFormat sample_fmt, int channels, uint64_t channel_layout); -{$ENDIF} - -const - AVFILTER_CMD_FLAG_ONE = 1; - // < Stop once a filter understood the command (for target=all for example), fast filters are favored automatically - AVFILTER_CMD_FLAG_FAST = 2; - // < Only execute command when its fast (like a video out that supports contrast adjustment in hw) - - (* - * Make the filter instance process a command. - * It is recommended to use avfilter_graph_send_command(). - *) - // int avfilter_process_command(AVFilterContext * filter, const char * cmd, const char * arg, char * res, int res_len, int flags); -{$EXTERNALSYM avfilter_process_command} -function avfilter_process_command(var filter: TAVFilterContext; cmd: pAnsiChar; arg: pAnsiChar; res: pAnsiChar; - res_len: integer; flags: integer): integer; cdecl; - -{$IFDEF FF_API_OLD_FILTER_REGISTER} -(* Uninitialize the filter system. Unregister all filters. *) -// attribute_deprecated void avfilter_uninit(void); -{$EXTERNALSYM avfilter_uninit} -procedure avfilter_uninit(); -cdecl deprecated; -{$ENDIF} -(* - * Register a filter. This is only needed if you plan to use - * avfilter_get_by_name later to lookup the AVFilter structure by name. A - * filter can still by instantiated with avfilter_graph_alloc_filter even if it - * is not registered. - * - * @param filter the filter to register - * @return 0 if the registration was successful, a negative value - * otherwise -*) -// int avfilter_register(avfilter * filter); -{$EXTERNALSYM avfilter_register} -function avfilter_register(var filter: TAvFilter): integer; cdecl; - -(* - * Iterate over all registered filters. - * @return If prev is non-NULL, next registered filter after prev or NULL if - * prev is the last filter. If prev is NULL, return the first registered filter. -*) -// const avfilter * avfilter_next(const avfilter * prev); -{$EXTERNALSYM avfilter_next} -function avfilter_next(var prev: TAvFilter): pAvFilter; cdecl; - -{$IFDEF FF_API_OLD_FILTER_REGISTER} -(* - * If filter is NULL, returns a pointer to the first registered filter pointer, - * if filter is non-NULL, returns the next pointer after filter. - * If the returned pointer points to NULL, the last registered filter - * was already reached. - * @deprecated use avfilter_next() -*) -// attribute_deprecated avfilter * * av_filter_next(avfilter * * filter); -{$ENDIF} -{$IFDEF FF_API_AVFILTER_OPEN} -(* - * Create a filter instance. - * - * @param filter_ctx put here a pointer to the created filter context - * on success, NULL on failure - * @param filter the filter to create an instance of - * @param inst_name Name to give to the new instance. Can be NULL for none. - * @return >= 0 in case of success, a negative error code otherwise - * @deprecated use avfilter_graph_alloc_filter() instead -*) -// attribute_deprecated int avfilter_open(AVFilterContext * * filter_ctx, avfilter * filter, const char * inst_name); -{$EXTERNALSYM avfilter_open} -function avfilter_open(var filter_ctx: pAVFilterContext; var filter: avfilter; inst_name: pAnsiChar): integer; cdecl; - -{$ENDIF} -{$IFDEF FF_API_AVFILTER_INIT_FILTER} -(* - * Initialize a filter. - * - * @param filter the filter to initialize - * @param args A string of parameters to use when initializing the filter. - * The format and meaning of this string varies by filter. - * @param opaque Any extra non-string data needed by the filter. The meaning - * of this parameter varies by filter. - * @return zero on success -*) -// attribute_deprecated int avfilter_init_filter(AVFilterContext * filter, const char * args, void * opaque); -{$EXTERNALSYM avfilter_init_filter} -function avfilter_init_filter(var filter: TAVFilterContext; args: pAnsiChar; opaque: pointer): integer; cdecl; -{$ENDIF} -(* - * Initialize a filter with the supplied parameters. - * - * @param ctx uninitialized filter context to initialize - * @param args Options to initialize the filter with. This must be a - * ':'-separated list of options in the 'key=value' form. - * May be NULL if the options have been set directly using the - * AVOptions API or there are no options that need to be set. - * @return 0 on success, a negative AVERROR on failure -*) -// int avfilter_init_str(AVFilterContext * ctx, const char * args); - -(* - * Initialize a filter with the supplied dictionary of options. - * - * @param ctx uninitialized filter context to initialize - * @param options An AVDictionary filled with options for this filter. On - * return this parameter will be destroyed and replaced with - * a dict containing options that were not found. This dictionary - * must be freed by the caller. - * May be NULL, then this function is equivalent to - * avfilter_init_str() with the second parameter set to NULL. - * @return 0 on success, a negative AVERROR on failure - * - * @note This function and avfilter_init_str() do essentially the same thing, - * the difference is in manner in which the options are passed. It is up to the - * calling code to choose whichever is more preferable. The two functions also - * behave differently when some of the provided options are not declared as - * supported by the filter. In such a case, avfilter_init_str() will fail, but - * this function will leave those extra options in the options AVDictionary and - * continue as usual. -*) -// int avfilter_init_dict(AVFilterContext * ctx, AVDictionary * * options); -{$EXTERNALSYM avfilter_init_dict} -function avfilter_init_dict(var ctx: TAVFilterContext; var options: pAVDictionary): integer; cdecl; - -(* - * Free a filter context. This will also remove the filter from its - * filtergraph's list of filters. - * - * @param filter the filter to free -*) -// void avfilter_free(AVFilterContext * filter); -{$EXTERNALSYM avfilter_free} -procedure avfilter_free(var filter: TAVFilterContext); cdecl; - -(* - * Insert a filter in the middle of an existing link. - * - * @param link the link into which the filter should be inserted - * @param filt the filter to be inserted - * @param filt_srcpad_idx the input pad on the filter to connect - * @param filt_dstpad_idx the output pad on the filter to connect - * @return zero on success -*) -// int avfilter_insert_filter(AVFilterLink * link, AVFilterContext * filt, unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); -{$EXTERNALSYM avfilter_insert_filter} -function avfilter_insert_filter(var link: TAVFilterLink; var filt: TAVFilterContext; filt_srcpad_idx: Cardinal; - filt_dstpad_idx: Cardinal): integer; cdecl; - -{$IFDEF FF_API_AVFILTERBUFFER} -(* - * Copy the frame properties of src to dst, without copying the actual - * image data. - * - * @return 0 on success, a negative number on error. -*) -// attribute_deprecated int avfilter_copy_frame_props(AVFilterBufferRef * dst, const AVFrame * src); -{$EXTERNALSYM avfilter_copy_frame_props} -function avfilter_copy_frame_props(var dst: TAVFilterBufferRef; var src: TAVFrame): Integer; cdecl deprecated; - -(* - * Copy the frame properties and data pointers of src to dst, without copying - * the actual data. - * - * @return 0 on success, a negative number on error. -*) -// attribute_deprecated int avfilter_copy_buf_props(AVFrame * dst, const AVFilterBufferRef * src); -{$EXTERNALSYM avfilter_copy_buf_props} -function avfilter_copy_buf_props(var dst: TAVFrame; var src: TAVFilterBufferRef): Integer; cdecl deprecated; - -{$ENDIF} -(* - * @return AVClass for AVFilterContext. - * - * @see av_opt_find(). -*) -// const AVClass * avfilter_get_class(void); -{$EXTERNALSYM avfilter_get_class} -function avfilter_get_class(): pAVClass; cdecl; - -(* - * Allocate a filter graph. -*) -// AVFilterGraph * avfilter_graph_alloc(void); -{$EXTERNALSYM avfilter_graph_alloc} -function avfilter_graph_alloc(): pAVFilterGraph; cdecl; - -(* - * Get a filter definition matching the given name. - * - * @param name the filter name to find - * @return the filter definition, if any matching one is registered. - * NULL if none found. -*) -// #if ! FF_API_NOCONST_GET_NAME -// const -// #endif -// -// avfilter * avfilter_get_by_name(const char * name); -{$EXTERNALSYM avfilter_get_by_name} -function avfilter_get_by_name(const name: pAnsiChar): pAvFilter; cdecl; - -(* - * Create a new filter instance in a filter graph. - * - * @param graph graph in which the new filter will be used - * @param filter the filter to create an instance of - * @param name Name to give to the new instance (will be copied to - * AVFilterContext.name). This may be used by the caller to identify - * different filters, libavfilter itself assigns no semantics to - * this parameter. May be NULL. - * - * @return the context of the newly created filter instance (note that it is - * also retrievable directly through AVFilterGraph.filters or with - * avfilter_graph_get_filter()) on success or NULL or failure. -*) -// AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph * graph, const avfilter * filter, const char * name); -{$EXTERNALSYM avfilter_graph_alloc_filter} -function avfilter_graph_alloc_filter(var graph: TAVFilterGraph; var filter: TAvFilter; name: pAnsiChar) - : pAVFilterContext; cdecl; - -(* - * Get a filter instance with name name from graph. - * - * @return the pointer to the found filter instance or NULL if it - * cannot be found. -*) -// AVFilterContext * avfilter_graph_get_filter(AVFilterGraph * graph, char * name); -{$EXTERNALSYM avfilter_graph_get_filter} -function avfilter_graph_get_filter(var graph: TAVFilterGraph; name: pAnsiChar): pAVFilterContext; cdecl; - -{$IFDEF FF_API_AVFILTER_OPEN} -(* - * Add an existing filter instance to a filter graph. - * - * @param graphctx the filter graph - * @param filter the filter to be added - * - * @deprecated use avfilter_graph_alloc_filter() to allocate a filter in a - * filter graph -*) -// attribute_deprecated int avfilter_graph_add_filter(AVFilterGraph * graphctx, AVFilterContext * filter); -{$ENDIF} -(* - * Create and add a filter instance into an existing graph. - * The filter instance is created from the filter filt and inited - * with the parameters args and opaque. - * - * In case of success put in *filt_ctx the pointer to the created - * filter instance, otherwise set *filt_ctx to NULL. - * - * @param name the instance name to give to the created filter instance - * @param graph_ctx the filter graph - * @return a negative AVERROR error code in case of failure, a non - * negative value otherwise -*) -// int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const avfilter * filt, const char * name, const char * args, -// void * opaque, AVFilterGraph * graph_ctx); -{$EXTERNALSYM avfilter_graph_create_filter} -function avfilter_graph_create_filter(Var filt_ctx: pAVFilterContext; const filt: pAvFilter; const name: pAnsiChar; - const args: pAnsiChar; opaque: pointer; graph_ctx: pAVFilterGraph): integer; cdecl; - -(* - * Enable or disable automatic format conversion inside the graph. - * - * Note that format conversion can still happen inside explicitly inserted - * scale and aresample filters. - * - * @param flags any of the AVFILTER_AUTO_CONVERT_* constants -*) -// void avfilter_graph_set_auto_convert(AVFilterGraph * graph, unsigned flags); - -const - AVFILTER_AUTO_CONVERT_ALL = 0; (* < all automatic conversions enabled *) - AVFILTER_AUTO_CONVERT_NONE = -1; (* < all automatic conversions disabled *) - - (* - * Check validity and configure all the links and formats in the graph. - * - * @param graphctx the filter graph - * @param log_ctx context used for logging - * @return >= 0 in case of success, a negative AVERROR code otherwise - *) - // int avfilter_graph_config(AVFilterGraph * graphctx, void * log_ctx); -{$EXTERNALSYM avfilter_graph_config} -function avfilter_graph_config(graphctx: pAVFilterGraph; log_ctx: pointer): integer; cdecl; - -(* - * Free a graph, destroy its links, and set *graph to NULL. - * If *graph is NULL, do nothing. -*) -// void avfilter_graph_free(AVFilterGraph * * graph); -{$EXTERNALSYM avfilter_graph_free} -procedure avfilter_graph_free(Var graph: pAVFilterGraph); cdecl; - -type - (* - * A linked-list of the inputs/outputs of the filter chain. - * - * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), - * where it is used to communicate open (unlinked) inputs and outputs from and - * to the caller. - * This struct specifies, per each not connected pad contained in the graph, the - * filter context and the pad index required for establishing a link. - *) - pAVFilterInOut = ^TAVFilterInOut; - - TAVFilterInOut = record - (* unique name for this input/output in the list *) - name: pAnsiChar; - - (* filter context associated to this input/output *) - filter_ctx: pAVFilterContext; - - (* index of the filt_ctx pad to use for linking *) - pad_idx: integer; - - (* next input/input in the list, NULL if this is the last *) - next: pAVFilterInOut; - end; - - (* Initialize the filter system. Register all builtin filters. *) - // void avfilter_register_all(void); -{$EXTERNALSYM avfilter_register_all} - -procedure avfilter_register_all(); cdecl; - -(* - * Allocate a single AVFilterInOut entry. - * Must be freed with avfilter_inout_free(). - * @return allocated AVFilterInOut on success, NULL on failure. -*) -// AVFilterInOut * avfilter_inout_alloc(void); -{$EXTERNALSYM avfilter_inout_alloc} -function avfilter_inout_alloc(): pAVFilterInOut; cdecl; -(* - * Free the supplied list of AVFilterInOut and set *inout to NULL. - * If *inout is NULL, do nothing. -*) -// void avfilter_inout_free(AVFilterInOut * * inout); -{$EXTERNALSYM avfilter_inout_free} -procedure avfilter_inout_free(var inout: pAVFilterInOut); cdecl; - -// #if AV_HAVE_INCOMPATIBLE_LIBAV_ABI || !FF_API_OLD_GRAPH_PARSE -{$IF DEFINED(AV_HAVE_INCOMPATIBLE_LIBAV_ABI) OR NOT DEFINED(FF_API_OLD_GRAPH_PARSE)} -(* - * Add a graph described by a string to a graph. - * - * @note The caller must provide the lists of inputs and outputs, - * which therefore must be known before calling the function. - * - * @note The inputs parameter describes inputs of the already existing - * part of the graph; i.e. from the point of view of the newly created - * part, they are outputs. Similarly the outputs parameter describes - * outputs of the already existing filters, which are provided as - * inputs to the parsed filters. - * - * @param graph the filter graph where to link the parsed grap context - * @param filters string to be parsed - * @param inputs linked list to the inputs of the graph - * @param outputs linked list to the outputs of the graph - * @return zero on success, a negative AVERROR code on error -*) -// int avfilter_graph_parse(AVFilterGraph * graph, const char * filters, AVFilterInOut * inputs, AVFilterInOut * outputs, void * log_ctx); -{$EXTERNALSYM avfilter_graph_parse} -function avfilter_graph_parse(var graph: TAVFilterGraph; filters: pAnsiChar; var inputs: TAVFilterInOut; - var outputs: TAVFilterInOut; log_ctx: pointer): integer; cdecl; - -{$ELSE} -(* - * Add a graph described by a string to a graph. - * - * @param graph the filter graph where to link the parsed graph context - * @param filters string to be parsed - * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. - * If non-NULL, *inputs is updated to contain the list of open inputs - * after the parsing, should be freed with avfilter_inout_free(). - * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. - * If non-NULL, *outputs is updated to contain the list of open outputs - * after the parsing, should be freed with avfilter_inout_free(). - * @return non negative on success, a negative AVERROR code on error - * @deprecated Use avfilter_graph_parse_ptr() instead. -*) -// attribute_deprecated int avfilter_graph_parse(AVFilterGraph * graph, const char * filters, AVFilterInOut * * inputs, -// AVFilterInOut * * outputs, void * log_ctx); -{$EXTERNALSYM avfilter_graph_parse} -function avfilter_graph_parse(var graph: TAVFilterGraph; filters: pAnsiChar; var inputs: pAVFilterInOut; - var outputs: pAVFilterInOut; log_ctx: pointer): integer; -cdecl deprecated; - -{$ENDIF} -(* - * Add a graph described by a string to a graph. - * - * @param graph the filter graph where to link the parsed graph context - * @param filters string to be parsed - * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. - * If non-NULL, *inputs is updated to contain the list of open inputs - * after the parsing, should be freed with avfilter_inout_free(). - * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. - * If non-NULL, *outputs is updated to contain the list of open outputs - * after the parsing, should be freed with avfilter_inout_free(). - * @return non negative on success, a negative AVERROR code on error -*) -// int avfilter_graph_parse_ptr(AVFilterGraph * graph, const char * filters, AVFilterInOut * * inputs, AVFilterInOut * * outputs, -// void * log_ctx); -{$EXTERNALSYM avfilter_graph_parse_ptr} -function avfilter_graph_parse_ptr(graph: pAVFilterGraph; const filters: pAnsiChar; Var inputs: pAVFilterInOut; - Var outputs: pAVFilterInOut; log_ctx: pointer): integer; cdecl; - -(* - * Add a graph described by a string to a graph. - * - * @param[in] graph the filter graph where to link the parsed graph context - * @param[in] filters string to be parsed - * @param[out] inputs a linked list of all free (unlinked) inputs of the - * parsed graph will be returned here. It is to be freed - * by the caller using avfilter_inout_free(). - * @param[out] outputs a linked list of all free (unlinked) outputs of the - * parsed graph will be returned here. It is to be freed by the - * caller using avfilter_inout_free(). - * @return zero on success, a negative AVERROR code on error - * - * @note This function returns the inputs and outputs that are left - * unlinked after parsing the graph and the caller then deals with - * them. - * @note This function makes no reference whatsoever to already - * existing parts of the graph and the inputs parameter will on return - * contain inputs of the newly parsed part of the graph. Analogously - * the outputs parameter will contain outputs of the newly created - * filters. -*) -// int avfilter_graph_parse2(AVFilterGraph * graph, const char * filters, AVFilterInOut * * inputs, AVFilterInOut * * outputs); -{$EXTERNALSYM avfilter_graph_parse2} -function avfilter_graph_parse2(var graph: TAVFilterGraph; filters: pAnsiChar; var inputs: pAVFilterInOut; - var outputs: pAVFilterInOut): integer; cdecl; - -(* - * Send a command to one or more filter instances. - * - * @param graph the filter graph - * @param target the filter(s) to which the command should be sent - * "all" sends to all filters - * otherwise it can be a filter or filter instance name - * which will send the command to all matching filters. - * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only - * @param arg the argument for the command - * @param res a buffer with size res_size where the filter(s) can return a response. - * - * @returns >=0 on success otherwise an error code. - * AVERROR(ENOSYS) on unsupported commands -*) -// int avfilter_graph_send_command(AVFilterGraph * graph, const char * target, const char * cmd, const char * arg, char * res, int res_len, -// int flags); -{$EXTERNALSYM avfilter_graph_send_command} -function avfilter_graph_send_command(var graph: TAVFilterGraph; target: pAnsiChar; cmd: pAnsiChar; arg: pAnsiChar; - res: pAnsiChar; res_len: integer; flags: integer): integer; cdecl; - -(* - * Queue a command for one or more filter instances. - * - * @param graph the filter graph - * @param target the filter(s) to which the command should be sent - * "all" sends to all filters - * otherwise it can be a filter or filter instance name - * which will send the command to all matching filters. - * @param cmd the command to sent, for handling simplicity all commands must be alphanummeric only - * @param arg the argument for the command - * @param ts time at which the command should be sent to the filter - * - * @note As this executes commands after this function returns, no return code - * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. -*) -// int avfilter_graph_queue_command(AVFilterGraph * graph, const char * target, const char * cmd, const char * arg, int flags, double ts); -{$EXTERNALSYM avfilter_graph_queue_command} -function avfilter_graph_queue_command(var graph: TAVFilterGraph; target: pAnsiChar; cmd: pAnsiChar; arg: pAnsiChar; - flags: integer; ts: Double): integer; cdecl; - -(* - * Dump a graph into a human-readable string representation. - * - * @param graph the graph to dump - * @param options formatting options; currently ignored - * @return a string, or NULL in case of memory allocation failure; - * the string must be freed using av_free -*) -// char * avfilter_graph_dump(AVFilterGraph * graph, const char * options); -{$EXTERNALSYM avfilter_graph_dump} -function avfilter_graph_dump(var graph: TAVFilterGraph; options: pAnsiChar): pAnsiChar; cdecl; - -(* - * Request a frame on the oldest sink link. - * - * If the request returns AVERROR_EOF, try the next. - * - * Note that this function is not meant to be the sole scheduling mechanism - * of a filtergraph, only a convenience function to help drain a filtergraph - * in a balanced way under normal circumstances. - * - * Also note that AVERROR_EOF does not mean that frames did not arrive on - * some of the sinks during the process. - * When there are multiple sink links, in case the requested link - * returns an EOF, this may cause a filter to flush pending frames - * which are sent to another sink link, although unrequested. - * - * @return the return value of ff_request_frame(), - * or AVERROR_EOF if all links returned AVERROR_EOF -*) -// int avfilter_graph_request_oldest(AVFilterGraph * graph); -{$EXTERNALSYM avfilter_graph_request_oldest} -function avfilter_graph_request_oldest(var graph: TAVFilterGraph): integer; cdecl; - -implementation - -uses ffm.lib; - -function avfilter_version; external avfilter_dll; -function avfilter_configuration; external avfilter_dll; -function avfilter_license; external avfilter_dll; -function avfilter_get_by_name; external avfilter_dll; -function avfilter_inout_alloc; external avfilter_dll; -function avfilter_graph_alloc; external avfilter_dll; -function avfilter_graph_create_filter; external avfilter_dll; -function avfilter_graph_parse_ptr; external avfilter_dll; -function avfilter_graph_config; external avfilter_dll; -procedure avfilter_register_all; external avfilter_dll; -procedure avfilter_graph_free; external avfilter_dll; -procedure avfilter_inout_free; external avfilter_dll; -procedure avfilter_copy_buffer_ref_props; external avfilter_dll; -function avfilter_ref_buffer; external avfilter_dll; -procedure avfilter_unref_buffer; external avfilter_dll; -procedure avfilter_unref_bufferp; external avfilter_dll; -function avfilter_ref_get_channels; external avfilter_dll; -function avfilter_pad_count; external avfilter_dll; -function avfilter_pad_get_name; external avfilter_dll; -function avfilter_pad_get_type; external avfilter_dll; -function avfilter_link; external avfilter_dll; -procedure avfilter_link_free; external avfilter_dll; -function avfilter_link_get_channels; external avfilter_dll; -procedure avfilter_link_set_closed; external avfilter_dll; -function avfilter_config_links; external avfilter_dll; -function avfilter_process_command; external avfilter_dll; -function avfilter_init_dict; external avfilter_dll; -procedure avfilter_free; external avfilter_dll; -function avfilter_insert_filter; external avfilter_dll; -function avfilter_graph_alloc_filter; external avfilter_dll; -function avfilter_graph_get_filter; external avfilter_dll; -function avfilter_graph_parse; external avfilter_dll; -function avfilter_graph_parse2; external avfilter_dll; -function avfilter_graph_send_command; external avfilter_dll; -function avfilter_graph_queue_command; external avfilter_dll; -function avfilter_graph_dump; external avfilter_dll; -function avfilter_graph_request_oldest; external avfilter_dll; -function avfilter_register; external avfilter_dll; -function avfilter_next; external avfilter_dll; -function avfilter_get_class; external avfilter_dll; -function avfilter_copy_frame_props; external avfilter_dll; -function avfilter_copy_buf_props; external avfilter_dll; - -end. diff --git a/source/ffmpeg/ffm.avformat.pas b/source/ffmpeg/ffm.avformat.pas deleted file mode 100644 index 3a4fb2d..0000000 --- a/source/ffmpeg/ffm.avformat.pas +++ /dev/null @@ -1,2232 +0,0 @@ -(* - * copyright (c) 2001 Fabrice Bellard - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.avformat; - -{$i ffmpeg.inc} - -interface - -uses - ffm.log, ffm.ctypes, ffm.libavcodec.avcodec, ffm.avio, ffm.frame, ffm.rational, ffm.dict, ffm.avutil; - -(* - * @defgroup libavf I/O and Muxing/Demuxing Library - * @{ - * - * Libavformat (lavf) is a library for dealing with various media container - * formats. Its main two purposes are demuxing - i.e. splitting a media file - * into component streams, and the reverse process of muxing - writing supplied - * data in a specified container format. It also has an @ref lavf_io - * "I/O module" which supports a number of protocols for accessing the data (e.g. - * file, tcp, http and others). Before using lavf, you need to call - * av_register_all() to register all compiled muxers, demuxers and protocols. - * Unless you are absolutely sure you won't use libavformat's network - * capabilities, you should also call avformat_network_init(). - * - * A supported input format is described by an AVInputFormat struct, conversely - * an output format is described by AVOutputFormat. You can iterate over all - * registered input/output formats using the av_iformat_next() / - * av_oformat_next() functions. The protocols layer is not part of the public - * API, so you can only get the names of supported protocols with the - * avio_enum_protocols() function. - * - * Main lavf structure used for both muxing and demuxing is AVFormatContext, - * which exports all information about the file being read or written. As with - * most Libavformat structures, its size is not part of public ABI, so it cannot be - * allocated on stack or directly with av_malloc(). To create an - * AVFormatContext, use avformat_alloc_context() (some functions, like - * avformat_open_input() might do that for you). - * - * Most importantly an AVFormatContext contains: - * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat - * "output" format. It is either autodetected or set by user for input; - * always set by user for output. - * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all - * elementary streams stored in the file. AVStreams are typically referred to - * using their index in this array. - * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or - * set by user for input, always set by user for output (unless you are dealing - * with an AVFMT_NOFILE format). - * - * @section lavf_options Passing options to (de)muxers - * Lavf allows to configure muxers and demuxers using the @ref avoptions - * mechanism. Generic (format-independent) libavformat options are provided by - * AVFormatContext, they can be examined from a user program by calling - * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass - * from avformat_get_class()). Private (format-specific) options are provided by - * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / - * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. - * Further options may be provided by the @ref AVFormatContext.pb "I/O context", - * if its AVClass is non-NULL, and the protocols layer. See the discussion on - * nesting in @ref avoptions documentation to learn how to access those. - * - * @defgroup lavf_decoding Demuxing - * @{ - * Demuxers read a media file and split it into chunks of data (@em packets). A - * @ref AVPacket "packet" contains one or more encoded frames which belongs to a - * single elementary stream. In the lavf API this process is represented by the - * avformat_open_input() function for opening a file, av_read_frame() for - * reading a single packet and finally avformat_close_input(), which does the - * cleanup. - * - * @section lavf_decoding_open Opening a media file - * The minimum information required to open a file is its URL or filename, which - * is passed to avformat_open_input(), as in the following code: - * @code - * const char *url = "in.mp3"; - * AVFormatContext *s = NULL; - * int ret = avformat_open_input(&s, url, NULL, NULL); - * if (ret < 0) - * abort(); - * @endcode - * The above code attempts to allocate an AVFormatContext, open the - * specified file (autodetecting the format) and read the header, exporting the - * information stored there into s. Some formats do not have a header or do not - * store enough information there, so it is recommended that you call the - * avformat_find_stream_info() function which tries to read and decode a few - * frames to find missing information. - * - * In some cases you might want to preallocate an AVFormatContext yourself with - * avformat_alloc_context() and do some tweaking on it before passing it to - * avformat_open_input(). One such case is when you want to use custom functions - * for reading input data instead of lavf internal I/O layer. - * To do that, create your own AVIOContext with avio_alloc_context(), passing - * your reading callbacks to it. Then set the @em pb field of your - * AVFormatContext to newly created AVIOContext. - * - * Since the format of the opened file is in general not known until after - * avformat_open_input() has returned, it is not possible to set demuxer private - * options on a preallocated context. Instead, the options should be passed to - * avformat_open_input() wrapped in an AVDictionary: - * @code - * AVDictionary *options = NULL; - * av_dict_set(&options, "video_size", "640x480", 0); - * av_dict_set(&options, "pixel_format", "rgb24", 0); - * - * if (avformat_open_input(&s, url, NULL, &options) < 0) - * abort(); - * av_dict_free(&options); - * @endcode - * This code passes the private options 'video_size' and 'pixel_format' to the - * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it - * cannot know how to interpret raw video data otherwise. If the format turns - * out to be something different than raw video, those options will not be - * recognized by the demuxer and therefore will not be applied. Such unrecognized - * options are then returned in the options dictionary (recognized options are - * consumed). The calling program can handle such unrecognized options as it - * wishes, e.g. - * @code - * AVDictionaryEntry *e; - * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { - * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); - * abort(); - * } - * @endcode - * - * After you have finished reading the file, you must close it with - * avformat_close_input(). It will free everything associated with the file. - * - * @section lavf_decoding_read Reading from an opened file - * Reading data from an opened AVFormatContext is done by repeatedly calling - * av_read_frame() on it. Each call, if successful, will return an AVPacket - * containing encoded data for one AVStream, identified by - * AVPacket.stream_index. This packet may be passed straight into the libavcodec - * decoding functions avcodec_decode_video2(), avcodec_decode_audio4() or - * avcodec_decode_subtitle2() if the caller wishes to decode the data. - * - * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be - * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for - * pts/dts, 0 for duration) if the stream does not provide them. The timing - * information will be in AVStream.time_base units, i.e. it has to be - * multiplied by the timebase to convert them to seconds. - * - * If AVPacket.buf is set on the returned packet, then the packet is - * allocated dynamically and the user may keep it indefinitely. - * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a - * static storage somewhere inside the demuxer and the packet is only valid - * until the next av_read_frame() call or closing the file. If the caller - * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy - * of it. - * In both cases, the packet must be freed with av_free_packet() when it is no - * longer needed. -*) -// struct AVFormatContext; -(* - * @defgroup metadata_api Public Metadata API - * @{ - * @ingroup libavf - * The metadata API allows libavformat to export metadata tags to a client - * application when demuxing. Conversely it allows a client application to - * set metadata when muxing. - * - * Metadata is exported or set as pairs of key/value strings in the 'metadata' - * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs - * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, - * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata - * exported by demuxers isn't checked to be valid UTF-8 in most cases. - * - * Important concepts to keep in mind: - * - 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. - * - 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. - * - Several modifiers can be applied to the tag name. This is done by - * appending a dash character ('-') and the modifier name in the order - * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. - * - language -- a tag whose value is localized for a particular language - * is appended with the ISO 639-2/B 3-letter language code. - * For example: Author-ger=Michael, Author-eng=Mike - * The original/default language is in the unqualified "Author" tag. - * A demuxer should set a default if it sets any translated tag. - * - sorting -- a modified version of a tag that should be used for - * sorting will have '-sort' appended. E.g. artist="The Beatles", - * artist-sort="Beatles, The". - * - * - Demuxers attempt to export metadata in a generic format, however tags - * with no generic equivalents are left as they are stored in the container. - * Follows a list of generic tag names: - * - @verbatim - album -- name of the set this work belongs to - album_artist -- main creator of the set/album, if different from artist. - e.g. "Various Artists" for compilation albums. - artist -- main creator of the work - comment -- any additional description of the file. - composer -- who composed the work, if different from artist. - copyright -- name of copyright holder. - creation_time-- date when the file was created, preferably in ISO 8601. - date -- date when the work was created, preferably in ISO 8601. - disc -- number of a subset, e.g. disc in a multi-disc collection. - encoder -- name/settings of the software/hardware that produced the file. - encoded_by -- person/group who created the file. - filename -- original name of the file. - genre -- . - language -- main language in which the work is performed, preferably - in ISO 639-2 format. Multiple languages can be specified by - separating them with commas. - performer -- artist who performed the work, if different from artist. - E.g for "Also sprach Zarathustra", artist would be "Richard - Strauss" and performer "London Philharmonic Orchestra". - publisher -- name of the label/publisher. - service_name -- name of the service in broadcasting (channel name). - service_provider -- name of the service provider in broadcasting. - title -- name of the work. - track -- number of this work in the set, can be in form current/total. - variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of - @endverbatim - * - * Look in the examples section for an application example how to use the Metadata API. - * - * @} -*) - -// * packet functions */ - -(* - * 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 -*) -// int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); - -(* - * Read data and append it to the current content of the AVPacket. - * If pkt->size is 0 this is identical to av_get_packet. - * Note that this uses av_grow_packet and thus involves a realloc - * which is inefficient. Thus this function should only be used - * when there is no reasonable way to know (an upper bound of) - * the final size. - * - * @param pkt packet - * @param size amount of data to read - * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data - * will not be lost even if an error occurs. -*) -// int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); - -(* - ***********************************************/ - // * fractional numbers for exact pts handling -*) - -(* - * The exact value of the fractional number is: 'val + num / den'. - * num is assumed to be 0 <= num < den. -*) -Type - TAVFrac = { packed } record - val, num, den: int64_t; - end; - - (* ***********************************************/ - * input/output formats - *) - -const - /// < score for file extension - AVPROBE_SCORE_MAX = 100; - AVPROBE_SCORE_RETRY = (AVPROBE_SCORE_MAX / 4); - AVPROBE_SCORE_EXTENSION = 50; - // < maximum score - AVPROBE_PADDING_SIZE = 32; // < extra allocated bytes at the end of the probe buffer - - // Demuxer will use avio_open, no opened file should be provided by the caller. - AVFMT_NOFILE = $0001; - AVFMT_NEEDNUMBER = $0002; // **< Needs '%d' in filename. */ - AVFMT_SHOW_IDS = $0008; // **< Show format stream IDs numbers. */ - 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. Note, muxers always require valid (monotone) timestamps */ - AVFMT_VARIABLE_FPS = $0400; // **< Format allows variable fps. */ - AVFMT_NODIMENSIONS = $0800; // **< Format does not need width/height */ - AVFMT_NOSTREAMS = $1000; // **< Format does not require any streams */ - AVFMT_NOBINSEARCH = $2000; // **< Format does not allow to fall back on binary search via read_timestamp */ - AVFMT_NOGENSEARCH = $4000; // **< Format does not allow to fall back on generic search */ - AVFMT_NO_BYTE_SEEK = $8000; // **< Format does not allow seeking by bytes */ - AVFMT_ALLOW_FLUSH = $10000; - // **< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ - // #if LIBAVFORMAT_VERSION_MAJOR <= 54 - // #define AVFMT_TS_NONSTRICT $8020000 //we try to be compatible to the ABIs of ffmpeg and major forks - // #else - // #define AVFMT_TS_NONSTRICT $20000 - // #endif - // /**< Format does not require strictly - // increasing timestamps, but they must - // still be monotonic */ - // #define AVFMT_TS_NEGATIVE $40000 /**< Format allows muxing negative - // timestamps. If not set the timestamp - // will be shifted in av_write_frame and - // av_interleaved_write_frame so they - // start from 0. - // The user or muxer can override this through - // AVFormatContext.avoid_negative_ts - - // - // #define AVFMT_SEEK_TO_PTS $4000000 /**< Seeking is based on PTS */ - // - - 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. - AVFMT_FLAG_IGNDTS = $0008; - /// < Ignore DTS on frames that contain both DTS & PTS - 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 - AVFMT_FLAG_NOBUFFER = $0040; - /// < Do not buffer frames when possible - AVFMT_FLAG_CUSTOM_IO = $0080; - /// < The caller has supplied a custom AVIOContext, don't avio_close() it. - AVFMT_FLAG_DISCARD_CORRUPT = $0100; - /// < Discard frames marked corrupted - AVFMT_FLAG_FLUSH_PACKETS = $0200; - /// < Flush the AVIOContext every packet. - AVFMT_FLAG_MP4A_LATM = $8000; - /// < Enable RTP MP4A-LATM payload - AVFMT_FLAG_SORT_DTS = $10000; - /// < try to interleave outputted packets by dts (using this flag can slow demuxing down) - AVFMT_FLAG_PRIV_OPT = $20000; - /// < Enable use of private options by delaying codec open (this could be made default once all code is converted) - AVFMT_FLAG_KEEP_SIDE_DATA = $40000; - // < Don't merge side data but keep it separate. - - FF_FDEBUG_TS = $0001; - MAX_STD_TIMEBASES = (60 * 12 + 6); - MAX_PROBE_PACKETS = 2500; - MAX_REORDER_DELAY = 16; - // - AVINDEX_KEYFRAME = $0001; - // - AV_DISPOSITION_DEFAULT = $0001; - AV_DISPOSITION_DUB = $0002; - AV_DISPOSITION_ORIGINAL = $0004; - AV_DISPOSITION_COMMENT = $0008; - AV_DISPOSITION_LYRICS = $0010; - AV_DISPOSITION_KARAOKE = $0020; - // - AV_PROGRAM_RUNNING = 1; - - // - AVFMTCTX_NOHEADER = $0001; (* < signal that no header is present - (streams are added dynamically) *) - // - RAW_PACKET_BUFFER_SIZE = 2500000; - -type - pAVFormatContext = ^TAVFormatContext; - ppAVFormatContext = ^pAVFormatContext; - - ppAVCodecTag = ^pAVCodecTag; - pAVCodecTag = Pointer; - - (* - * This structure contains the data a format has to probe a file. - *) - pAVProbeData = ^TAVProbeData; - - TAVProbeData = { packed } record - filename: pAnsiChar; - buf: pByte; (* < Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. *) - buf_size: Integer; (* < Size of buf except extra allocated bytes *) - end; - - pAVOutputFormat = ^TAVOutputFormat; - - TAVOutputFormat = { packed } 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 */ - // * output support */ - audio_codec: TAVCodecID; // **< default audio codec */ - video_codec: TAVCodecID; // **< default video codec */ - subtitle_codec: TAVCodecID; // **< default subtitle codec */ - (* - * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE, - * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, - * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, - * AVFMT_TS_NONSTRICT - *) - flags: Integer; - (* - * List of supported codec_id-codec_tag pairs, ordered by "better - * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. - *) - codec_tag: ppAVCodecTag; - priv_class: pAVClass; // < AVClass for the private context - - (* *************************************************************** - * No fields below this line are part of the public API. They - * may not be used outside of libavformat and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - next: pAVOutputFormat; - (* - * size of private data so that it can be allocated in the wrapper - *) - priv_data_size: Integer; - // int (*write_header)(struct AVFormatContext *); - write_header: function(AV_FormatContext: pAVFormatContext): Integer; cdecl; - (* - * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, - * pkt can be NULL in order to flush data buffered in the muxer. - * When flushing, return 0 if there still is more data to flush, - * or 1 if everything was flushed and there is no more buffered - * data. - *) - // int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); - write_packet: function(AVFormatContext: pAVFormatContext; pkt: pAVPacket): Integer; cdecl; - // int (*write_trailer)(struct AVFormatContext *); - write_trailer: function(AVFormatContext: pAVFormatContext): Integer; cdecl; - (* - * Currently only used to set pixel format if not YUV420P. - *) - // int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, AVPacket *in, int flush); - interleave_packet: function(AVFormatContext: pAVFormatContext; AVPacket_out: pAVPacket; AVPacket_in: pAVPacket; - flush: Integer): Integer; cdecl; - (* - * Test if the given codec can be stored in this container. - * - * @return 1 if the codec is supported, 0 if it is not. - * A negative number if unknown. - * MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC - *) - // int (*query_codec)(enum AVCodecID id, int std_compliance); - query_codec: function(id: TAVCodecID; std_compliance: Integer): Integer; cdecl; - // void (*get_output_timestamp)(struct AVFormatContext *s, int stream, int64_t *dts, int64_t *wall); - get_output_timestamp: procedure(s: pAVFormatContext; stream: Integer; dts: pint64_t; wall: pint64_t); cdecl; - end; - - pAVInputFormat = ^TAVInputFormat; - - TAVInputFormat = { packed } 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; - (* - * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, - * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, - * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. - *) - flags: Integer; - (* - * 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; - codec_tag: ppAVCodecTag; - priv_class: pAVClass; // < AVClass for the private context - (* - ***************************************************************** - * No fields below this line are part of the public API. They - * may not be used outside of libavformat and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - next: pAVInputFormat; - (* - * Raw demuxers store their codec ID here. - *) - raw_codec_id: Integer; - (* - * Size of private data so that it can be allocated in the wrapper. - *) - priv_data_size: Integer; - (* - * 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. - *) - // int (* read_probe)(AVProbeData *); - read_probe: function(AV_ProbeData: pAVProbeData): Integer; cdecl; - (* - * Read the format header and initialize the AVFormatContext - * structure. Return 0 if OK. Only used in raw format right - * now. 'avformat_new_stream' should be called to create new streams. - *) - // int (*read_header)(struct AVFormatContext *); - read_header: function(AV_FormatContext: pAVFormatContext): Integer; cdecl; - (* - * Read one packet and put it in 'pkt'. pts and flags are also - * set. 'avformat_new_stream' can be called only if the flag - * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a - * background thread). - * @return 0 on success, < 0 on error. - * When returning an error, pkt must not have been allocated - * or must be freed before returning - *) - // int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); - read_packet: function(AV_FormatContext: pAVFormatContext; pkt: pAVPacket): Integer; cdecl; - (* - * Close the stream. The AVFormatContext and AVStreams are not - * freed by this function - *) - // int (*read_close)(struct AVFormatContext *); - read_close: function(AV_FormatContext: pAVFormatContext): Integer; cdecl; - (* - * 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) - *) - // int (*read_seek)(struct AVFormatContext *, int stream_index, int64_t timestamp, int flags); - read_seek: function(AV_FormatContext: pAVFormatContext; stream_index: Integer; timestamp: int64_t; flags: Integer) - : Integer; cdecl; - (* - * Get the next timestamp in stream[stream_index].time_base units. - * @return the timestamp or AV_NOPTS_VALUE if an error occurred - *) - // int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit); - read_timestamp: function(s: pAVFormatContext; stream_index: Integer; pos: pint64_t; pos_limit: int64_t) - : int64_t; cdecl; - (* - * Start/resume playing - only meaningful if using a network-based format - * (RTSP). - *) - read_play: function(AV_FormatContext: pAVFormatContext): Integer; cdecl; - (* - * Pause playing - only meaningful if using a network-based format - * (RTSP). - *) - read_pause: function(AV_FormatContext: pAVFormatContext): Integer; cdecl; - (* - * 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. - *) - // int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); - read_seek2: function(s: pAVFormatContext; stream_index: Integer; min_ts: int64_t; ts: int64_t; max_ts: int64_t; - flags: Integer): Integer; cdecl; - 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 */ - AVSTREAM_PARSE_FULL_ONCE, - // **< full parsing and repack of the first frame only, only implemented for H.264 currently */ - AVSTREAM_PARSE_FULL_RAW = $57415230 // MKTAG(0,'R','A','W') - (* < full parsing and repack with timestamp and position generation by parser for raw - this assumes that each packet in the file contains no demuxer level headers and - just codec level data, otherwise position generation would fail *) - ); - pAVIndexEntry = ^TAVIndexEntry; - - TAVIndexEntry = { packed } record - pos: int64_t; - timestamp: int64_t; - // * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available - // * when seeking to this entry. That means preferable PTS on keyframe based formats. - // * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better - // * is known - // 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). - flag_size: int32; - min_distance: Integer; - (* < Minimum distance between this and the previous keyframe, used to avoid unneeded searching. *) - end; - (* - * 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. - *) - // #define AV_DISPOSITION_FORCED $0040 - // #define AV_DISPOSITION_HEARING_IMPAIRED $0080 /**< stream for hearing impaired audiences */ - // #define AV_DISPOSITION_VISUAL_IMPAIRED $0100 /**< stream for visual impaired audiences */ - // #define AV_DISPOSITION_CLEAN_EFFECTS $0200 /**< stream without voice */ - (* - // * The stream is stored in the file as an attached picture/"cover art" (e.g. - // * APIC frame in ID3v2). The single packet associated with it will be returned - // * among the first few packets read from the file unless seeking takes place. - // * It can also be accessed at any time in AVStream.attached_pic. - *) - // #define AV_DISPOSITION_ATTACHED_PIC $0400 - // - (* - // * To specify text track kind (different from subtitles default). - *) - // #define AV_DISPOSITION_CAPTIONS $10000 - // #define AV_DISPOSITION_DESCRIPTIONS $20000 - // #define AV_DISPOSITION_METADATA $40000 - // - (* - // * Options for behavior on timestamp wrap detection. - *) - // #define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap - // #define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection - // #define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection - // - (* - // * 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*. - *) - - TDuration_error = array [0 .. 1, 0 .. MAX_STD_TIMEBASES - 1] of double; - pDuration_error = ^TDuration_error; - - pInfo = ^TInfo; - - TInfo = { packed } record - last_dts: int64_t; - duration_gcd: int64_t; - duration_count: Integer; - duration_error: pDuration_error; - codec_info_duration: int64_t; - codec_info_duration_fields: int64_t; - found_decoder: Integer; - last_duration: int64_t; - (* - * Those are used for average framerate estimation. - *) - fps_first_dts: int64_t; - fps_first_dts_idx: Integer; - fps_last_dts: int64_t; - fps_last_dts_idx: Integer; - end; - - pAVPacketList = ^TAVPacketList; - - pAVStream = ^TAVStream; - ppAVStream = ^pAVStream; - - TAVStream = { packed } record - index: Integer; // **< stream index in AVFormatContext */ - (* - * Format-specific stream ID. - * decoding: set by libavformat - * encoding: set by the user, replaced by libavformat if left unset - *) - id: Integer; - (* - * Codec context associated with this stream. Allocated and freed by - * libavformat. - * - * - decoding: The demuxer exports codec information stored in the headers - * here. - * - encoding: The user sets codec information, the muxer writes it to the - * output. Mandatory fields as specified in AVCodecContext - * documentation must be set even if this AVCodecContext is - * not actually used for encoding. - *) - codec: pAVCodecContext; - priv_data: Pointer; - (* - * 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. - * - * decoding: set by libavformat - * encoding: set by libavformat in avformat_write_header. The muxer may use the - * user-provided value of @ref AVCodecContext.time_base "codec->time_base" - * as a hint. - *) - time_base: TAVRational; - (* - * Decoding: pts of the first frame of the stream in presentation order, in stream time base. - * Only set this if you are absolutely 100% sure that the value you set - * it to really is the pts of the first frame. - * This may be undefined (AV_NOPTS_VALUE). - * @note The ASF header does NOT contain a correct start_time the ASF - * demuxer must NOT set this. - *) - start_time: int64_t; - (* - * 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: int64_t; - nb_frames: int64_t; // < number of frames in this stream if known or 0 - disposition: Integer; // **< AV_DISPOSITION_* bit field */ - discard: TAVDiscard; - /// < Selects which packets can be discarded at will and do not need to be demuxed. - (* - * sample aspect ratio (0 if unknown) - * - encoding: Set by user. - * - decoding: Set by libavformat. - *) - sample_aspect_ratio: TAVRational; - metadata: pAVDictionary; - (* - * Average framerate - *) - avg_frame_rate: TAVRational; - (* - * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet - * will contain the attached picture. - * - * decoding: set by libavformat, must not be modified by the caller. - * encoding: unused - *) - attached_pic: TAVPacket; - (* *************************************************************** - * All fields below this line are not part of the public API. They - * may not be used outside of libavformat and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - (* - * Stream information used internally by av_find_stream_info() - *) - // #define MAX_STD_TIMEBASES (60*12+6) - Info: pInfo; - pts_wrap_bits: Integer; // **< number of bits in pts (used for wrapping control) */ -{$IFDEF FF_API_REFERENCE_DTS} - // * a hack to keep ABI compatibility for ffmpeg and other applications, which accesses parser even - // * though it should not */ - do_not_use: int64_t; -{$ENDIF} - // 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. - *) - first_dts: int64_t; - cur_dts: int64_t; - last_IP_pts: int64_t; - last_IP_duration: Integer; - (* - * Number of packets to buffer for codec probing - *) - // #define MAX_PROBE_PACKETS 2500 - probe_packets: Integer; - (* - * Number of frames that have been demuxed during av_find_stream_info() - *) - codec_info_nb_frames: Integer; - - // * av_read_frame() support */ - need_parsing: TAVStreamParseType; - parser: pAVCodecParserContext; - (* - * last packet in packet_buffer for this stream when muxing. - *) - last_in_packet_buffer: pAVPacketList; - probe_data: TAVProbeData; - // #define MAX_REORDER_DELAY 16 - pts_buffer: array [0 .. MAX_REORDER_DELAY] of int64_t; - index_entries: pAVIndexEntry; (* < Only used if the format does not - support seeking natively. *) - nb_index_entries: Integer; - index_entries_allocated_size: Cardinal; - (* - * 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. - * - * Code outside avformat should access this field using: - * av_stream_get/set_r_frame_rate(stream) - *) - r_frame_rate: TAVRational; - (* - * Stream Identifier - * This is the MPEG-TS stream identifier +1 - * 0 means unknown - *) - stream_identifier: Integer; - - interleaver_chunk_size: int64_t; - interleaver_chunk_duration: int64_t; - - (* - * stream probing state - * -1 -> probing finished - * 0 -> no probing requested - * rest -> perform probing with request_probe being the minimum score to accept. - * NOT PART OF PUBLIC API - *) - request_probe: Integer; - (* - * Indicates that everything up to the next keyframe - * should be discarded. - *) - skip_to_keyframe: Integer; - (* - * Number of samples to skip at the start of the frame decoded from the next packet. - *) - skip_samples: Integer; - (* - * Number of internally decoded frames, used internally in libavformat, do not access - * its lifetime differs from info which is why it is not in that structure. - *) - nb_decoded_frames: Integer; - (* - * Timestamp offset added to timestamps before muxing - * NOT PART OF PUBLIC API - *) - mux_ts_offset: int64_t; - (* - * Internal data to check for wrapping of the time stamp - *) - pts_wrap_reference: int64_t; - (* - * Options for behavior, when a wrap is detected. - * - * Defined by AV_PTS_WRAP_ values. - * - * If correction is enabled, there are two possibilities: - * If the first time stamp is near the wrap point, the wrap offset - * will be subtracted, which will create negative time stamps. - * Otherwise the offset will be added. - *) - pts_wrap_behavior: Integer; - end; - - // AVRational av_stream_get_r_frame_rate(const AVStream *s); - // void av_stream_set_r_frame_rate(AVStream *s, AVRational r); - - (* - * 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*. - *) - pAVProgram = ^TAVProgram; - ppAVProgram = ^pAVProgram; - - TAVProgram = { packed } record - id: Integer; - flags: Integer; - discard: TAVDiscard; - /// < selects which program to discard and which to feed to the caller - stream_index: pCardinal; - nb_stream_indexes: Cardinal; - metadata: pAVDictionary; - program_num: Integer; - pmt_pid: Integer; - pcr_pid: Integer; - (* *************************************************************** - * All fields below this line are not part of the public API. They - * may not be used outside of libavformat and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - start_time: int64_t; - end_time: int64_t; - pts_wrap_reference: int64_t; - /// < reference dts for wrap detection - pts_wrap_behavior: Integer; - /// < behavior on wrap detection - end; - - pAVChapter = ^TAVChapter; - ppAVChapter = ^pAVChapter; - - TAVChapter = { packed } record - id: Integer; - /// < unique ID to identify the chapter - time_base: TAVRational; - /// < time base in which the start/end timestamps are specified - start, _end: int64_t; - /// < chapter start/end time in time_base units - metadata: pAVDictionary; - end; - (* - // * The duration of a video can be estimated through various ways, and this enum can be used - // * to know how the duration was estimated. - *) - - TAVDurationEstimationMethod = ( // - AVFMT_DURATION_FROM_PTS, - /// < Duration accurately estimated from PTSes - AVFMT_DURATION_FROM_STREAM, - /// < Duration estimated from a stream with a known duration - AVFMT_DURATION_FROM_BITRATE - /// < Duration estimated from bitrate (less accurate) - ); - - (* * - * 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*, use - * avformat_alloc_context() to create an AVFormatContext. - *) - - TAVFormatContext = { packed } record - (* - * A class for logging and AVOptions. Set by avformat_alloc_context(). - * Exports (de)muxer private options if they exist. - *) - av_class: pAVClass; - (* - * Can only be iformat or oformat, not both at the same time. - * - * decoding: set by avformat_open_input(). - * encoding: set by the user. - *) - iformat: pAVInputFormat; // - oformat: pAVOutputFormat; - (* - * Format private data. This is an AVOptions-enabled struct - * if and only if iformat/oformat.priv_class is not NULL. - *) - priv_data: Pointer; - (* - * I/O context. - * - * decoding: either set by the user before avformat_open_input() (then - * the user must close it manually) or set by avformat_open_input(). - * encoding: set by the user. - * - * Do NOT set this field if AVFMT_NOFILE flag is set in - * iformat/oformat.flags. In such a case, the (de)muxer will handle - * I/O in some other way and this field will be NULL. - *) - pb: pAVIOContext; - - (* stream info *) - ctx_flags: Integer; // **< Format-specific flags, see AVFMTCTX_xx */ - - (* - * A list of all streams in the file. New streams are created with - * avformat_new_stream(). - * - * decoding: streams are created by libavformat in avformat_open_input(). - * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also - * appear in av_read_frame(). - * encoding: streams are created by the user before avformat_write_header(). - *) - nb_streams: Cardinal; - streams: ppAVStream; // - filename: array [0 .. 1023] of AnsiChar; // allow negative timestamps - * 1 -> avoid negative timestamps - * -1 -> choose automatically (default) - * Note, this only works when interleave_packet_per_dts is in use. - * - encoding: Set by user via AVOptions (NO direct access) - * - decoding: unused - *) - // int avoid_negative_ts; - avoid_negative_ts: Integer; - (* - * avio flags, used to force AVIO_FLAG_DIRECT. - * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) - *) - // int avio_flags; - avio_flags: Integer; - (* - * The duration field can be estimated through various ways, and this field can be used - * to know how the duration was estimated. - * - encoding: unused - * - decoding: Read by user via AVOptions (NO direct access) - *) - // enum AVDurationEstimationMethod duration_estimation_method; - duration_estimation_method: TAVDurationEstimationMethod; - (* - * Skip initial bytes when opening stream - * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) - *) - // unsigned int skip_initial_bytes; - skip_initial_bytes: Cardinal; - (* - * Correct single timestamp overflows - * - encoding: unused - * - decoding: Set by user via AVOPtions (NO direct access) - *) - // unsigned int correct_ts_overflow; - correct_ts_overflow: Cardinal; - (* - * Force seeking to any (also non key) frames. - * - encoding: unused - * - decoding: Set by user via AVOPtions (NO direct access) - *) - // int seek2any; - seek2any: Integer; - (* - * Flush the I/O context after each packet. - * - encoding: Set by user via AVOptions (NO direct access) - * - decoding: unused - *) - // int flush_packets; - flush_packets: Integer; - (* - * format probing score. - * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes - * the format. - * - encoding: unused - * - decoding: set by avformat, read by user via av_format_get_probe_score() (NO direct access) - *) - // int probe_score; - probe_score: Integer; - (* *************************************************************** - * All fields below this line are not part of the public API. They - * may not be used outside of libavformat and can be changed and - * removed at will. - * New public fields should be added right above. - ***************************************************************** - *) - - (* - * This buffer is only needed when packets were already buffered but - * not decoded, for example to get the codec parameters in MPEG - * streams. - *) - // struct AVPacketList *packet_buffer; - packet_buffer: pAVPacketList; - // struct AVPacketList *packet_buffer_end; - packet_buffer_end: pAVPacketList; - - (* av_seek_frame() support *) - // int64_t data_offset; /**< offset of the first packet */ - data_offset: int64_t; - - (* - * 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. - *) - // struct AVPacketList *raw_packet_buffer; - raw_packet_buffer: pAVPacketList; - // struct AVPacketList *raw_packet_buffer_end; - raw_packet_buffer_end: pAVPacketList; - (* - * Packets split by the parser get queued here. - *) - // struct AVPacketList *parse_queue; - parse_queue: pAVPacketList; - // struct AVPacketList *parse_queue_end; - parse_queue_end: pAVPacketList; - (* - * Remaining size available for raw_packet_buffer, in bytes. - *) - // #define RAW_PACKET_BUFFER_SIZE 2500000 - // int raw_packet_buffer_remaining_size; - raw_packet_buffer_remaining_size: Integer; - - (* - * Offset to remap timestamps to be non-negative. - * Expressed in timebase units. - * @see AVStream.mux_ts_offset - *) - // int64_t offset; - offset: int64_t; - - (* - * Timebase for the timestamp offset. - *) - // AVRational offset_timebase; - offset_timebase: TAVRational; - - (* - * IO repositioned flag. - * This is set by avformat when the underlaying IO context read pointer - * is repositioned, for example when doing byte based seeking. - * Demuxers can use the flag to detect such changes. - *) - // int io_repositioned; - io_repositioned: Integer; - - (* - * Forced video codec. - * This allows forcing a specific decoder, even when there are multiple with - * the same codec_id. - * Demuxing: Set by user via av_format_set_video_codec (NO direct access). - *) - // AVCodec *video_codec; - video_codec: pAVCodec; - - (* - * Forced audio codec. - * This allows forcing a specific decoder, even when there are multiple with - * the same codec_id. - * Demuxing: Set by user via av_format_set_audio_codec (NO direct access). - *) - // AVCodec *audio_codec; - audio_codec: pAVCodec; - - (* - * Forced subtitle codec. - * This allows forcing a specific decoder, even when there are multiple with - * the same codec_id. - * Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access). - *) - subtitle_codec: pAVCodec; - end; - - // int av_format_get_probe_score(const AVFormatContext *s); - // AVCodec * av_format_get_video_codec(const AVFormatContext *s); - // void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); - // AVCodec * av_format_get_audio_codec(const AVFormatContext *s); - // void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); - // AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); - // void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); - // - (* - // * Returns the method used to set ctx->duration. - // * - // * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. - *) - // enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); - - TAVPacketList = { packed } record - pkt: TAVPacket; - next: pAVPacketList; - end; - - (* - // * Return the LIBAVFORMAT_VERSION_INT constant. - *) - // unsigned avformat_version(void); - // - (* - // * Return the libavformat build-time configuration. - *) - // const char *avformat_configuration(void); - // - (* - // * Return the libavformat license. - *) - // const char *avformat_license(void); - // - (* - // * 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() - *) - // void av_register_all(void); -procedure av_register_all(); cdecl; -// -// void av_register_input_format(AVInputFormat *format); -// void av_register_output_format(AVOutputFormat *format); -// -(* - // * Do global initialization of network components. This is optional, - // * but recommended, since it avoids the overhead of implicitly - // * doing the setup for each session. - // * - // * Calling this function will become mandatory if using network - // * protocols at some major version bump. -*) -// int avformat_network_init(void); -function avformat_network_init(): Integer; cdecl; -// -(* - // * Undo the initialization done by avformat_network_init. -*) -// int avformat_network_deinit(void); -function avformat_network_deinit(): Integer; cdecl; -// -(* - // * 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. -*) -// AVInputFormat *av_iformat_next(AVInputFormat *f); -// -(* - // * If f is NULL, returns the first registered output format, - // * if f is non-NULL, returns the next registered output format after f - // * or NULL if f is the last one. -*) -// AVOutputFormat *av_oformat_next(AVOutputFormat *f); -// -(* - // * Allocate an AVFormatContext. - // * avformat_free_context() can be used to free the context and everything - // * allocated by the framework within it. -*) -function avformat_alloc_context(): pAVFormatContext; cdecl; -// -(* - // * Free an AVFormatContext and all its streams. - // * @param s context to free -*) -// void avformat_free_context(AVFormatContext *s); -procedure avformat_free_context(s: pAVFormatContext); cdecl; -(* - // * Get the AVClass for AVFormatContext. It can be used in combination with - // * AV_OPT_SEARCH_FAKE_OBJ for examining options. - // * - // * @see av_opt_find(). -*) -// const AVClass *avformat_get_class(void); -// -(* - // * Add a new stream to a media file. - // * - // * When demuxing, it is called by the demuxer in read_header(). If the - // * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also - // * be called in read_packet(). - // * - // * When muxing, should be called by the user before avformat_write_header(). - // * - // * User is required to call avcodec_close() and avformat_free_context() to - // * clean up the allocation by avformat_new_stream(). - // * - // * @param c If non-NULL, the AVCodecContext corresponding to the new stream - // * will be initialized to use this codec. This is needed for e.g. codec-specific - // * defaults to be set, so codec should be provided if it is known. - // * - // * @return newly created stream or NULL on error. -*) -// AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); -function avformat_new_stream(s: pAVFormatContext; const c: pAVCodec): pAVStream; cdecl; -// AVProgram *av_new_program(AVFormatContext *s, int id); -// -(* - // * @} -*) -// -// -// #if FF_API_ALLOC_OUTPUT_CONTEXT -(* - * @deprecated deprecated in favor of avformat_alloc_output_context2() -*) -// attribute_deprecated -// AVFormatContext *avformat_alloc_output_context(const char *format, -// AVOutputFormat *oformat, -// const char *filename); -// #endif -// -(* - * Allocate an AVFormatContext for an output format. - * avformat_free_context() can be used to free the context and - * everything allocated by the framework within it. - * - * @param *ctx is set to the created format context, or to NULL in - * case of failure - * @param oformat format to use for allocating the context, if NULL - * format_name and filename are used instead - * @param format_name the name of output format to use for allocating the - * context, if NULL filename is used instead - * @param filename the name of the filename to use for allocating the - * context, may be NULL - * @return >= 0 in case of success, a negative AVERROR code in case of - * failure -*) -// int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, const char *format_name, const char *filename); -function avformat_alloc_output_context2(Var ctx: pAVFormatContext; oformat: pAVOutputFormat; - const format_name: pAnsiChar; const filename: pAnsiChar): Integer; cdecl; -(* - // * @addtogroup lavf_decoding - // * @{ -*) -// -(* - // * Find AVInputFormat based on the short name of the input format. -*) -// AVInputFormat *av_find_input_format(const char *short_name); -// -(* - * Guess the file format. - * - * @param is_opened Whether the file is already opened; determines whether - * demuxers with or without AVFMT_NOFILE are probed. -*) -// AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); -// -(* - * 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. -*) -// AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); -// -(* - * Guess the file format. - * - * @param is_opened Whether the file is already opened; determines whether - * demuxers with or without AVFMT_NOFILE are probed. - * @param score_ret The score of the best detection. -*) -// AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret); -// -(* - * Probe a bytestream to determine the input format. Each time a probe returns - * with a score that is too low, the probe buffer size is increased and another - * attempt is made. When the maximum probe size is reached, the input format - * with the highest score is returned. - * - * @param pb the bytestream to probe - * @param fmt the input format is put here - * @param filename the filename of the stream - * @param logctx the log context - * @param offset the offset within the bytestream to probe from - * @param max_probe_size the maximum probe buffer size (zero for default) - * @return the score in case of success, a negative value corresponding to an - * the maximal score is AVPROBE_SCORE_MAX - * AVERROR code otherwise -*) -// int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt, -// const char *filename, void *logctx, -// unsigned int offset, unsigned int max_probe_size); -// -(* - * Like av_probe_input_buffer2() but returns 0 on success -*) -// int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, -// const char *filename, void *logctx, -// unsigned int offset, unsigned int max_probe_size); -// -(* - * Open an input stream and read the header. The codecs are not opened. - * The stream must be closed with avformat_close_input(). - * - * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). - * May be a pointer to NULL, in which case an AVFormatContext is allocated by this - * function and written into ps. - * Note that a user-supplied AVFormatContext will be freed on failure. - * @param filename Name of the stream to open. - * @param fmt If non-NULL, this parameter forces a specific input format. - * Otherwise the format is autodetected. - * @param options A dictionary filled with AVFormatContext and demuxer-private options. - * On return this parameter will be destroyed and replaced with a dict containing - * options that were not found. May be NULL. - * - * @return 0 on success, a negative AVERROR on failure. - * - * @note If you want to use custom IO, preallocate the format context and set its pb field. -*) - -// int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options); -function avformat_open_input(var ps: pAVFormatContext; const filename: pAnsiChar; fmt: pAVInputFormat; - options: ppAVDictionary): Integer; cdecl; - -// attribute_deprecated -// int av_demuxer_open(AVFormatContext *ic); -// -// #if FF_API_FORMAT_PARAMETERS -(* - // * 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. - // * - // * @deprecated use avformat_find_stream_info. -*) -// attribute_deprecated -// int av_find_stream_info(AVFormatContext *ic); -// #endif -// -(* - * 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 - * @param options If non-NULL, an ic.nb_streams long array of pointers to - * dictionaries, where i-th member contains options for - * codec corresponding to i-th stream. - * On return each dictionary will be filled with options that were not found. - * @return >=0 if OK, AVERROR_xxx on error - * - * @note this function isn't guaranteed to open all the codecs, so - * options being non-empty at return is a perfectly normal behavior. - * - * @todo Let the user decide somehow what information is needed so that - * we do not waste time getting stuff the user does not need. -*) -// int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); -function avformat_find_stream_info(ic: pAVFormatContext; options: ppAVDictionary): Integer; cdecl; -(* - // * Find the programs which belong to a given stream. - // * - // * @param ic media file handle - // * @param last the last found program, the search will start after this - // * program, or from the beginning if it is NULL - // * @param s stream index - // * @return the next program which belongs to s, NULL if no program is found or - // * the last program is not among the programs of ic. -*) -// AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); -// -(* - // * Find the "best" stream in the file. - // * The best stream is determined according to various heuristics as the most - // * likely to be what the user expects. - // * If the decoder parameter is non-NULL, av_find_best_stream will find the - // * default decoder for the stream's codec; streams for which no decoder can - // * be found are ignored. - // * - // * @param ic media file handle - // * @param type stream type: video, audio, subtitles, etc. - // * @param wanted_stream_nb user-requested stream number, - // * or -1 for automatic selection - // * @param related_stream try to find a stream related (eg. in the same - // * program) to this one, or -1 if none - // * @param decoder_ret if non-NULL, returns the decoder for the - // * selected stream - // * @param flags flags; none are currently defined - // * @return the non-negative stream number in case of success, - // * AVERROR_STREAM_NOT_FOUND if no stream with the requested type - // * could be found, - // * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder - // * @note If av_find_best_stream returns successfully and decoder_ret is not - // * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. -*) -// int av_find_best_stream(AVFormatContext *ic, -// enum AVMediaType type, -// int wanted_stream_nb, -// int related_stream, -// AVCodec **decoder_ret, -// int flags); -function av_find_best_stream(ic: pAVFormatContext; _type: TAVMediaType; wanted_stream_nb: Integer; - related_stream: Integer; Var decoder_ret: pAVCodec; flags: Integer): Integer; cdecl; - -// #if FF_API_READ_PACKET -(* - // * @deprecated use AVFMT_FLAG_NOFILLIN | AVFMT_FLAG_NOPARSE to read raw - // * unprocessed packets - // * - // * 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 -*) -// attribute_deprecated -// int av_read_packet(AVFormatContext *s, AVPacket *pkt); -// #endif -// -(* - // * Return the next frame of a stream. - // * This function returns what is stored in the file, and does not validate - // * that what is there are valid frames for the decoder. It will split what is - // * stored in the file into frames and return one for each call. It will not - // * omit invalid data between valid frames so as to give the decoder the maximum - // * information possible for decoding. - // * - // * If pkt->buf is NULL, then the packet is valid until the next - // * av_read_frame() or until avformat_close_input(). Otherwise the packet - // * is valid indefinitely. In both cases the packet must be freed with - // * av_free_packet when it is no longer needed. For video, the packet contains - // * exactly one frame. For audio, it contains an integer number of frames if each - // * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames - // * have a variable size (e.g. MPEG audio), then it contains one frame. - // * - // * 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 -*) -// int av_read_frame(AVFormatContext *s, AVPacket *pkt); -function av_read_frame(s: pAVFormatContext; Var pkt: TAVPacket): Integer; cdecl; -// -(* - // * 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 -*) -// int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, -// int flags); -// -(* - // * 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 bytes 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). - // * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. - // * - // * @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! -*) -// int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); -// -(* - // * Start playing a network-based stream (e.g. RTSP stream) at the - // * current position. -*) -// int av_read_play(AVFormatContext *s); -// -(* - // * Pause a network-based stream (e.g. RTSP stream). - // * - // * Use av_read_play() to resume it. -*) -// int av_read_pause(AVFormatContext *s); -// -// #if FF_API_CLOSE_INPUT_FILE -(* - // * @deprecated use avformat_close_input() - // * Close a media file (but not its codecs). - // * - // * @param s media file handle -*) -// attribute_deprecated -// void av_close_input_file(AVFormatContext *s); -// #endif -// -(* - // * Close an opened input AVFormatContext. Free it and all its contents - // * and set *s to NULL. -*) -// void avformat_close_input(AVFormatContext **s); -procedure avformat_close_input(Var s: pAVFormatContext); cdecl; -(* - // * @} -*) -// -// #if FF_API_NEW_STREAM -(* - // * 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 -*) -// attribute_deprecated -// AVStream *av_new_stream(AVFormatContext *s, int id); -// #endif -// -// #if FF_API_SET_PTS_INFO -(* - // * @deprecated this function is not supposed to be called outside of lavf -*) -// attribute_deprecated -// void av_set_pts_info(AVStream *s, int pts_wrap_bits, -// unsigned int pts_num, unsigned int pts_den); -// #endif -// -// #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward -// #define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes -// #define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes -// #define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number -// -(* - // * @addtogroup lavf_encoding - // * @{ -*) -(* - // * Allocate the stream private data and write the stream header to - // * an output media file. - // * - // * @param s Media file handle, must be allocated with avformat_alloc_context(). - // * Its oformat field must be set to the desired output format; - // * Its pb field must be set to an already opened AVIOContext. - // * @param options An AVDictionary filled with AVFormatContext and muxer-private options. - // * On return this parameter will be destroyed and replaced with a dict containing - // * options that were not found. May be NULL. - // * - // * @return 0 on success, negative AVERROR on failure. - // * - // * @see av_opt_find, av_dict_set, avio_open, av_oformat_next. -*) -// int avformat_write_header(AVFormatContext *s, AVDictionary **options); -function avformat_write_header(s: pAVFormatContext; options: ppAVDictionary): Integer; cdecl; -(* - // * 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, ... - // * This can be NULL (at any time, not just at the end), in - // * order to immediately flush data buffered within the muxer, - // * for muxers that buffer up data internally before writing it - // * to the output. - // * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush -*) -// int av_write_frame(AVFormatContext *s, AVPacket *pkt); -function av_write_frame(s: pAVFormatContext; pkt: pAVPacket): Integer; cdecl; -(* - // * 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 containing the data to be written. pkt->buf must be set - // * to a valid AVBufferRef describing the packet data. Libavformat takes - // * ownership of this reference and will unref it when it sees fit. The caller - // * must not access the data through this reference after this function returns. - // * This can be NULL (at any time, not just at the end), to flush the - // * interleaving queues. - // * Packet's @ref AVPacket.stream_index "stream_index" field must be set to the - // * index of the corresponding stream in @ref AVFormatContext.streams - // * "s.streams". - // * It is very strongly recommended that timing information (@ref AVPacket.pts - // * "pts", @ref AVPacket.dts "dts" @ref AVPacket.duration "duration") is set to - // * correct values. - // * - // * @return 0 on success, a negative AVERROR on error. -*) -// int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); -function av_interleaved_write_frame(s: pAVFormatContext; pkt: pAVPacket): Integer; cdecl; - -(* - // * Write the stream trailer to an output media file and free the - // * file private data. - // * - // * May only be called after a successful call to avformat_write_header. - // * - // * @param s media file handle - // * @return 0 if OK, AVERROR_xxx on error -*) -// int av_write_trailer(AVFormatContext *s); -function av_write_trailer(s: pAVFormatContext): Integer; cdecl; -// -(* - // * 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 -*) -// AVOutputFormat *av_guess_format(const char *short_name, -// const char *filename, -// const char *mime_type); - -function av_guess_format(const short_name: pAnsiChar; const filename: pAnsiChar; const mime_type: pAnsiChar) - : pAVOutputFormat; cdecl; - -(* - // * Guess the codec ID based upon muxer and filename. -*) -// enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, -// const char *filename, const char *mime_type, -// enum AVMediaType type); -// -(* - // * Get timing information for the data currently output. - // * The exact meaning of "currently output" depends on the format. - // * It is mostly relevant for devices that have an internal buffer and/or - // * work in real time. - // * @param s media file handle - // * @param stream stream in the media file - // * @param[out] dts DTS of the last packet output for the stream, in stream - // * time_base units - // * @param[out] wall absolute time when that packet whas output, - // * in microsecond - // * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it - // * Note: some formats or devices may not allow to measure dts and wall - // * atomically. -*) -// int av_get_output_timestamp(struct AVFormatContext *s, int stream, -// int64_t *dts, int64_t *wall); -// -// -(* - // * @} -*) -// -// -(* - // * @defgroup lavf_misc Utility functions - // * @ingroup libavf - // * @{ - // * - // * Miscellaneous utility functions related to both muxing and demuxing - // * (or neither). -*) -// -(* - // * Send a nice hexadecimal dump of a buffer to the specified file stream. - // * - // * @param f The file stream pointer where the dump should be sent to. - // * @param buf buffer - // * @param size buffer size - // * - // * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 -*) -// void av_hex_dump(FILE *f, const uint8_t *buf, int size); -// -(* - // * 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_dump2, av_pkt_dump_log2 -*) -// void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); -// -(* - // * Send a nice dump of a packet to the specified file stream. - // * - // * @param f The file stream pointer where the dump should be sent to. - // * @param pkt packet to dump - // * @param dump_payload True if the payload must be displayed, too. - // * @param st AVStream that the packet belongs to -*) -// void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st); -// -// -(* - // * Send a nice dump of a packet to the log. - // * - // * @param avcl A pointer to an arbitrary struct of which the first field is a - // * pointer to an AVClass struct. - // * @param level The importance level of the message, lower values signifying - // * higher importance. - // * @param pkt packet to dump - // * @param dump_payload True if the payload must be displayed, too. - // * @param st AVStream that the packet belongs to -*) -// void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload, -// AVStream *st); -// -(* - // * Get the AVCodecID for the given codec tag tag. - // * If no codec id is found returns AV_CODEC_ID_NONE. - // * - // * @param tags list of supported codec_id-codec_tag pairs, as stored - // * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag -*) -// enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); -// -(* - // * Get the 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 -*) -// unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); -// -(* - // * Get the codec tag for the given codec id. - // * - // * @param tags list of supported codec_id - codec_tag pairs, as stored - // * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag - // * @param id codec id that should be searched for in the list - // * @param tag A pointer to the found tag - // * @return 0 if id was not found in tags, > 0 if it was found -*) -// int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, -// unsigned int *tag); -// -// int av_find_default_stream_index(AVFormatContext *s); -// -(* - // * 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 -*) -// int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); -// -(* - // * Add an index entry into a sorted list. Update the entry if the list - // * already contains it. - // * - // * @param timestamp timestamp in the time base of the given stream -*) -// int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, -// int size, int distance, int flags); -// -// -(* - // * 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 -*) -// void av_url_split(char *proto, int proto_size, -// char *authorization, int authorization_size, -// char *hostname, int hostname_size, -// int *port_ptr, -// char *path, int path_size, -// const char *url); -// -// -// void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output); -procedure av_dump_format(ic: pAVFormatContext; index: Integer; url: pAnsiChar; is_output: Integer); cdecl; - -(* - // * 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 -*) -// int av_get_frame_filename(char *buf, int buf_size, -// const char *path, int number); -// -(* - // * 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 -*) -// int av_filename_number_test(const char *filename); -// -(* - // * Generate an SDP for an RTP session. - // * - // * Note, this overwrites the id values of AVStreams in the muxer contexts - // * for getting unique dynamic payload types. - // * - // * @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 buf buffer where the SDP will be stored (must be allocated by - // * the caller) - // * @param size the size of the buffer - // * @return 0 if OK, AVERROR_xxx on error -*) -// int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); -// -(* - // * 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 -*) -// int av_match_ext(const char *filename, const char *extensions); -// -(* - // * Test if the given container can store a codec. - // * - // * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* - // * - // * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. - // * A negative number if this information is not available. -*) -// int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance); -// -(* - // * @defgroup riff_fourcc RIFF FourCCs - // * @{ - // * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are - // * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the - // * following code: - // * @code - // * uint32_t tag = MKTAG('H', '2', '6', '4'); - // * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; - // * enum AVCodecID id = av_codec_get_id(table, tag); - // * @endcode -*) -(* - // * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. -*) -// const struct AVCodecTag *avformat_get_riff_video_tags(void); -(* - // * @return the table mapping RIFF FourCCs for audio to AVCodecID. -*) -// const struct AVCodecTag *avformat_get_riff_audio_tags(void); -// -(* - // * @} -*) -// -(* - // * Guess the sample aspect ratio of a frame, based on both the stream and the - // * frame aspect ratio. - // * - // * Since the frame aspect ratio is set by the codec but the stream aspect ratio - // * is set by the demuxer, these two may not be equal. This function tries to - // * return the value that you should use if you would like to display the frame. - // * - // * Basic logic is to use the stream aspect ratio if it is set to something sane - // * otherwise use the frame aspect ratio. This way a container setting, which is - // * usually easy to modify can override the coded value in the frames. - // * - // * @param format the format context which the stream is part of - // * @param stream the stream which the frame is part of - // * @param frame the frame with the aspect ratio to be determined - // * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea -*) -// AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); -// -(* - // * Guess the frame rate, based on both the container and codec information. - // * - // * @param ctx the format context which the stream is part of - // * @param stream the stream which the frame is part of - // * @param frame the frame for which the frame rate should be determined, may be NULL - // * @return the guessed (valid) frame rate, 0/1 if no idea -*) -// AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); -// -(* - // * Check if the stream st contained in s is matched by the stream specifier - // * spec. - // * - // * See the "stream specifiers" chapter in the documentation for the syntax - // * of spec. - // * - // * @return >0 if st is matched by spec; - // * 0 if st is not matched by spec; - // * AVERROR code if spec is invalid - // * - // * @note A stream specifier can match several streams in the format. -*) -// int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, -// const char *spec); -// -// int avformat_queue_attached_pictures(AVFormatContext *s); -// -(* - // * @} -*) - -implementation - -uses ffm.lib; - -procedure av_register_all; external avformat_dll; -function avformat_open_input; external avformat_dll; -function avformat_alloc_context; external avformat_dll; -procedure avformat_free_context; external avformat_dll; -function avformat_find_stream_info; external avformat_dll; -procedure av_dump_format; external avformat_dll; -function avformat_alloc_output_context2; external avformat_dll; -function av_find_best_stream; external avformat_dll; -procedure avformat_close_input; external avformat_dll; -function av_read_frame; external avformat_dll; -function avformat_network_init; external avformat_dll; -function avformat_network_deinit; external avformat_dll; -function av_guess_format; external avformat_dll; -function avformat_write_header; external avformat_dll; -function av_write_trailer; external avformat_dll; -function avformat_new_stream; external avformat_dll; -function av_interleaved_write_frame; external avformat_dll; -function av_write_frame; external avformat_dll; - -end. diff --git a/source/ffmpeg/ffm.avio.pas b/source/ffmpeg/ffm.avio.pas deleted file mode 100644 index ffd8b51..0000000 --- a/source/ffmpeg/ffm.avio.pas +++ /dev/null @@ -1,506 +0,0 @@ -unit ffm.avio; - -{$i ffmpeg.inc} - -interface - -uses - ffm.log, ffm.ctypes; - -(* - // * copyright (c) 2001 Fabrice Bellard - // * - // * This file is part of ffm. - // * - // * 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 -*) -// #ifndef AVFORMAT_AVIO_H -// #define AVFORMAT_AVIO_H -// -(* - // * @file - // * @ingroup lavf_io - // * Buffered I/O operations -*) -// -// #include -// -// #include "libavutil/common.h" -// #include "libavutil/dict.h" -// #include "libavutil/log.h" -// -// #include "libavformat/version.h" -// -// -// #define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */ -// -(* - * Callback for checking whether to abort blocking functions. - * AVERROR_EXIT is returned in this case by the interrupted - * function. During blocking operations, callback is called with - * opaque as parameter. If the callback returns 1, the - * blocking operation will be aborted. - * - * No members can be added to this struct without a major bump, if - * new elements have been added after this struct in AVFormatContext - * or AVIOContext. -*) - -Type - TAVIOInterruptCB = record - callback: function(param: Pointer): integer; cdecl; - opaque: Pointer; - 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(AVIOContext) must not be used outside libav*. - // * - // * @note None of the function pointers in AVIOContext should be called - // * directly, they should only be set by the client application - // * when implementing custom I/O. Normally these are set to the - // * function pointers specified in avio_alloc_context() - *) - - pAVIOContext = ^TAVIOContext; - - TAVIOContext = {packed} record - (* - * A class for private options. - * - * If this AVIOContext is created by avio_open2(), av_class is set and - * passes the options down to protocols. - * - * If this AVIOContext is manually allocated, then av_class may be set by - * the caller. - * - * warning -- this field can be NULL, be sure to not pass this AVIOContext - * to any av_opt_* functions in that case. - *) - av_class: pAVClass; - buffer: pByte; // **< Start of the buffer. */ - buffer_size: integer; // **< Maximum buffer size */ - buf_ptr: pByte; // **< Current position in the buffer */ - buf_end: pByte; // **< End of the data, may be less than - // buffer+buffer_size if the read function returned - // less data than requested, e.g. for streams where - // no more data has been received yet. */ - opaque: Pointer; // **< A private pointer, passed to the read/write/seek/... - // functions. */ - // int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); - read_packet: function(opaque: Pointer; buf: pByte; buf_size: integer): integer; cdecl; - // int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); - write_packet: function(opaque: Pointer; buf: pByte; buf_size: integer): integer; cdecl; - // int64_t (*seek)(void *opaque, int64_t offset, int whence); - seek: function(opaque: Pointer; offset: int64_t; whence: integer): int64_t; cdecl; - pos: int64_t; // **< position in the file of the current buffer */ - must_flush: integer; // **< true if the next seek should flush */ - eof_reached: integer; // **< true if eof reached */ - write_flag: integer; // **< true if open for writing */ - max_packet_size: integer; - checksum: culong; - checksum_ptr: pByte; - // unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); - update_checksum: function(checksum: culong; const buf: pByte; size: Cardinal): Cardinal; cdecl; - error: integer; // **< contains the error code or 0 if no error happened */ - (* - * Pause or resume playback for network streaming protocols - e.g. MMS. - *) - // int (*read_pause)(void *opaque, int pause); - read_pause: function(opaque: Pointer; pause: cint): cint; cdecl; - (* - * Seek to a given timestamp in stream with the specified stream_index. - * Needed for some network streaming protocols which don't support seeking - * to byte position. - *) - // int64_t (*read_seek)(void *opaque, int stream_index, int64_t timestamp, int flags); - read_seek: function(opaque: Pointer; stream_index: cint; timestamp: cint64; flags: cint): cint64; cdecl; - (* - * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. - *) - seekable: integer; - (* - * max filesize, used to limit allocations - * This field is internal to libavformat and access from outside is not allowed. - *) - maxsize: int64_t; - (* - * avio_read and avio_write should if possible be satisfied directly - * instead of going through a buffer, and avio_seek will always - * call the underlying seek function directly. - *) - direct: integer; - (* - * Bytes read statistic - * This field is internal to libavformat and access from outside is not allowed. - *) - bytes_read: int64_t; - (* - * seek statistic - * This field is internal to libavformat and access from outside is not allowed. - *) - seek_count: integer; - (* - * writeout statistic - * This field is internal to libavformat and access from outside is not allowed. - *) - writeout_count: integer; - end; - - /// * unbuffered I/O */ - // - (* - // * Return AVIO_FLAG_* access flags corresponding to the access permissions - // * of the resource in url, or a negative value corresponding to an - // * AVERROR code in case of failure. The returned access flags are - // * masked by the value in flags. - // * - // * @note This function is intrinsically unsafe, in the sense that the - // * checked resource may change its existence or permission status from - // * one call to another. Thus you should not trust the returned value, - // * unless you are sure that no other processes are accessing the - // * checked resource. - *) - // int avio_check(const char *url, int flags); - // - (* - // * Allocate and initialize an AVIOContext for buffered I/O. It must be later - // * freed with av_free(). - // * - // * @param buffer Memory block for input/output operations via AVIOContext. - // * The buffer must be allocated with av_malloc() and friends. - // * @param buffer_size The buffer size is very important for performance. - // * For protocols with fixed blocksize it should be set to this blocksize. - // * For others a typical size is a cache page, e.g. 4kb. - // * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. - // * @param opaque An opaque pointer to user-specific data. - // * @param read_packet A function for refilling the buffer, may be NULL. - // * @param write_packet A function for writing the buffer contents, may be NULL. - // * The function may not change the input buffers content. - // * @param seek A function for seeking to specified byte position, may be NULL. - // * - // * @return Allocated AVIOContext or NULL on failure. - *) - // AVIOContext *avio_alloc_context( - // unsigned char *buffer, - // int buffer_size, - // int write_flag, - // void *opaque, - // int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - // int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), - // int64_t (*seek)(void *opaque, int64_t offset, int whence)); - // - // void avio_w8(AVIOContext *s, int b); - // void avio_write(AVIOContext *s, const unsigned char *buf, int size); - // void avio_wl64(AVIOContext *s, uint64_t val); - // void avio_wb64(AVIOContext *s, uint64_t val); - // void avio_wl32(AVIOContext *s, unsigned int val); - // void avio_wb32(AVIOContext *s, unsigned int val); - // void avio_wl24(AVIOContext *s, unsigned int val); - // void avio_wb24(AVIOContext *s, unsigned int val); - // void avio_wl16(AVIOContext *s, unsigned int val); - // void avio_wb16(AVIOContext *s, unsigned int val); - // - (* - // * Write a NULL-terminated string. - // * @return number of bytes written. - *) - // int avio_put_str(AVIOContext *s, const char *str); - // - (* - // * Convert an UTF-8 string to UTF-16LE and write it. - // * @return number of bytes written. - *) - // int avio_put_str16le(AVIOContext *s, const char *str); - // - (* - // * 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. - *) - // #define AVSEEK_SIZE 0x10000 - // - (* - // * 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 unreasonable - // * means that can be extremely slow. - // * This may be ignored by the seek code. - *) - // #define AVSEEK_FORCE 0x20000 - // - (* - // * fseek() equivalent for AVIOContext. - // * @return new position or AVERROR. - *) - // int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); - // - (* - // * Skip given number of bytes forward - // * @return new position or AVERROR. - *) - // int64_t avio_skip(AVIOContext *s, int64_t offset); - // - (* - // * ftell() equivalent for AVIOContext. - // * @return position or AVERROR. - *) - // static av_always_inline int64_t avio_tell(AVIOContext *s) - // { - // return avio_seek(s, 0, SEEK_CUR); - // } - // - (* - // * Get the filesize. - // * @return filesize or AVERROR - *) - // int64_t avio_size(AVIOContext *s); - // - (* - // * feof() equivalent for AVIOContext. - // * @return non zero if and only if end of file - *) - // int url_feof(AVIOContext *s); - // - (*@warning currently size is limited */ - // int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); - // - (* - // * Force flushing of buffered data to the output s. - // * - // * Force the buffered data to be immediately written to the output, - // * without to wait to fill the internal buffer. - *) - // void avio_flush(AVIOContext *s); - // - (* - // * Read size bytes from AVIOContext into buf. - // * @return number of bytes read or AVERROR - *) - // int avio_read(AVIOContext *s, unsigned char *buf, int size); - // - (* - // * @name Functions for reading from AVIOContext - // * @{ - // * - // * @note return 0 if EOF, so you cannot use it if EOF handling is - // * necessary - *) - // int avio_r8 (AVIOContext *s); - // unsigned int avio_rl16(AVIOContext *s); - // unsigned int avio_rl24(AVIOContext *s); - // unsigned int avio_rl32(AVIOContext *s); - // uint64_t avio_rl64(AVIOContext *s); - // unsigned int avio_rb16(AVIOContext *s); - // unsigned int avio_rb24(AVIOContext *s); - // unsigned int avio_rb32(AVIOContext *s); - // uint64_t avio_rb64(AVIOContext *s); - (* - // * @} - *) - // - (* - // * Read a string from pb into buf. The reading will terminate when either - // * a NULL character was encountered, maxlen bytes have been read, or nothing - // * more can be read from pb. The result is guaranteed to be NULL-terminated, it - // * will be truncated if buf is too small. - // * Note that the string is not interpreted or validated in any way, it - // * might get truncated in the middle of a sequence for multi-byte encodings. - // * - // * @return number of bytes read (is always <= maxlen). - // * If reading ends on EOF or error, the return value will be one more than - // * bytes actually read. - *) - // int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); - // - (* - // * Read a UTF-16 string from pb and convert it to UTF-8. - // * The reading will terminate when either a null or invalid character was - // * encountered or maxlen bytes have been read. - // * @return number of bytes read (is always <= maxlen) - *) - // int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); - // int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); - // - // - (* - // * @name URL open modes - // * The flags argument to avio_open must be one of the following - // * constants, optionally ORed with other flags. - // * @{ - *) -const - AVIO_FLAG_READ = 1; // read-only - AVIO_FLAG_WRITE = 2; // write-only - AVIO_FLAG_READ_WRITE = AVIO_FLAG_READ or AVIO_FLAG_WRITE; // read-write pseudo flag - - (* - // * @} - *) - // - (* - * Use non-blocking mode. - * If this flag is set, operations on the context will return - * AVERROR(EAGAIN) if they can not be performed immediately. - * If this flag is not set, operations on the context will never return - * AVERROR(EAGAIN). - * Note that this flag does not affect the opening/connecting of the - * context. Connecting a protocol will always block if necessary (e.g. on - * network protocols) but never hang (e.g. on busy devices). - * Warning: non-blocking protocols is work-in-progress; this flag may be - * silently ignored. - *) -const - AVIO_FLAG_NONBLOCK = 8; - - (* - * Use direct mode. - * avio_read and avio_write should if possible be satisfied directly - * instead of going through a buffer, and avio_seek will always - * call the underlying seek function directly. - *) - AVIO_FLAG_DIRECT = $8000; - - (* - // * Create and initialize a AVIOContext for accessing the - // * resource indicated by url. - // * @note When the resource indicated by url has been opened in - // * read+write mode, the AVIOContext can be used only for writing. - // * - // * @param s Used to return the pointer to the created AVIOContext. - // * In case of failure the pointed to value is set to NULL. - // * @param flags flags which control how the resource indicated by url - // * is to be opened - // * @return >= 0 in case of success, a negative value corresponding to an - // * AVERROR code in case of failure - *) - // int avio_open(AVIOContext **s, const char *url, int flags); -function avio_open(Var s: pAVIOContext; const url: pAnsiChar; flags: integer): integer; cdecl; - -(* - // * Create and initialize a AVIOContext for accessing the - // * resource indicated by url. - // * @note When the resource indicated by url has been opened in - // * read+write mode, the AVIOContext can be used only for writing. - // * - // * @param s Used to return the pointer to the created AVIOContext. - // * In case of failure the pointed to value is set to NULL. - // * @param flags flags which control how the resource indicated by url - // * is to be opened - // * @param int_cb an interrupt callback to be used at the protocols level - // * @param options A dictionary filled with protocol-private options. On return - // * this parameter will be destroyed and replaced with a dict containing options - // * that were not found. May be NULL. - // * @return >= 0 in case of success, a negative value corresponding to an - // * AVERROR code in case of failure -*) -// int avio_open2(AVIOContext **s, const char *url, int flags, -// const AVIOInterruptCB *int_cb, AVDictionary **options); -// -(* - // * Close the resource accessed by the AVIOContext s and free it. - // * This function can only be used if s was opened by avio_open(). - // * - // * The internal buffer is automatically flushed before closing the - // * resource. - // * - // * @return 0 on success, an AVERROR < 0 on error. - // * @see avio_closep -*) -// int avio_close(AVIOContext *s); -function avio_close(s: pAVIOContext): integer; -(* - // * Close the resource accessed by the AVIOContext *s, free it - // * and set the pointer pointing to it to NULL. - // * This function can only be used if s was opened by avio_open(). - // * - // * The internal buffer is automatically flushed before closing the - // * resource. - // * - // * @return 0 on success, an AVERROR < 0 on error. - // * @see avio_close -*) -// int avio_closep(AVIOContext **s); -// -// -(* - // * Open a write only memory stream. - // * - // * @param s new IO context - // * @return zero if no error. -*) -// int avio_open_dyn_buf(AVIOContext **s); -// -(* - // * Return the written size and a pointer to the buffer. The buffer - // * must be freed with av_free(). - // * Padding of FF_INPUT_BUFFER_PADDING_SIZE is added to the buffer. - // * - // * @param s IO context - // * @param pbuffer pointer to a byte buffer - // * @return the length of the byte buffer -*) -// int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); -// -(* - // * Iterate through names of available protocols. - // * - // * @param opaque A private pointer representing current protocol. - // * It must be a pointer to NULL on first iteration and will - // * be updated by successive calls to avio_enum_protocols. - // * @param output If set to 1, iterate over output protocols, - // * otherwise over input protocols. - // * - // * @return A static string containing the name of current protocol or NULL -*) -// const char *avio_enum_protocols(void **opaque, int output); -// -(* - // * Pause and resume playing - only meaningful if using a network streaming - // * protocol (e.g. MMS). - // * @param pause 1 for pause, 0 for resume -*) -// int avio_pause(AVIOContext *h, int pause); -// -(* - // * 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. - // * @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 if used and not supported. - // * @return >= 0 on success - // * @see AVInputFormat::read_seek -*) -// int64_t avio_seek_time(AVIOContext *h, int stream_index, -// int64_t timestamp, int flags); - -implementation - -uses ffm.lib; - -function avio_open; external avformat_dll; -function avio_close; external avformat_dll; - -end. diff --git a/source/ffmpeg/ffm.avutil.pas b/source/ffmpeg/ffm.avutil.pas deleted file mode 100644 index c7c6e12..0000000 --- a/source/ffmpeg/ffm.avutil.pas +++ /dev/null @@ -1,255 +0,0 @@ -unit ffm.avutil; - -{$i ffmpeg.inc} - -interface - -uses - ffm.rational, ffm.ctypes; - -(* - * copyright (c) 2006 Michael Niedermayer - * - * This file is part of ffm. - * - * 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 -*) - -(* - * @mainpage - * - * @section ffmpeg_intro Introduction - * - * This document describes the usage of the different libraries - * provided by ffm. - * - * @li @ref libavc "libavcodec" encoding/decoding library - * @li @ref lavfi "libavfilter" graph-based frame editing library - * @li @ref libavf "libavformat" I/O and muxing/demuxing library - * @li @ref lavd "libavdevice" special devices muxing/demuxing library - * @li @ref lavu "libavutil" common utility library - * @li @ref lswr "libswresample" audio resampling, format conversion and mixing - * @li @ref lpp "libpostproc" post processing library - * @li @ref lsws "libswscale" color conversion and scaling library - * - * @section ffmpeg_versioning Versioning and compatibility - * - * Each of the FFmpeg libraries contains a version.h header, which defines a - * major, minor and micro version number with the - * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version - * number is incremented with backward incompatible changes - e.g. removing - * parts of the public API, reordering public struct members, etc. The minor - * version number is incremented for backward compatible API changes or major - * new features - e.g. adding a new public function or a new decoder. The micro - * version number is incremented for smaller changes that a calling program - * might still want to check for - e.g. changing behavior in a previously - * unspecified situation. - * - * FFmpeg guarantees backward API and ABI compatibility for each library as long - * as its major version number is unchanged. This means that no public symbols - * will be removed or renamed. Types and names of the public struct members and - * values of public macros and enums will remain the same (unless they were - * explicitly declared as not part of the public API). Documented behavior will - * not change. - * - * In other words, any correct program that works with a given FFmpeg snapshot - * should work just as well without any changes with any later snapshot with the - * same major versions. This applies to both rebuilding the program against new - * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program - * links against. - * - * However, new public symbols may be added and new members may be appended to - * public structs whose size is not part of public ABI (most public structs in - * FFmpeg). New macros and enum values may be added. Behavior in undocumented - * situations may change slightly (and be documented). All those are accompanied - * by an entry in doc/APIchanges and incrementing either the minor or micro - * version number. -*) - -(* - * Return the LIBAVUTIL_VERSION_INT constant. -*) -// unsigned avutil_version(void); -// -(* - * Return the libavutil build-time configuration. -*) -// const char *avutil_configuration(void); -// -(* - * Return the libavutil license. -*) -// const char *avutil_license(void); -// -(* - * @addtogroup lavu_media Media Type - * @brief Media Type -*) -Type - TAVMediaType = ( // - AVMEDIA_TYPE_UNKNOWN = -1, - /// < Usually treated as AVMEDIA_TYPE_DATA - AVMEDIA_TYPE_VIDEO, // - AVMEDIA_TYPE_AUDIO, // - AVMEDIA_TYPE_DATA, // - /// < Opaque data information usually continuous - AVMEDIA_TYPE_SUBTITLE, // - AVMEDIA_TYPE_ATTACHMENT, // - /// < Opaque data information usually sparse - AVMEDIA_TYPE_NB); - - // - (* - * Return a string describing the media_type enum, NULL if media_type - * is unknown. - *) - // const char *av_get_media_type_string(enum AVMediaType media_type); - // - (* - * @defgroup lavu_const Constants - * @{ - * - * @defgroup lavu_enc Encoding specific - * - * @note those definition should move to avcodec - * @{ - *) -const - 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 - - (* - // * @} - // * @defgroup lavu_time Timestamp specific - // * - // * FFmpeg internal timebase and timestamp definitions - // * - // * @{ - *) - - (* - * @brief Undefined timestamp value - * - * Usually reported by demuxer that work on containers that do not provide - * either pts or dts. - *) - AV_NOPTS_VALUE = $8000000000000000; - - (* - * Internal time base represented as integer - *) - AV_TIME_BASE = 1000000; - - (* - * Internal time base represented as fractional value - *) - AV_TIME_BASE_Q: TAVRational = (num: 1; den: AV_TIME_BASE); - - // - (* - // * @} - // * @} - // * @defgroup lavu_picture Image related - // * - // * AVPicture types, pixel formats and basic image planes manipulation. - // * - // * @{ - *) -Type - pAVPictureType = ^TAVPictureType; - TAVPictureType = ( // - AV_PICTURE_TYPE_NONE = 0, - /// < Undefined - AV_PICTURE_TYPE_I, - /// < Intra - AV_PICTURE_TYPE_P, - /// < Predicted - AV_PICTURE_TYPE_B, - /// < Bi-dir predicted - AV_PICTURE_TYPE_S, - /// < S(GMC)-VOP MPEG4 - AV_PICTURE_TYPE_SI, - /// < Switching Intra - AV_PICTURE_TYPE_SP, - /// < Switching Predicted - AV_PICTURE_TYPE_BI - /// < BI type - ); - (* - * 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, '?' if pict_type is unknown - *) - // char av_get_picture_type_char(enum AVPictureType pict_type); - - // #include "common.h" - // #include "error.h" - // #include "version.h" - // #include "mathematics.h" - // #include "rational.h" - // #include "intfloat_readwrite.h" - // #include "log.h" - // #include "pixfmt.h" - // - (* - // * Return x default pointer in case p is NULL. - *) - // static inline void *av_x_if_null(const void *p, const void *x) - // { - // return (void *)(intptr_t)(p ? p : x); - // } - // - (* - * Compute the length of an integer list. - * - * @param elsize size in bytes of each list element (only 1, 2, 4 or 8) - * @param term list terminator (usually 0 or -1) - * @param list pointer to the list - * @return length of the list, in elements, not counting the terminator - *) - // unsigned av_int_list_length_for_size(unsigned elsize, - // const void *list, uint64_t term) av_pure; -function av_int_list_length_for_size(elsize: Cardinal; const list: Pointer; term: uint64_t): Cardinal; cdecl; -(* - // * Compute the length of an integer list. - // * - // * @param term list terminator (usually 0 or -1) - // * @param list pointer to the list - // * @return length of the list, in elements, not counting the terminator -*) -// #define av_int_list_length(list, term) \ -// av_int_list_length_for_size(sizeof(*(list)), list, term) -// -(* - // * Open a file using a UTF-8 filename. - // * The API of this function matches POSIX fopen(), errors are returned through - // * errno. -*) -// FILE *av_fopen_utf8(const char *path, const char *mode); - -implementation - -uses ffm.lib; - -function av_int_list_length_for_size; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.buffer.pas b/source/ffmpeg/ffm.buffer.pas deleted file mode 100644 index 7e6f33b..0000000 --- a/source/ffmpeg/ffm.buffer.pas +++ /dev/null @@ -1,285 +0,0 @@ -unit ffm.buffer; - -{$i ffmpeg.inc} - -interface - -/// * -// * This file is part of ffm. -// * -// * 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 -// */ -// -/// ** -// * @file -// * @ingroup lavu_buffer -// * refcounted data buffer API -// */ -// -// #ifndef AVUTIL_BUFFER_H -// #define AVUTIL_BUFFER_H -// -// #include -// -/// ** -// * @defgroup lavu_buffer AVBuffer -// * @ingroup lavu_data -// * -// * @{ -// * AVBuffer is an API for reference-counted data buffers. -// * -// * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer -// * represents the data buffer itself; it is opaque and not meant to be accessed -// * by the caller directly, but only through AVBufferRef. However, the caller may -// * e.g. compare two AVBuffer pointers to check whether two different references -// * are describing the same data buffer. AVBufferRef represents a single -// * reference to an AVBuffer and it is the object that may be manipulated by the -// * caller directly. -// * -// * There are two functions provided for creating a new AVBuffer with a single -// * reference -- av_buffer_alloc() to just allocate a new buffer, and -// * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing -// * reference, additional references may be created with av_buffer_ref(). -// * Use av_buffer_unref() to free a reference (this will automatically free the -// * data once all the references are freed). -// * -// * The convention throughout this API and the rest of FFmpeg is such that the -// * buffer is considered writable if there exists only one reference to it (and -// * it has not been marked as read-only). The av_buffer_is_writable() function is -// * provided to check whether this is true and av_buffer_make_writable() will -// * automatically create a new writable buffer when necessary. -// * Of course nothing prevents the calling code from violating this convention, -// * however that is safe only when all the existing references are under its -// * control. -// * -// * @note Referencing and unreferencing the buffers is thread-safe and thus -// * may be done from multiple threads simultaneously without any need for -// * additional locking. -// * -// * @note Two different references to the same buffer can point to different -// * parts of the buffer (i.e. their AVBufferRef.data will not be equal). -// */ -// -/// ** -// * A reference counted buffer type. It is opaque and is meant to be used through -// * references (AVBufferRef). -// */ -Type - pAVBuffer = Pointer; - - (* - * A reference to a data buffer. - * - * The size of this struct is not a part of the public ABI and it is not meant - * to be allocated directly. - *) - pAVBufferRef = ^TAVBufferRef; - ppAVBufferRef = ^pAVBufferRef; - - TAVBufferRef = {packed} record - buffer: pAVBuffer; - (* - * The data buffer. It is considered writable if and only if - * this is the only reference to the buffer, in which case - * av_buffer_is_writable() returns 1. - *) - data: pByte; - (* - * Size of data in bytes. - *) - size: Integer; - end; - - /// ** - // * Allocate an AVBuffer of the given size using av_malloc(). - // * - // * @return an AVBufferRef of given size or NULL when out of memory - // */ - // AVBufferRef *av_buffer_alloc(int size); - // - /// ** - // * Same as av_buffer_alloc(), except the returned buffer will be initialized - // * to zero. - // */ - // AVBufferRef *av_buffer_allocz(int size); - // - /// ** - // * Always treat the buffer as read-only, even when it has only one - // * reference. - // */ - // #define AV_BUFFER_FLAG_READONLY (1 << 0) - // - /// ** - // * Create an AVBuffer from an existing array. - // * - // * If this function is successful, data is owned by the AVBuffer. The caller may - // * only access data through the returned AVBufferRef and references derived from - // * it. - // * If this function fails, data is left untouched. - // * @param data data array - // * @param size size of data in bytes - // * @param free a callback for freeing this buffer's data - // * @param opaque parameter to be got for processing or passed to free - // * @param flags a combination of AV_BUFFER_FLAG_* - // * - // * @return an AVBufferRef referring to data on success, NULL on failure. - // */ - // AVBufferRef *av_buffer_create(uint8_t *data, int size, - // void (*free)(void *opaque, uint8_t *data), - // void *opaque, int flags); - // - /// ** - // * Default free callback, which calls av_free() on the buffer data. - // * This function is meant to be passed to av_buffer_create(), not called - // * directly. - // */ - // void av_buffer_default_free(void *opaque, uint8_t *data); - // - /// ** - // * Create a new reference to an AVBuffer. - // * - // * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on - // * failure. - // */ - // AVBufferRef *av_buffer_ref(AVBufferRef *buf); - // - /// ** - // * Free a given reference and automatically free the buffer if there are no more - // * references to it. - // * - // * @param buf the reference to be freed. The pointer is set to NULL on return. - // */ - // void av_buffer_unref(AVBufferRef **buf); - // - /// ** - // * @return 1 if the caller may write to the data referred to by buf (which is - // * true if and only if buf is the only reference to the underlying AVBuffer). - // * Return 0 otherwise. - // * A positive answer is valid until av_buffer_ref() is called on buf. - // */ - // int av_buffer_is_writable(const AVBufferRef *buf); - // - /// ** - // * @return the opaque parameter set by av_buffer_create. - // */ - // void *av_buffer_get_opaque(const AVBufferRef *buf); - // - // int av_buffer_get_ref_count(const AVBufferRef *buf); - // - /// ** - // * Create a writable reference from a given buffer reference, avoiding data copy - // * if possible. - // * - // * @param buf buffer reference to make writable. On success, buf is either left - // * untouched, or it is unreferenced and a new writable AVBufferRef is - // * written in its place. On failure, buf is left untouched. - // * @return 0 on success, a negative AVERROR on failure. - // */ - // int av_buffer_make_writable(AVBufferRef **buf); - // - /// ** - // * Reallocate a given buffer. - // * - // * @param buf a buffer reference to reallocate. On success, buf will be - // * unreferenced and a new reference with the required size will be - // * written in its place. On failure buf will be left untouched. *buf - // * may be NULL, then a new buffer is allocated. - // * @param size required new buffer size. - // * @return 0 on success, a negative AVERROR on failure. - // * - // * @note the buffer is actually reallocated with av_realloc() only if it was - // * initially allocated through av_buffer_realloc(NULL) and there is only one - // * reference to it (i.e. the one passed to this function). In all other cases - // * a new buffer is allocated and the data is copied. - // */ - // int av_buffer_realloc(AVBufferRef **buf, int size); - // - /// ** - // * @} - // */ - // - /// ** - // * @defgroup lavu_bufferpool AVBufferPool - // * @ingroup lavu_data - // * - // * @{ - // * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. - // * - // * Frequently allocating and freeing large buffers may be slow. AVBufferPool is - // * meant to solve this in cases when the caller needs a set of buffers of the - // * same size (the most obvious use case being buffers for raw video or audio - // * frames). - // * - // * At the beginning, the user must call av_buffer_pool_init() to create the - // * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to - // * get a reference to a new buffer, similar to av_buffer_alloc(). This new - // * reference works in all aspects the same way as the one created by - // * av_buffer_alloc(). However, when the last reference to this buffer is - // * unreferenced, it is returned to the pool instead of being freed and will be - // * reused for subsequent av_buffer_pool_get() calls. - // * - // * When the caller is done with the pool and no longer needs to allocate any new - // * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. - // * Once all the buffers are released, it will automatically be freed. - // * - // * Allocating and releasing buffers with this API is thread-safe as long as - // * either the default alloc callback is used, or the user-supplied one is - // * thread-safe. - // */ - // - /// ** - // * The buffer pool. This structure is opaque and not meant to be accessed - // * directly. It is allocated with av_buffer_pool_init() and freed with - // * av_buffer_pool_uninit(). - // */ - // typedef struct AVBufferPool AVBufferPool; - // - /// ** - // * Allocate and initialize a buffer pool. - // * - // * @param size size of each buffer in this pool - // * @param alloc a function that will be used to allocate new buffers when the - // * pool is empty. May be NULL, then the default allocator will be used - // * (av_buffer_alloc()). - // * @return newly created buffer pool on success, NULL on error. - // */ - // AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); - // - /// ** - // * Mark the pool as being available for freeing. It will actually be freed only - // * once all the allocated buffers associated with the pool are released. Thus it - // * is safe to call this function while some of the allocated buffers are still - // * in use. - // * - // * @param pool pointer to the pool to be freed. It will be set to NULL. - // * @see av_buffer_pool_can_uninit() - // */ - // void av_buffer_pool_uninit(AVBufferPool **pool); - // - /// ** - // * Allocate a new AVBuffer, reusing an old buffer from the pool when available. - // * This function may be called simultaneously from multiple threads. - // * - // * @return a reference to the new buffer on success, NULL on error. - // */ - // AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); - // - /// ** - // * @} - // */ - -implementation - -end. diff --git a/source/ffmpeg/ffm.buffersink.pas b/source/ffmpeg/ffm.buffersink.pas deleted file mode 100644 index c6d0785..0000000 --- a/source/ffmpeg/ffm.buffersink.pas +++ /dev/null @@ -1,199 +0,0 @@ -(* - * This file is part of ffm. - * - * 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 -*) -unit ffm.buffersink; - -{$i ffmpeg.inc} - -interface - -uses - ffm.pixfmt, ffm.avfilter, ffm.frame; - -// #if FF_API_AVFILTERBUFFER -// (* -// * Get an audio/video buffer data from buffer_sink and put it in bufref. -// * -// * This function works with both audio and video buffer sinks. -// * -// * @param buffer_sink pointer to a buffersink or abuffersink context -// * @param flags a combination of AV_BUFFERSINK_FLAG_* flags -// * @return >= 0 in case of success, a negative AVERROR code in case of -// * failure -// *) -// attribute_deprecated -// int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, -// AVFilterBufferRef **bufref, int flags); -// -// (* -// * Get the number of immediately available frames. -// *) -// attribute_deprecated -// int av_buffersink_poll_frame(AVFilterContext *ctx); -// -// (* -// * Get a buffer with filtered data from sink and put it in buf. -// * -// * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. -// * @param buf pointer to the buffer will be written here if buf is non-NULL. buf -// * must be freed by the caller using avfilter_unref_buffer(). -// * Buf may also be NULL to query whether a buffer is ready to be -// * output. -// * -// * @return >= 0 in case of success, a negative AVERROR code in case of -// * failure. -// *) -// attribute_deprecated -// int av_buffersink_read(AVFilterContext *ctx, AVFilterBufferRef **buf); -// -// (* -// * Same as av_buffersink_read, but with the ability to specify the number of -// * samples read. This function is less efficient than av_buffersink_read(), -// * because it copies the data around. -// * -// * @param ctx pointer to a context of the abuffersink AVFilter. -// * @param buf pointer to the buffer will be written here if buf is non-NULL. buf -// * must be freed by the caller using avfilter_unref_buffer(). buf -// * will contain exactly nb_samples audio samples, except at the end -// * of stream, when it can contain less than nb_samples. -// * Buf may also be NULL to query whether a buffer is ready to be -// * output. -// * -// * @warning do not mix this function with av_buffersink_read(). Use only one or -// * the other with a single sink, not both. -// *) -// attribute_deprecated -// int av_buffersink_read_samples(AVFilterContext *ctx, AVFilterBufferRef **buf, -// int nb_samples); -// #endif -// -// (* -// * Get a frame with filtered data from sink and put it in frame. -// * -// * @param ctx pointer to a buffersink or abuffersink filter context. -// * @param frame pointer to an allocated frame that will be filled with data. -// * The data must be freed using av_frame_unref() / av_frame_free() -// * @param flags a combination of AV_BUFFERSINK_FLAG_* flags -// * -// * @return >= 0 in for success, a negative AVERROR code for failure. -// *) -// int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); -function av_buffersink_get_frame_flags(ctx: pAVFilterContext; frame: pAVFrame; flags: Integer): Integer; cdecl; - -// -// (* -// * Tell av_buffersink_get_buffer_ref() to read video/samples buffer -// * reference, but not remove it from the buffer. This is useful if you -// * need only to read a video/samples buffer, without to fetch it. -// *) -// #define AV_BUFFERSINK_FLAG_PEEK 1 -// -// (* -// * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. -// * If a frame is already buffered, it is read (and removed from the buffer), -// * but if no frame is present, return AVERROR(EAGAIN). -// *) -// #define AV_BUFFERSINK_FLAG_NO_REQUEST 2 -Type - (* - * Struct to use for initializing a buffersink context. - *) - pAVBufferSinkParams = ^TAVBufferSinkParams; - - TAVBufferSinkParams = {packed} record - pixel_fmts: pAVPixelFormat; - /// < list of allowed pixel formats, terminated by AV_PIX_FMT_NONE - end; - - (* - * Create an AVBufferSinkParams structure. - * - * Must be freed with av_free(). - *) - // AVBufferSinkParams *av_buffersink_params_alloc(void); -function av_buffersink_params_alloc(): pAVBufferSinkParams; cdecl; - -// (* -// * Struct to use for initializing an abuffersink context. -// *) -// typedef struct { -// const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE -// const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 -// const int *channel_counts; ///< list of allowed channel counts, terminated by -1 -// int all_channel_counts; ///< if not 0, accept any channel count or layout -// int *sample_rates; ///< list of allowed sample rates, terminated by -1 -// } AVABufferSinkParams; -// -// (* -// * Create an AVABufferSinkParams structure. -// * -// * Must be freed with av_free(). -// *) -// AVABufferSinkParams *av_abuffersink_params_alloc(void); -// -// (* -// * Set the frame size for an audio buffer sink. -// * -// * All calls to av_buffersink_get_buffer_ref will return a buffer with -// * exactly the specified number of samples, or AVERROR(EAGAIN) if there is -// * not enough. The last buffer at EOF will be padded with 0. -// *) -// void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); -// -// (* -// * Get the frame rate of the input. -// *) -// AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx); -// -// (* -// * Get a frame with filtered data from sink and put it in frame. -// * -// * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. -// * @param frame pointer to an allocated frame that will be filled with data. -// * The data must be freed using av_frame_unref() / av_frame_free() -// * -// * @return >= 0 in case of success, a negative AVERROR code in case of -// * failure. -// *) -// int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); -function av_buffersink_get_frame(ctx:pAVFilterContext; frame:pAVFrame):integer;cdecl; -// -// (* -// * Same as av_buffersink_get_frame(), but with the ability to specify the number -// * of samples read. This function is less efficient than -// * av_buffersink_get_frame(), because it copies the data around. -// * -// * @param ctx pointer to a context of the abuffersink AVFilter. -// * @param frame pointer to an allocated frame that will be filled with data. -// * The data must be freed using av_frame_unref() / av_frame_free() -// * frame will contain exactly nb_samples audio samples, except at -// * the end of stream, when it can contain less than nb_samples. -// * -// * @warning do not mix this function with av_buffersink_get_frame(). Use only one or -// * the other with a single sink, not both. -// *) -// int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); - -implementation - -uses ffm.lib; - -function av_buffersink_params_alloc; external avfilter_dll; -function av_buffersink_get_frame_flags; external avfilter_dll; -function av_buffersink_get_frame; external avfilter_dll; - -end. diff --git a/source/ffmpeg/ffm.buffersrc.pas b/source/ffmpeg/ffm.buffersrc.pas deleted file mode 100644 index 5b2787b..0000000 --- a/source/ffmpeg/ffm.buffersrc.pas +++ /dev/null @@ -1,148 +0,0 @@ -(* - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.buffersrc; - -{$i ffmpeg.inc} - -interface - -uses - ffm.frame, ffm.avfilter; - -const - (* - * Do not check for format changes. - *) - AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1; - -{$IFDEF FF_API_AVFILTERBUFFER} - (* - * Ignored - *) - AV_BUFFERSRC_FLAG_NO_COPY = 2; -{$ENDIF} - (* - * Immediately push the frame to the output. - *) - AV_BUFFERSRC_FLAG_PUSH = 4; - - (* - * Keep a reference to the frame. - * If the frame if reference-counted, create a new reference; otherwise - * copy the frame data. - *) - AV_BUFFERSRC_FLAG_KEEP_REF = 8; - - (* - * Add buffer data in picref to buffer_src. - * - * @param buffer_src pointer to a buffer source context - * @param picref a buffer reference, or NULL to mark EOF - * @param flags a combination of AV_BUFFERSRC_FLAG_* - * @return >= 0 in case of success, a negative AVERROR code - * in case of failure - *) - // int av_buffersrc_add_ref(AVFilterContext *buffer_src, - // AVFilterBufferRef *picref, int flags); - - (* - * Get the number of failed requests. - * - * A failed request is when the request_frame method is called while no - * frame is present in the buffer. - * The number is reset when a frame is added. - *) - // unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); - - // #if FF_API_AVFILTERBUFFER - (* - * Add a buffer to the filtergraph s. - * - * @param buf buffer containing frame data to be passed down the filtergraph. - * This function will take ownership of buf, the user must not free it. - * A NULL buf signals EOF -- i.e. no more frames will be sent to this filter. - * - * @deprecated use av_buffersrc_write_frame() or av_buffersrc_add_frame() - *) - // attribute_deprecated - // int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf); - // #endif - - (* - * Add a frame to the buffer source. - * - * @param s an instance of the buffersrc filter. - * @param frame frame to be added. If the frame is reference counted, this - * function will make a new reference to it. Otherwise the frame data will be - * copied. - * - * @return 0 on success, a negative AVERROR on error - * - * This function is equivalent to av_buffersrc_add_frame_flags() with the - * AV_BUFFERSRC_FLAG_KEEP_REF flag. - *) - // int av_buffersrc_write_frame(AVFilterContext *s, const AVFrame *frame); - - (* - * Add a frame to the buffer source. - * - * @param s an instance of the buffersrc filter. - * @param frame frame to be added. If the frame is reference counted, this - * function will take ownership of the reference(s) and reset the frame. - * Otherwise the frame data will be copied. If this function returns an error, - * the input frame is not touched. - * - * @return 0 on success, a negative AVERROR on error. - * - * @note the difference between this function and av_buffersrc_write_frame() is - * that av_buffersrc_write_frame() creates a new reference to the input frame, - * while this function takes ownership of the reference passed to it. - * - * This function is equivalent to av_buffersrc_add_frame_flags() without the - * AV_BUFFERSRC_FLAG_KEEP_REF flag. - *) - // int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); - - (* - * Add a frame to the buffer source. - * - * By default, if the frame is reference-counted, this function will take - * ownership of the reference(s) and reset the frame. This can be controled - * using the flags. - * - * If this function returns an error, the input frame is not touched. - * - * @param buffer_src pointer to a buffer source context - * @param frame a frame, or NULL to mark EOF - * @param flags a combination of AV_BUFFERSRC_FLAG_* - * @return >= 0 in case of success, a negative AVERROR code - * in case of failure - *) - // int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, - // AVFrame *frame, int flags); -function av_buffersrc_add_frame_flags(buffer_src: pAVFilterContext; frame: pAVFrame; flags: Integer): Integer; cdecl; - -implementation - -uses ffm.lib; - -function av_buffersrc_add_frame_flags; external avfilter_dll; - -end. diff --git a/source/ffmpeg/ffm.channel_layout.pas b/source/ffmpeg/ffm.channel_layout.pas deleted file mode 100644 index 45fa8a3..0000000 --- a/source/ffmpeg/ffm.channel_layout.pas +++ /dev/null @@ -1,234 +0,0 @@ -(* - * Copyright (c) 2006 Michael Niedermayer - * Copyright (c) 2008 Peter Ross - * - * 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 -*) - -unit ffm.channel_layout; - -{$i ffmpeg.inc} - -interface - -Uses - ffm.ctypes; - -(* * - * @file - * audio channel layout utility functions -*) - -(* * - * @addtogroup lavu_audio - * @{ -*) - -(* * - * @defgroup channel_masks Audio channel masks - * - * A channel layout is a 64-bits integer with a bit set for every channel. - * The number of bits set must be equal to the number of channels. - * The value 0 means that the channel layout is not known. - * @note this data structure is not powerful enough to handle channels - * combinations that have the same channel multiple times, such as - * dual-mono. - * - * @{ -*) -Const - AV_CH_FRONT_LEFT = $00000001; - AV_CH_FRONT_RIGHT = $00000002; - AV_CH_FRONT_CENTER = $00000004; - AV_CH_LOW_FREQUENCY = $00000008; - AV_CH_BACK_LEFT = $00000010; - AV_CH_BACK_RIGHT = $00000020; - AV_CH_FRONT_LEFT_OF_CENTER = $00000040; - AV_CH_FRONT_RIGHT_OF_CENTER = $00000080; - AV_CH_BACK_CENTER = $00000100; - AV_CH_SIDE_LEFT = $00000200; - AV_CH_SIDE_RIGHT = $00000400; - AV_CH_TOP_CENTER = $00000800; - AV_CH_TOP_FRONT_LEFT = $00001000; - AV_CH_TOP_FRONT_CENTER = $00002000; - AV_CH_TOP_FRONT_RIGHT = $00004000; - AV_CH_TOP_BACK_LEFT = $00008000; - AV_CH_TOP_BACK_CENTER = $00010000; - AV_CH_TOP_BACK_RIGHT = $00020000; - AV_CH_STEREO_LEFT = $20000000; - /// < Stereo downmix. - AV_CH_STEREO_RIGHT = $40000000; - /// < See AV_CH_STEREO_LEFT. - AV_CH_WIDE_LEFT = $0000000080000000; - AV_CH_WIDE_RIGHT = $0000000100000000; - AV_CH_SURROUND_DIRECT_LEFT = $0000000200000000; - AV_CH_SURROUND_DIRECT_RIGHT = $0000000400000000; - AV_CH_LOW_FREQUENCY_2 = $0000000800000000; - - (* * 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. *) - AV_CH_LAYOUT_NATIVE = $8000000000000000; - - (* * - * @} - * @defgroup channel_mask_c Audio channel convenience macros - * @{ - * *) - AV_CH_LAYOUT_MONO = (AV_CH_FRONT_CENTER); - AV_CH_LAYOUT_STEREO = (AV_CH_FRONT_LEFT or AV_CH_FRONT_RIGHT); - AV_CH_LAYOUT_2POINT1 = (AV_CH_LAYOUT_STEREO or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_2_1 = (AV_CH_LAYOUT_STEREO or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_SURROUND = (AV_CH_LAYOUT_STEREO or AV_CH_FRONT_CENTER); - AV_CH_LAYOUT_3POINT1 = (AV_CH_LAYOUT_SURROUND or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_4POINT0 = (AV_CH_LAYOUT_SURROUND or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_4POINT1 = (AV_CH_LAYOUT_4POINT0 or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_2_2 = (AV_CH_LAYOUT_STEREO or AV_CH_SIDE_LEFT or AV_CH_SIDE_RIGHT); - AV_CH_LAYOUT_QUAD = (AV_CH_LAYOUT_STEREO or AV_CH_BACK_LEFT or AV_CH_BACK_RIGHT); - AV_CH_LAYOUT_5POINT0 = (AV_CH_LAYOUT_SURROUND or AV_CH_SIDE_LEFT or AV_CH_SIDE_RIGHT); - AV_CH_LAYOUT_5POINT1 = (AV_CH_LAYOUT_5POINT0 or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_5POINT0_BACK = (AV_CH_LAYOUT_SURROUND or AV_CH_BACK_LEFT or AV_CH_BACK_RIGHT); - AV_CH_LAYOUT_5POINT1_BACK = (AV_CH_LAYOUT_5POINT0_BACK or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_6POINT0 = (AV_CH_LAYOUT_5POINT0 or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_6POINT0_FRONT = (AV_CH_LAYOUT_2_2 or AV_CH_FRONT_LEFT_OF_CENTER or AV_CH_FRONT_RIGHT_OF_CENTER); - AV_CH_LAYOUT_HEXAGONAL = (AV_CH_LAYOUT_5POINT0_BACK or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_6POINT1 = (AV_CH_LAYOUT_5POINT1 or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_6POINT1_BACK = (AV_CH_LAYOUT_5POINT1_BACK or AV_CH_BACK_CENTER); - AV_CH_LAYOUT_6POINT1_FRONT = (AV_CH_LAYOUT_6POINT0_FRONT or AV_CH_LOW_FREQUENCY); - AV_CH_LAYOUT_7POINT0 = (AV_CH_LAYOUT_5POINT0 or AV_CH_BACK_LEFT or AV_CH_BACK_RIGHT); - AV_CH_LAYOUT_7POINT0_FRONT = (AV_CH_LAYOUT_5POINT0 or AV_CH_FRONT_LEFT_OF_CENTER or AV_CH_FRONT_RIGHT_OF_CENTER); - AV_CH_LAYOUT_7POINT1 = (AV_CH_LAYOUT_5POINT1 or AV_CH_BACK_LEFT or AV_CH_BACK_RIGHT); - AV_CH_LAYOUT_7POINT1_WIDE = (AV_CH_LAYOUT_5POINT1 or AV_CH_FRONT_LEFT_OF_CENTER or AV_CH_FRONT_RIGHT_OF_CENTER); - AV_CH_LAYOUT_7POINT1_WIDE_BACK = (AV_CH_LAYOUT_5POINT1_BACK or AV_CH_FRONT_LEFT_OF_CENTER or - AV_CH_FRONT_RIGHT_OF_CENTER); - AV_CH_LAYOUT_OCTAGONAL = (AV_CH_LAYOUT_5POINT0 or AV_CH_BACK_LEFT or AV_CH_BACK_CENTER or AV_CH_BACK_RIGHT); - AV_CH_LAYOUT_STEREO_DOWNMIX = (AV_CH_STEREO_LEFT or AV_CH_STEREO_RIGHT); - -Type - TAVMatrixEncoding = ( // - AV_MATRIX_ENCODING_NONE, // - AV_MATRIX_ENCODING_DOLBY, // - AV_MATRIX_ENCODING_DPLII, // - AV_MATRIX_ENCODING_DPLIIX, // - AV_MATRIX_ENCODING_DPLIIZ, // - AV_MATRIX_ENCODING_DOLBYEX, // - AV_MATRIX_ENCODING_DOLBYHEADPHONE, // - AV_MATRIX_ENCODING_NB); - - (* * - * @} - *) - - (* * - * Return a channel layout id that matches name, or 0 if no match is found. - * - * name can be one or several of the following notations, - * separated by '+' or ' or ': - * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, - * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); - * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, - * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); - * - a number of channels, in decimal, optionally followed by 'c', yielding - * the default channel layout for that number of channels (@see - * av_get_default_channel_layout); - * - a channel layout mask, in hexadecimal starting with "$" (see the - * AV_CH_* macros). - * - * @warning Starting from the next major bump the trailing character - * 'c' to specify a number of channels will be required, while a - * channel layout mask could also be specified as a decimal number - * (if and only if not followed by "c"). - * - * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "$7" - *) - // uint64_t av_get_channel_layout(const char *name); - - (* * - * Return a description of a channel layout. - * If nb_channels is <= 0, it is guessed from the channel_layout. - * - * @param buf put here the string containing the channel layout - * @param buf_size size in bytes of the buffer - *) - // void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); - - // struct AVBPrint; - (* * - * Append a description of a channel layout to a bprint buffer. - *) - // void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); - - (* * - * Return the number of channels in the channel layout. - *) - // int av_get_channel_layout_nb_channels(uint64_t channel_layout); -function av_get_channel_layout_nb_channels(channel_layout: uint64_t): Integer; cdecl; - -(* * - * Return default channel layout for a given number of channels. -*) -// int64_t av_get_default_channel_layout(int nb_channels); - -(* * - * Get the index of a channel in channel_layout. - * - * @param channel a channel layout describing exactly one channel which must be - * present in channel_layout. - * - * @return index of channel in channel_layout on success, a negative AVERROR - * on error. -*) -// int av_get_channel_layout_channel_index(uint64_t channel_layout,uint64_t channel); - -(* * - * Get the channel with the given index in channel_layout. -*) -// uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); - -(* * - * Get the name of a given channel. - * - * @return channel name on success, NULL on error. -*) -// const char *av_get_channel_name(uint64_t channel); - -(* * - * Get the description of a given channel. - * - * @param channel a channel layout with a single channel - * @return channel description on success, NULL on error -*) -// const char *av_get_channel_description(uint64_t channel); - -(* * - * Get the value and name of a standard channel layout. - * - * @param[in] index index in an internal list, starting at 0 - * @param[out] layout channel layout mask - * @param[out] name name of the layout - * @return 0 if the layout exists, - * <0 if index is beyond the limits -*) -// int av_get_standard_channel_layout(unsigned index, uint64_t *layout, const char **name); - -implementation - -uses ffm.lib; - -function av_get_channel_layout_nb_channels; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.cls.videoencoder.pas b/source/ffmpeg/ffm.cls.videoencoder.pas deleted file mode 100644 index 1f14a8b..0000000 --- a/source/ffmpeg/ffm.cls.videoencoder.pas +++ /dev/null @@ -1,687 +0,0 @@ -unit ffm.cls.videoencoder; - -{$I OpenCV.inc} -{$POINTERMATH ON} - -interface - -Uses - ffm.libavcodec.avcodec, - ffm.pixfmt, - ffm.avformat, - ffm.swscale, - ffm.avio, - ffm.frame; - -Type - TFFMVideoEncoder = class - private const - MAX_AUDIO_PACKET_SIZE = (128 * 1024); - private - // output file name - outputFilename: AnsiString; - // output format. - pOutFormat: pAVOutputFormat; - // format context - pFormatContext: pAVFormatContext; - // video stream context - pVideoStream: pAVStream; - // audio streams context - pAudioStream: pAVStream; - // convert context context - pImgConvertCtx: pSwsContext; - // encode buffer and size - pVideoEncodeBuffer: pByte; - nSizeVideoEncodeBuffer: Integer; - // audio buffer and size - pAudioEncodeBuffer: pByte; - nSizeAudioEncodeBuffer: Integer; - // count of sample - audioInputSampleSize: Integer; - // current picture - pCurrentPicture: pAVFrame; - - // audio buffer. Save rest samples in audioBuffer from previous audio frame. - audioBuffer: pByte; - nAudioBufferSize: Integer; - nAudioBufferSizeCurrent: Integer; - W_VIDEO: Integer; - H_VIDEO: Integer; - fbit_rate: Integer; - ftime_base_den: Integer; - function flush_encoder: Integer; - protected - // Add video stream - function AddVideoStream(const pContext: pAVFormatContext; const codec_id: TAVCodecID): pAVStream; - // Open Video Stream - function OpenVideo(const oc: pAVFormatContext; const pStream: pAVStream): boolean; - // Allocate memory - function CreateFFmpegPicture(const pix_fmt: TAVPixelFormat; const nWidth, nHeight: Integer): pAVFrame; - // Close video stream - procedure CloseVideo(const pContext: pAVFormatContext; const pStream: pAVStream); - // Add audio stream - function AddAudioStream(const pContext: pAVFormatContext; const codec_id: TAVCodecID): pAVStream; - // Open audio stream - function OpenAudio(const pContext: pAVFormatContext; const pStream: pAVStream): boolean; - // close audio stream - procedure CloseAudio(const pContext: pAVFormatContext; const pStream: pAVStream); - // Add video frame - function AddVideoFrame(const pOutputFrame: pAVFrame; const pVideoCodec: pAVCodecContext): boolean; - // Add audio samples - function AddAudioSample(const pFormatContext: pAVFormatContext; const pStream: pAVStream; const soundBuffer: pByte; - const soundBufferSize: Integer): boolean; - // Free resourses. - procedure Free; - function NeedConvert(const framepixfmt: TAVPixelFormat): boolean; - public - constructor Create; - destructor Destroy; override; - // init output file - function InitFile(const inputFile: AnsiString; const container: AnsiString; const AW_VIDEO: Integer = 320; - const AH_VIDEO: Integer = 200): boolean; - // Set video params - procedure SetVideoParams(const atime_base_den: Integer = 25; const abit_rate: Integer = 2000000); - // Add video and audio data - function AddFrame(const frame: pAVFrame; const soundBuffer: pByte; const soundBufferSize: Integer; - const framepixfmt: TAVPixelFormat = AV_PIX_FMT_RGB24): boolean; - // end of output - function Finish: boolean; - end; - -implementation - -Uses -{$IFDEF MSWINDOWS} - Winapi.Windows, -{$ENDIF MSWINDOWS} - System.SysUtils, - System.AnsiStrings, - System.Math, - ffm.mem, - ffm.avutil, - ffm.samplefmt, - ffm.mathematics; - -{ TNVRVideoEncoder } - -function TFFMVideoEncoder.AddAudioSample(const pFormatContext: pAVFormatContext; const pStream: pAVStream; const soundBuffer: pByte; - const soundBufferSize: Integer): boolean; -Var - pCodecCxt: pAVCodecContext; - packSizeInSize: Integer; // DWORD; - nCountSamples: Integer; - nCurrentSize: Integer; - // nWriteSamples: Integer; - pSoundBuffer: pByte; - pAudioFrame: pAVFrame; - // nBufferShift: Integer; - nCurrentBufferSize: Integer; - pkt: TAVPacket; - nOutputSize, error: Integer; -begin - - // pCodecCxt := nil; - Result := true; - - pCodecCxt := pStream^.codec; - - // Size of packet on bytes. - // FORMAT s16 - packSizeInSize := soundBufferSize; - - nCountSamples := soundBufferSize div av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); - - // Add current audio frame to previos. - CopyMemory(@audioBuffer[nAudioBufferSizeCurrent], soundBuffer, soundBufferSize); - nAudioBufferSizeCurrent := nAudioBufferSizeCurrent + soundBufferSize; - - nCurrentSize := nAudioBufferSizeCurrent; - // nWriteSamples := 0; - pSoundBuffer := audioBuffer; - - while (nCurrentSize >= packSizeInSize) do - begin - pAudioFrame := nil; - - pAudioFrame := av_frame_alloc();//avcodec_alloc_frame(); - - // Audio frame should be equal or smaller pCodecCxt^.frame_size. - pAudioFrame^.nb_samples := min(pCodecCxt^.frame_size div av_get_bytes_per_sample(AV_SAMPLE_FMT_S16), nCountSamples); - // nBufferShift := nWriteSamples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); - nCurrentBufferSize := pAudioFrame^.nb_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); - - if avcodec_fill_audio_frame(pAudioFrame, 1, AV_SAMPLE_FMT_S16, pSoundBuffer, nCurrentBufferSize, 1) <> 0 then - begin - Result := false; - break; - end; - - av_init_packet(@pkt); - - pkt.flags := pkt.flags or AV_PKT_FLAG_KEY; - pkt.stream_index := pStream^.index; - pkt.data := pAudioEncodeBuffer; - pkt.size := nSizeAudioEncodeBuffer; - - nOutputSize := 0; - // Create encoded packet from audio frame. - error := avcodec_encode_audio2(pCodecCxt, @pkt, pAudioFrame, nOutputSize); - - if (error = 0) and (nOutputSize > 0) then - begin - if Assigned(pCodecCxt^.coded_frame) and (pCodecCxt^.coded_frame^.pts <> AV_NOPTS_VALUE) then - pkt.pts := av_rescale_q(pCodecCxt^.coded_frame^.pts, pCodecCxt^.time_base, pStream^.time_base); - - pkt.stream_index := pStream^.index; - - // Write the compressed frame in the media file. - if (av_interleaved_write_frame(pFormatContext, @pkt) <> 0) then - begin - Result := false; - break; - end; - end; - - nCurrentSize := nCurrentSize - nCurrentBufferSize; - pSoundBuffer := pSoundBuffer + nCurrentBufferSize; - - // nWriteSamples := nWriteSamples + pAudioFrame^.nb_samples; - avcodec_free_frame(pAudioFrame); - end; - - // save excess - CopyMemory(audioBuffer, @audioBuffer[nAudioBufferSizeCurrent - nCurrentSize], nCurrentSize); - nAudioBufferSizeCurrent := nCurrentSize; -end; - -function TFFMVideoEncoder.AddAudioStream(const pContext: pAVFormatContext; const codec_id: TAVCodecID): pAVStream; -Var - pCodecCxt: pAVCodecContext; -begin - // pCodecCxt := nil; - // Result := nil; - // Try create stream. - Result := avformat_new_stream(pContext, nil); - if not Assigned(Result) then - begin - // printf("Cannot add new audio stream\n"); - Exit(nil); - end; - // Codec. - pCodecCxt := Result^.codec; - pCodecCxt^.codec_id := codec_id; - pCodecCxt^.codec_type := AVMEDIA_TYPE_AUDIO; - // Set format - pCodecCxt^.bit_rate := 128000; - pCodecCxt^.sample_rate := 44100; - pCodecCxt^.channels := 1; // mono - pCodecCxt^.sample_fmt := AV_SAMPLE_FMT_S16; - - nSizeAudioEncodeBuffer := 4 * MAX_AUDIO_PACKET_SIZE; - if not Assigned(pAudioEncodeBuffer) then - pAudioEncodeBuffer := av_malloc(nSizeAudioEncodeBuffer); - - // Some formats want stream headers to be separate. - if (pContext^.oformat^.flags and AVFMT_GLOBALHEADER) <> 0 then - pCodecCxt^.flags := pCodecCxt^.flags or CODEC_FLAG_GLOBAL_HEADER; -end; - -function TFFMVideoEncoder.AddFrame(const frame: pAVFrame; const soundBuffer: pByte; const soundBufferSize: Integer; - const framepixfmt: TAVPixelFormat): boolean; -Var - // nOutputSize: Integer; - pVideoCodec: pAVCodecContext; -begin - Result := true; - // nOutputSize := 0; - // pVideoCodec := nil; - - if Assigned(pVideoStream) and Assigned(frame) and Assigned(frame^.data[0]) then - begin - pVideoCodec := pVideoStream^.codec; - - if NeedConvert(framepixfmt) then - begin - // RGB to YUV420P. - if not Assigned(pImgConvertCtx) then - begin - pImgConvertCtx := sws_getContext(pVideoCodec^.width, pVideoCodec^.height, framepixfmt, pVideoCodec^.width, pVideoCodec^.height, - pVideoCodec^.pix_fmt, SWS_BICUBLIN, nil, nil, nil); - end; - - // Allocate picture. - pCurrentPicture := CreateFFmpegPicture(pVideoCodec^.pix_fmt, pVideoCodec^.width, pVideoCodec^.height); - - // if NeedConvert(framepixfmt) and Assigned(pImgConvertCtx) then - // begin - // Convert RGB to YUV. - sws_scale(pImgConvertCtx, @frame^.data, @frame^.linesize, 0, pVideoCodec^.height, @pCurrentPicture^.data, @pCurrentPicture^.linesize); - // end; - - Result := AddVideoFrame(pCurrentPicture, pVideoStream^.codec); - - // Free temp frame - av_free(pCurrentPicture^.data[0]); - av_free(pCurrentPicture); - pCurrentPicture := nil; - end - else - Result := AddVideoFrame(frame, pVideoStream^.codec); - end; - - // Add sound - if Assigned(soundBuffer) and (soundBufferSize > 0) then - Result := AddAudioSample(pFormatContext, pAudioStream, soundBuffer, soundBufferSize); -end; - -function TFFMVideoEncoder.AddVideoFrame(const pOutputFrame: pAVFrame; const pVideoCodec: pAVCodecContext): boolean; -Var - pkt: TAVPacket; - packet: TAVPacket; - nOutputSize: Integer; - error: Integer; -begin - - // Result := false; - - if (pFormatContext^.oformat^.flags and AVFMT_RAWPICTURE) <> 0 then - begin - // Raw video case. The API will change slightly in the near - // future for that. - av_init_packet(@pkt); - - pkt.flags := pkt.flags or AV_PKT_FLAG_KEY; - pkt.stream_index := pVideoStream^.index; - pkt.data := pByte(pOutputFrame); - pkt.size := sizeof(TAVPicture); - - av_interleaved_write_frame(pFormatContext, @pkt); - Result := true; - end - else - begin - // Encode - av_init_packet(@packet); - packet.data := pVideoEncodeBuffer; - packet.size := nSizeVideoEncodeBuffer; - - nOutputSize := 0; - // Encode frame to packet. - error := avcodec_encode_video2(pVideoCodec, @packet, pOutputFrame, nOutputSize); - if (error = 0) and (nOutputSize > 0) then - begin - // AVPacket pkt; - av_init_packet(@pkt); - if Assigned(pVideoCodec^.coded_frame) and (pVideoCodec^.coded_frame^.pts <> AV_NOPTS_VALUE) then - pkt.pts := AV_NOPTS_VALUE; - - if Assigned(pVideoCodec^.coded_frame) and (pVideoCodec^.coded_frame^.key_frame <> 0) then - pkt.flags := pkt.flags or AV_PKT_FLAG_KEY; - pkt.stream_index := pVideoStream^.index; - pkt.data := pVideoEncodeBuffer; - pkt.size := packet.size; - - // Write packet with frame. - Result := av_interleaved_write_frame(pFormatContext, @pkt) = 0; - // Result := av_write_frame(pFormatContext, @pkt) = 0; - end - else - Result := false; - end; -end; - -function TFFMVideoEncoder.AddVideoStream(const pContext: pAVFormatContext; const codec_id: TAVCodecID): pAVStream; -Var - pCodecCxt: pAVCodecContext; -begin - // pCodecCxt := nil; - // Result := nil; - - Result := avformat_new_stream(pContext, nil); - if not Assigned(Result) then - begin - // printf("Cannot add new vidoe stream\n"); - Exit(nil); - end; - - pCodecCxt := Result^.codec; - pCodecCxt^.codec_id := codec_id; - pCodecCxt^.codec_type := AVMEDIA_TYPE_VIDEO; - pCodecCxt^.frame_number := 0; - // Put sample parameters. - pCodecCxt^.bit_rate := fbit_rate; // 2000000; - // Resolution must be a multiple of two. - pCodecCxt^.width := W_VIDEO; - pCodecCxt^.height := H_VIDEO; - (* time base: 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. *) - pCodecCxt^.time_base.den := ftime_base_den; // 25; - pCodecCxt^.time_base.num := 1; - pCodecCxt^.gop_size := 12; // emit one intra frame every twelve frames at most - - pCodecCxt^.pix_fmt := AV_PIX_FMT_YUV420P; - if (pCodecCxt^.codec_id = AV_CODEC_ID_MPEG2VIDEO) then - begin - // Just for testing, we also add B frames - pCodecCxt^.max_b_frames := 2; - end; - if (pCodecCxt^.codec_id = AV_CODEC_ID_MPEG1VIDEO) then - begin - (* Needed to avoid using macroblocks - in which some coeffs overflow.This does not happen with normal video, it just happens here as the motion of - the chroma plane does not match the luma plane. *) - pCodecCxt^.mb_decision := 2; - end; - - // Some formats want stream headers to be separate. - if (pContext^.oformat^.flags and AVFMT_GLOBALHEADER) <> 0 then - begin - pCodecCxt^.flags := pCodecCxt^.flags or CODEC_FLAG_GLOBAL_HEADER; - end; -end; - -procedure TFFMVideoEncoder.CloseAudio(const pContext: pAVFormatContext; const pStream: pAVStream); -begin - avcodec_close(pStream^.codec); - if Assigned(pAudioEncodeBuffer) then - begin - av_free(pAudioEncodeBuffer); - pAudioEncodeBuffer := Nil; - end; - nSizeAudioEncodeBuffer := 0; -end; - -procedure TFFMVideoEncoder.CloseVideo(const pContext: pAVFormatContext; const pStream: pAVStream); -begin - avcodec_close(pStream^.codec); - if Assigned(pCurrentPicture) then - begin - if Assigned(pCurrentPicture^.data[0]) then - begin - av_free(pCurrentPicture^.data[0]); - pCurrentPicture^.data[0] := nil; - end; - av_free(pCurrentPicture); - pCurrentPicture := nil; - end; - - if Assigned(pVideoEncodeBuffer) then - begin - av_free(pVideoEncodeBuffer); - pVideoEncodeBuffer := nil; - end; - nSizeVideoEncodeBuffer := 0; -end; - -constructor TFFMVideoEncoder.Create; -begin - pOutFormat := nil; - pFormatContext := nil; - pVideoStream := nil; - pImgConvertCtx := nil; - pCurrentPicture := nil; - pVideoEncodeBuffer := nil; - nSizeVideoEncodeBuffer := 0; - pAudioEncodeBuffer := nil; - nSizeAudioEncodeBuffer := 0; - nAudioBufferSize := 1024 * 1024 * 4; - audioBuffer := AllocMem(nAudioBufferSize); - nAudioBufferSizeCurrent := 0; - SetVideoParams; -end; - -function TFFMVideoEncoder.CreateFFmpegPicture(const pix_fmt: TAVPixelFormat; const nWidth, nHeight: Integer): pAVFrame; -Var - picture_buf: pByte; - size: Integer; -begin - // picture_buf := nil; - Result := av_frame_alloc();//avcodec_alloc_frame(); - if not Assigned(Result) then - begin - // printf("Cannot create frame\n"); - Exit(nil); - end; - - size := avpicture_get_size(pix_fmt, nWidth, nHeight); - - picture_buf := av_malloc(size); - - if not Assigned(picture_buf) then - begin - av_free(Result); - // printf("Cannot allocate buffer\n"); - Exit(nil); - end; - avpicture_fill(pAVPicture(Result), picture_buf, pix_fmt, nWidth, nHeight); -end; - -destructor TFFMVideoEncoder.Destroy; -begin - Finish; - inherited; -end; - -function TFFMVideoEncoder.Finish: boolean; -begin - Result := true; - // Todo: Maybe you need write audio samples from audioBuffer to file before cloasing. - if Assigned(pFormatContext) then - begin - // flush_encoder; - av_write_trailer(pFormatContext); - Free; - end; - - if Assigned(audioBuffer) then - begin - FreeMem(audioBuffer); - audioBuffer := nil; - end; -end; - -function TFFMVideoEncoder.flush_encoder: Integer; -Var - ret, got_output: Integer; - pkt: TAVPacket; -begin - Result := 0; - (* get the delayed frames *) - av_init_packet(@pkt); - got_output := 1; - While got_output <> 0 do - begin - ret := avcodec_encode_video2(pVideoStream^.codec, @pkt, nil, got_output); - if (ret < 0) then - begin - // WriteLn('Error encoding frame'); - Exit(ret); - end; - if (got_output <> 0) then - begin - // WriteLn(format('Write frame %3d (size=%5d)', [i, pkt.size])); - // BlockWrite(f, pkt.data^, pkt.size); - av_free_packet(pkt); - end; - // Inc(i); - end; -end; - -procedure TFFMVideoEncoder.Free; -Var - i: Integer; -begin - if Assigned(pFormatContext) then - begin - // close video stream - if Assigned(pVideoStream) then - CloseVideo(pFormatContext, pVideoStream); - - // close audio stream. - if Assigned(pAudioStream) then - CloseAudio(pFormatContext, pAudioStream); - - // Free the streams. - for i := 0 to pFormatContext^.nb_streams - 1 do - begin - av_freep(pFormatContext^.streams[i]^.codec); - // av_freep(pFormatContext^.streams[i]); - end; - - if ((pFormatContext^.flags and AVFMT_NOFILE) = 0) and Assigned(pFormatContext^.pb) then - avio_close(pFormatContext^.pb); - - // Free the stream. - av_free(pFormatContext); - pFormatContext := nil; - end; -end; - -function TFFMVideoEncoder.InitFile(const inputFile, container: AnsiString; const AW_VIDEO, AH_VIDEO: Integer): boolean; -Var - filename: PAnsiChar; -begin - Result := false; - W_VIDEO := AW_VIDEO; - H_VIDEO := AH_VIDEO; - filename := PAnsiChar(inputFile); - outputFilename := inputFile; - - // Initialize libavcodec - av_register_all(); - if System.AnsiStrings.SameText(container, 'auto') then - // Create format - pOutFormat := av_guess_format(nil, filename, nil) - else - // use contanier - pOutFormat := av_guess_format(PAnsiChar(container), nil, nil); - - if Assigned(pOutFormat) then - begin - // allocate context - pFormatContext := avformat_alloc_context(); - if Assigned(pFormatContext) then - begin - pFormatContext^.oformat := pOutFormat; - CopyMemory(@pFormatContext^.filename, filename, min(System.AnsiStrings.strlen(filename), sizeof(pFormatContext^.filename))); - - // Add video and audio stream - pVideoStream := AddVideoStream(pFormatContext, pOutFormat^.video_codec); - pAudioStream := AddAudioStream(pFormatContext, pOutFormat^.audio_codec); - - // Set the output parameters (must be done even if no parameters). - av_dump_format(pFormatContext, 0, filename, 1); - - // Open Video and Audio stream - Result := false; - if Assigned(pVideoStream) then - Result := OpenVideo(pFormatContext, pVideoStream); - - if Assigned(pAudioStream) then - Result := OpenAudio(pFormatContext, pAudioStream); - - if Result and ((pOutFormat^.flags and AVFMT_NOFILE) = 0) and (avio_open(pFormatContext^.pb, filename, AVIO_FLAG_WRITE) < 0) then - begin - Result := false; - // printf(" Cannot open file\ n "); - end; - - if Result then - // Write file header. - avformat_write_header(pFormatContext, nil); - end; - end; - - if not Result then - begin - Free(); - // printf(" Cannot init file\ n "); - end; -end; - -function TFFMVideoEncoder.NeedConvert(const framepixfmt: TAVPixelFormat): boolean; -begin - if Assigned(pVideoStream) and Assigned(pVideoStream^.codec) then - Result := pVideoStream^.codec^.pix_fmt <> framepixfmt // AV_PIX_FMT_RGB24 - else - Result := false; -end; - -function TFFMVideoEncoder.OpenAudio(const pContext: pAVFormatContext; const pStream: pAVStream): boolean; -Var - pCodecCxt: pAVCodecContext; - pCodec: pAVCodec; -begin - // pCodecCxt := nil; - // pCodec := nil; - pCodecCxt := pStream^.codec; - // Find the audio encoder. - pCodec := avcodec_find_encoder(pCodecCxt^.codec_id); - if not Assigned(pCodec) then - begin - // printf("Cannot open audio codec\n"); - Exit(false); - end; - // Open it. - if (avcodec_open2(pCodecCxt, pCodec, nil) < 0) then - begin - // printf("Cannot open audio codec\n"); - Exit(false); - end; - - if (pCodecCxt^.frame_size <= 1) then - begin - // Ugly hack for PCM codecs (will be removed ASAP with new PCM - // support to compute the input frame size in samples. - audioInputSampleSize := nSizeAudioEncodeBuffer div pCodecCxt^.channels; - case pStream^.codec^.codec_id of - AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_U16LE, AV_CODEC_ID_PCM_U16BE: - audioInputSampleSize := audioInputSampleSize shr 1; - end; - pCodecCxt^.frame_size := audioInputSampleSize; - end - else - audioInputSampleSize := pCodecCxt^.frame_size; - Result := true; -end; - -function TFFMVideoEncoder.OpenVideo(const oc: pAVFormatContext; const pStream: pAVStream): boolean; -Var - pCodec: pAVCodec; - pContext: pAVCodecContext; -begin - pContext := pStream^.codec; - // Find the video encoder. - pCodec := avcodec_find_encoder(pContext^.codec_id); - if not Assigned(pCodec) then - begin - // printf("Cannot found video codec\n"); - Exit(false); - end; - - // Open the codec. - if (avcodec_open2(pContext, pCodec, nil) < 0) then - begin - // printf("Cannot open video codec\n"); - Exit(false); - end; - - pVideoEncodeBuffer := nil; - if (pFormatContext^.oformat^.flags and AVFMT_RAWPICTURE) = 0 then - begin - // allocate output buffer - nSizeVideoEncodeBuffer := 10000000; - pVideoEncodeBuffer := av_malloc(nSizeVideoEncodeBuffer); - end; - Result := true; -end; - -procedure TFFMVideoEncoder.SetVideoParams(const atime_base_den, abit_rate: Integer); -begin - fbit_rate := abit_rate; - ftime_base_den := atime_base_den; -end; - -end. diff --git a/source/ffmpeg/ffm.ctypes.pas b/source/ffmpeg/ffm.ctypes.pas deleted file mode 100644 index 3275a72..0000000 --- a/source/ffmpeg/ffm.ctypes.pas +++ /dev/null @@ -1,74 +0,0 @@ -{ - This file is part of the Free Pascal run time library. - Copyright (c) 2004 by Marco van de Voort, member of the - Free Pascal development team - - Implements C types for in header conversions - - See the file COPYING.FPC, included in this distribution, - for details about the copyright. - - 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. - - - **********************************************************************} - -unit ffm.ctypes; - -interface - -type - qword = int64; // Keep h2pas "uses ctypes" headers working with delphi. - - { the following type definitions are compiler dependant } - { and system dependant } - - cint8 = shortint; pcint8 = ^cint8; - cuint8 = byte; pcuint8 = ^cuint8; - cchar = cint8; pcchar = ^cchar; - cschar = cint8; pcschar = ^cschar; - cuchar = cuint8; pcuchar = ^cuchar; - - cint16 = smallint; pcint16 = ^cint16; - cuint16 = word; pcuint16 = ^cuint16; - cshort = cint16; pcshort = ^cshort; - csshort = cint16; pcsshort = ^csshort; - cushort = cuint16; pcushort = ^cushort; - - cint32 = longint; pcint32 = ^cint32; - cuint32 = longword; pcuint32 = ^cuint32; - cint = cint32; pcint = ^cint; { minimum range is : 32-bit } - csint = cint32; pcsint = ^csint; { minimum range is : 32-bit } - cuint = cuint32; pcuint = ^cuint; { minimum range is : 32-bit } - csigned = cint; pcsigned = ^csigned; - cunsigned = cuint; pcunsigned = ^cunsigned; - - cint64 = int64; pcint64 = ^cint64; - cuint64 = qword; pcuint64 = ^cuint64; - uint64_t = cuint64; puint64_t = ^uint64_t; - clonglong = cint64; pclonglong = ^clonglong; - cslonglong = cint64; pcslonglong = ^cslonglong; - culonglong = cuint64; pculonglong = ^culonglong; - - cbool = longbool; pcbool = ^cbool; - -{$if defined(cpu64) and not(defined(win64) and defined(cpux86_64))} - clong = int64; pclong = ^clong; - cslong = int64; pcslong = ^cslong; - culong = qword; pculong = ^culong; -{$else} - clong = longint; pclong = ^clong; - cslong = longint; pcslong = ^cslong; - culong = cardinal; pculong = ^culong; - int64_t = Int64; pint64_t = ^int64_t; -{$endif} - - cfloat = single; pcfloat = ^cfloat; - cdouble = double; pcdouble = ^cdouble; - clongdouble = extended; pclongdouble = ^clongdouble; - -implementation - -end. diff --git a/source/ffmpeg/ffm.dict.pas b/source/ffmpeg/ffm.dict.pas deleted file mode 100644 index 72bb1f1..0000000 --- a/source/ffmpeg/ffm.dict.pas +++ /dev/null @@ -1,169 +0,0 @@ -unit ffm.dict; - -{$i ffmpeg.inc} - -interface - -(* - * - * This file is part of ffm. - * - * 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 -*) -// -(* - * @file - * Public dictionary API. - * @deprecated - * AVDictionary is provided for compatibility with libav. It is both in - * implementation as well as API inefficient. It does not scale and is - * extremely slow with large dictionaries. - * It is recommended that new code uses our tree container from tree.c/h - * where applicable, which uses AVL trees to achieve O(log n) performance. -*) - -(* - * @addtogroup lavu_dict AVDictionary - * @ingroup lavu_data - * - * @brief Simple key:value store - * - * @{ - * Dictionaries are used for storing key:value pairs. To create - * an AVDictionary, simply pass an address of a NULL pointer to - * av_dict_set(). NULL can be used as an empty dictionary wherever - * a pointer to an AVDictionary is required. - * Use av_dict_get() to retrieve an entry or iterate over all - * entries and finally av_dict_free() to free the dictionary - * and all its contents. - * - * @code - * AVDictionary *d = NULL; // "create" an empty dictionary - * av_dict_set(&d, "foo", "bar", 0); // add an entry - * - * char *k = av_strdup("key"); // if your strings are already allocated, - * char *v = av_strdup("value"); // you can avoid copying them like this - * av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); - * - * AVDictionaryEntry *t = NULL; - * while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { - * <....> // iterate over all entries in d - * } - * - * av_dict_free(&d); - * @endcode - * -*) -const - AV_DICT_MATCH_CASE = 1; - AV_DICT_IGNORE_SUFFIX = 2; - AV_DICT_DONT_STRDUP_KEY = 4; // **< Take ownership of a key that's been - // allocated with av_malloc() and children. */ - AV_DICT_DONT_STRDUP_VAL = 8; // **< Take ownership of a value that's been - // allocated with av_malloc() and chilren. */ - AV_DICT_DONT_OVERWRITE = 16; - /// < Don't overwrite existing entries. - AV_DICT_APPEND = 32; // **< If the entry already exists, append to it. Note that no - // delimiter is added, the strings are simply concatenated. */ - -type - pAVDictionaryEntry = ^TAVDictionaryEntry; - - TAVDictionaryEntry = { packed } record - key: pAnsiChar; - value: pAnsiChar; - end; - - pAVDictionary = ^TAVDictionary; - ppAVDictionary = ^pAVDictionary; - - TAVDictionary = { packed } record - end; - - (* - * Get a dictionary entry 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 entry or NULL, changing key or value leads to undefined behavior. - *) - // AVDictionaryEntry * av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags); -function av_dict_get(m: pAVDictionary; const key: pAnsiChar; const prev: pAVDictionaryEntry; flags: Integer): pAVDictionaryEntry; cdecl; - -(* - * Get number of entries in dictionary. - * - * @param m dictionary - * @return number of entries in dictionary -*) -// int av_dict_count(const AVDictionary *m); - -(* - * Set the given entry in *pm, overwriting an existing entry. - * - * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL - * a dictionary struct is allocated and put in *pm. - * @param key entry key to add to *pm (will be av_strduped depending on flags) - * @param value entry value to add to *pm (will be av_strduped depending on flags). - * Passing a NULL value will cause an existing entry to be deleted. - * @return >= 0 on success otherwise an error code <0 -*) -// int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); -function av_dict_set(Var pm: pAVDictionary; const key: pAnsiChar; const value: pAnsiChar; flags: Integer): Integer; cdecl; - -(* - * Parse the key/value pairs list and add to a dictionary. - * - * @param key_val_sep a 0-terminated list of characters used to separate - * key from value - * @param pairs_sep a 0-terminated list of characters used to separate - * two pairs from each other - * @param flags flags to use when adding to dictionary. - * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL - * are ignored since the key/value tokens will always - * be duplicated. - * @return 0 on success, negative AVERROR code on failure -*) -// int av_dict_parse_string(AVDictionary **pm, const char *str, -// const char *key_val_sep, const char *pairs_sep, -// int flags); -// -(* - * Copy entries from one AVDictionary struct into another. - * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, - * this function will allocate a struct for you and put it in *dst - * @param src pointer to source AVDictionary struct - * @param flags flags to use when setting entries in *dst - * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag -*) -// void av_dict_copy(AVDictionary **dst, AVDictionary *src, int flags); -// -(* - * Free all the memory allocated for an AVDictionary struct - * and all keys and values. -*) -// void av_dict_free(AVDictionary **m); -procedure av_dict_free(Var m: pAVDictionary); cdecl; - -implementation - -uses ffm.lib; - -function av_dict_get; external avutil_dll; -procedure av_dict_free; external avutil_dll; -function av_dict_set; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.errno.pas b/source/ffmpeg/ffm.errno.pas deleted file mode 100644 index 36f222b..0000000 --- a/source/ffmpeg/ffm.errno.pas +++ /dev/null @@ -1,123 +0,0 @@ -unit ffm.errno; - -interface - -Const - - EPERM = 1; // Operation not permitted - ENOENT = 2; // No such file or directory - ESRCH = 3; // No such process - EINTR = 4; // Interrupted system call - EIO = 5; // Input/output error - ENXIO = 6; // Device not configured - E2BIG = 7; // Argument list too long - ENOEXEC = 8; // Exec format error - EBADF = 9; // Bad file number - ECHILD = 10; // No spawned processes - EAGAIN = 11; // Resource temporarily unavailable - ENOMEM = 12; // Cannot allocate memory - EACCES = 13; // Access denied - EFAULT = 14; // Bad address - ENOTBLK = 15; // Not block device - EBUSY = 16; // Device busy - EEXIST = 17; // File exist - EXDEV = 18; // Cross-device link - ENODEV = 19; // Operation not supported by device - ENOTDIR = 20; // Not a directory - EISDIR = 21; // Is a directory - EINVAL = 22; // Invalid argument - ENFILE = 23; // Too many open files in system - EMFILE = 24; // Too many files open - ENOTTY = 25; // Inappropriate ioctl for device - ETXTBSY = 26; // Unknown error - EFBIG = 27; // File too large - ENOSPC = 28; // No space left on device - ESPIPE = 29; // Illegal seek - EROFS = 30; // Read-only file system - EMLINK = 31; // Too many links - EPIPE = 32; // Broken pipe - EDOM = 33; // Numerical arg out of domain - ERANGE = 34; // Result too large - EUCLEAN = 35; // Structure needs cleaning - EDEADLK = 36; // Resource deadlock avoided - EUNKNOWN = 37; // Unknown error - ENAMETOOLONG = 38; // File name too long - ENOLCK = 39; // No locks available - ENOSYS = 40; // Function not implemented - ENOTEMPTY = 41; // Directory not empty - EILSEQ = 42; // Invalid multibyte sequence - - // - // Sockets errors - // - - EWOULDBLOCK = 45; // Operation would block - EINPROGRESS = 46; // Operation now in progress - EALREADY = 47; // Operation already in progress - ENOTSOCK = 48; // Socket operation on nonsocket - EDESTADDRREQ = 49; // Destination address required - EMSGSIZE = 50; // Message too long - EPROTOTYPE = 51; // Protocol wrong type for socket - ENOPROTOOPT = 52; // Bad protocol option - EPROTONOSUPPORT = 53; // Protocol not supported - ESOCKTNOSUPPORT = 54; // Socket type not supported - EOPNOTSUPP = 55; // Operation not supported - EPFNOSUPPORT = 56; // Protocol family not supported - EAFNOSUPPORT = 57; // Address family not supported - EADDRINUSE = 58; // Address already in use - EADDRNOTAVAIL = 59; // Cannot assign requested address - ENETDOWN = 60; // Network is down - ENETUNREACH = 61; // Network is unreachable - ENETRESET = 62; // Network dropped connection on reset - ECONNABORTED = 63; // Connection aborted - ECONNRESET = 64; // Connection reset by peer - ENOBUFS = 65; // No buffer space available - EISCONN = 66; // Socket is already connected - ENOTCONN = 67; // Socket is not connected - ESHUTDOWN = 68; // Cannot send after socket shutdown - ETOOMANYREFS = 69; // Too many references - ETIMEDOUT = 70; // Operation timed out - ECONNREFUSED = 71; // Connection refused - ELOOP = 72; // Cannot translate name - EWSNAMETOOLONG = 73; // Name component or name was too long - EHOSTDOWN = 74; // Host is down - EHOSTUNREACH = 75; // No route to host - EWSNOTEMPTY = 76; // Cannot remove a directory that is not empty - EPROCLIM = 77; // Too many processes - EUSERS = 78; // Ran out of quota - EDQUOT = 79; // Ran out of disk quota - ESTALE = 80; // File handle reference is no longer available - EREMOTE = 81; // Item is not available locally - - // - // Resolver errors - // - - EHOSTNOTFOUND = 82; // Host not found - ETRYAGAIN = 83; // Nonauthoritative host not found - ENORECOVERY = 84; // A nonrecoverable error occured - ENODATA = 85; // Valid name, no data record of requested type - - // - // Misc. error codes - // - - EPROTO = 86; // Protocol error - ECHKSUM = 87; // Checksum error - EBADSLT = 88; // Invalid slot - EREMOTEIO = 89; // Remote I/O error - - // - // Error code aliases - // - - ETIMEOUT = ETIMEDOUT; - EBUF = ENOBUFS; - EROUTE = ENETUNREACH; - ECONN = ENOTCONN; - ERST = ECONNRESET; - EABORT = ECONNABORTED; - -implementation - -end. diff --git a/source/ffmpeg/ffm.error.pas b/source/ffmpeg/ffm.error.pas deleted file mode 100644 index da49a68..0000000 --- a/source/ffmpeg/ffm.error.pas +++ /dev/null @@ -1,187 +0,0 @@ -(* - * This file is part of ffm. - * - * 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 -*) - -unit ffm.error; - -{$i ffmpeg.inc} - -interface - -uses ffm.errno; - -(* error handling *) -{$IF EDOM > 0} -function AVERROR(e: integer): integer; inline; -/// < Returns a negative error code from a POSIX error code, to return from library functions. -function AVUNERROR(e: integer): integer; inline; -/// < Returns a POSIX error code from a library function error return value. -{$ELSE} -(* Some platforms have E* and errno already negated. *) -AVERROR(e)(e)AVUNERROR(e)(e) -{$ENDIF} -// #define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) - -Const - AVERROR_BSF_NOT_FOUND = -(ord($F8) or (ord('B') shl 8) or (ord('S') shl 16) or (ord('F') shl 24)); - /// < Bitstream filter not found - AVERROR_BUG = -(ord('B') or (ord('U') shl 8) or (ord('G') shl 16) or (ord('!') shl 24)); - /// < Internal bug, also see AVERROR_BUG2 - AVERROR_BUFFER_TOO_SMALL = -(ord('B') or (ord('U') shl 8) or (ord('F') shl 16) or (ord('S') shl 24)); - /// < Buffer too small - AVERROR_DECODER_NOT_FOUND = -(ord($F8) or (ord('D') shl 8) or (ord('E') shl 16) or (ord('C') shl 24)); - /// < Decoder not found - AVERROR_DEMUXER_NOT_FOUND = -(ord($F8) or (ord('D') shl 8) or (ord('E') shl 16) or (ord('M') shl 24)); - /// < Demuxer not found - AVERROR_ENCODER_NOT_FOUND = -(ord($F8) or (ord('E') shl 8) or (ord('N') shl 16) or (ord('C') shl 24)); - /// < Encoder not found - AVERROR_EOF = -(ord('E') or (ord('O') shl 8) or (ord('F') shl 16) or (ord(' ') shl 24)); - /// < End of file - AVERROR_EXIT = -(ord('E') or (ord('X') shl 8) or (ord('I') shl 16) or (ord('T') shl 24)); - /// < Immediate exit was requested; the called function should not be restarted - AVERROR_EXTERNAL = -(ord('E') or (ord('X') shl 8) or (ord('T') shl 16) or (ord(' ') shl 24)); - /// < Generic error in an external library - AVERROR_FILTER_NOT_FOUND = -(ord($F8) or (ord('F') shl 8) or (ord('I') shl 16) or (ord('L') shl 24)); - /// < Filter not found - AVERROR_INVALIDDATA = -(ord('I') or (ord('N') shl 8) or (ord('D') shl 16) or (ord('A') shl 24)); - /// < Invalid data found when processing input - AVERROR_MUXER_NOT_FOUND = -(ord($F8) or (ord('M') shl 8) or (ord('U') shl 16) or (ord('X') shl 24)); - /// < Muxer not found - AVERROR_OPTION_NOT_FOUND = -(ord($F8) or (ord('O') shl 8) or (ord('P') shl 16) or (ord('T') shl 24)); - /// < Option not found - AVERROR_PATCHWELCOME = -(ord('P') or (ord('A') shl 8) or (ord('W') shl 16) or (ord('E') shl 24)); - /// < Not yet implemented in FFmpeg, patches welcome - AVERROR_PROTOCOL_NOT_FOUND = -(ord($F8) or (ord('P') shl 8) or (ord('R') shl 16) or (ord('O') shl 24)); - /// < Protocol not found - AVERROR_STREAM_NOT_FOUND = -(ord($F8) or (ord('S') shl 8) or (ord('T') shl 16) or (ord('R') shl 24)); - /// < Stream not found - (* - * This is semantically identical to AVERROR_BUG - * it has been introduced in Libav after our AVERROR_BUG and with a modified value. - *) - AVERROR_BUG2 = -(ord('B') or (ord('U') shl 8) or (ord('G') shl 16) or (ord(' ') shl 24)); - AVERROR_UNKNOWN = -(ord('U') or (ord('N') shl 8) or (ord('K') shl 16) or (ord('N') shl 24)); - /// < Unknown error, typically from an external library - AVERROR_EXPERIMENTAL = -($2BB2AFA8); - /// < Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. - - AV_ERROR_MAX_STRING_SIZE = 64; - - (* - * 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 - *) - // int av_strerror(int errnum, char *errbuf, size_t errbuf_size); -function av_strerror(errnum: integer; errbuf: pAnsiChar; errbuf_size: integer): integer; cdecl; - -(* - * Fill the provided buffer with a string containing an error string - * corresponding to the AVERROR code errnum. - * - * @param errbuf a buffer - * @param errbuf_size size in bytes of errbuf - * @param errnum error code to describe - * @return the buffer in input, filled with the error description - * @see av_strerror() -*) -// static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) -{ - av_strerror(errnum, errbuf, errbuf_size); - return errbuf; -} - -function av_make_error_string(errbuf: pAnsiChar; errbuf_size: integer; errnum: integer): pAnsiChar; inline; - -(* - * Convenience macro, the return value should be used only directly in - * function arguments but never stand-alone. -*) -// #define av_err2str(errnum) \ -// av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) -function av_err2str(errnum: integer): pAnsiChar; inline; - -{ -DumpErrorCodes - Error Code : AVERROR_BSF_NOT_FOUND = -1179861752 -DumpErrorCodes - Error Code : AVERROR_BUG = -558323010 -DumpErrorCodes - Error Code : AVERROR_BUFFER_TOO_SMALL = -1397118274 -DumpErrorCodes - Error Code : AVERROR_DECODER_NOT_FOUND = -1128613112 -DumpErrorCodes - Error Code : AVERROR_DEMUXER_NOT_FOUND = -1296385272 -DumpErrorCodes - Error Code : AVERROR_ENCODER_NOT_FOUND = -1129203192 -DumpErrorCodes - Error Code : AVERROR_EOF = -541478725 -DumpErrorCodes - Error Code : AVERROR_EXIT = -1414092869 -DumpErrorCodes - Error Code : AVERROR_EXTERNAL = -542398533 -DumpErrorCodes - Error Code : AVERROR_FILTER_NOT_FOUND = -1279870712 -DumpErrorCodes - Error Code : AVERROR_INVALIDDATA = -1094995529 -DumpErrorCodes - Error Code : AVERROR_MUXER_NOT_FOUND = -1481985528 -DumpErrorCodes - Error Code : AVERROR_OPTION_NOT_FOUND = -1414549496 -DumpErrorCodes - Error Code : AVERROR_PATCHWELCOME = -1163346256 -DumpErrorCodes - Error Code : AVERROR_PROTOCOL_NOT_FOUND = -1330794744 -DumpErrorCodes - Error Code : AVERROR_STREAM_NOT_FOUND = -1381258232 -DumpErrorCodes - Error Code : AVERROR_BUG2 = -541545794 -DumpErrorCodes - Error Code : AVERROR_UNKNOWN = -1313558101 -DumpErrorCodes - Error Code : AVERROR_EXPERIMENTAL = -733130664 -DumpErrorCodes - Error Code : AVERROR_INPUT_CHANGED = -1668179713 -DumpErrorCodes - Error Code : AVERROR_OUTPUT_CHANGED = -1668179714 -DumpErrorCodes - Error Code : AVERROR_HTTP_BAD_REQUEST = -808465656 -DumpErrorCodes - Error Code : AVERROR_HTTP_UNAUTHORIZED = -825242872 -DumpErrorCodes - Error Code : AVERROR_HTTP_FORBIDDEN = -858797304 -DumpErrorCodes - Error Code : AVERROR_HTTP_NOT_FOUND = -875574520 -DumpErrorCodes - Error Code : AVERROR_HTTP_OTHER_4XX = -1482175736 -DumpErrorCodes - Error Code : AVERROR_HTTP_SERVER_ERROR = -1482175992 -} - -implementation - -uses ffm.lib; - -function AVERROR(e: integer): integer; inline; -begin - Result := -e; -end; - -function AVUNERROR(e: integer): integer; inline; -begin - Result := -e; -end; - -function av_make_error_string(errbuf: pAnsiChar; errbuf_size: integer; errnum: integer): pAnsiChar; inline; -begin - av_strerror(errnum, errbuf, errbuf_size); - Result := errbuf; -end; - -function av_err2str(errnum: integer): pAnsiChar; inline; -Var - buf: array [0 .. AV_ERROR_MAX_STRING_SIZE - 1] of AnsiChar; -begin - FillChar(buf, SizeOf(buf), 0); - av_make_error_string(buf, AV_ERROR_MAX_STRING_SIZE, errnum); - Result := buf; -end; - -function av_strerror; external avutil_dll; - -end. - diff --git a/source/ffmpeg/ffm.frame.pas b/source/ffmpeg/ffm.frame.pas deleted file mode 100644 index f95dd7a..0000000 --- a/source/ffmpeg/ffm.frame.pas +++ /dev/null @@ -1,673 +0,0 @@ -(* - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.frame; - -{$i ffmpeg.inc} - -interface - -uses - ffm.ctypes, ffm.buffer, ffm.dict, ffm.avutil, ffm.rational; - -Type - pAVColorSpace = ^TAVColorSpace; - 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_YCOCG = 8, // < Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 - AVCOL_SPC_BT2020_NCL = 9, // < ITU-R BT2020 non-constant luminance system - AVCOL_SPC_BT2020_CL = 10, // < ITU-R BT2020 constant luminance system - AVCOL_SPC_NB // < Not part of ABI - ); - -Const - AVCOL_SPC_YCGCO = AVCOL_SPC_YCOCG; - - (* - * The frame data may be corrupted, e.g. due to decoding errors. - *) - AV_FRAME_FLAG_CORRUPT = (1 shl 0); - FF_DECODE_ERROR_INVALID_BITSTREAM = 1; - FF_DECODE_ERROR_MISSING_REFERENCE = 2; - -Type - pAVColorRange = ^TAVColorRange; - 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 - ); - - pAVFrameSideDataType = ^TAVFrameSideDataType; - TAVFrameSideDataType = ( - (* - * The data is the AVPanScan struct defined in libavcodec. - *) - AV_FRAME_DATA_PANSCAN // - ); - - pAVFrameSideData = ^TAVFrameSideData; - ppAVFrameSideData = ^pAVFrameSideData; - - TAVFrameSideData = {packed} record - _type: TAVFrameSideDataType; - data: pByte; - size: Integer; - metadata: pAVDictionary; - end; - - (* - * This structure describes decoded (raw) audio or video data. - * - * AVFrame must be allocated using av_frame_alloc(). Note that this only - * allocates the AVFrame itself, the buffers for the data must be managed - * through other means (see below). - * AVFrame must be freed with av_frame_free(). - * - * AVFrame is typically allocated once and then reused multiple times to hold - * different data (e.g. a single AVFrame to hold frames received from a - * decoder). In such a case, av_frame_unref() will free any references held by - * the frame and reset it to its original clean state before it - * is reused again. - * - * The data described by an AVFrame is usually reference counted through the - * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / - * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at - * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, - * every single data plane must be contained in one of the buffers in - * AVFrame.buf or AVFrame.extended_buf. - * There may be a single buffer for all the data, or one separate buffer for - * each plane, or anything in between. - * - * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added - * to the end with a minor bump. - * Similarly fields that are marked as to be only accessed by - * av_opt_ptr() can be reordered. This allows 2 forks to add fields - * without breaking compatibility with each other. - *) -const - AV_NUM_DATA_POINTERS = 8; - -Type - pAVNDPArray = ^TAVNDPArray; - TAVNDPArray = array [0 .. AV_NUM_DATA_POINTERS - 1] of Integer; - - pAVFrameByteArray = ^TAVFrameByteArray; - TAVFrameByteArray = array [0 .. AV_NUM_DATA_POINTERS - 1] of pByte; - - pAVFrameInt64Array = ^TAVFrameInt64Array; - TAVFrameInt64Array = array [0 .. AV_NUM_DATA_POINTERS - 1] of uint64; - - pAVFrame = ^TAVFrame; - ppAVFrame = ^pAVFrame; - - puint8 = ^uint8; - ppuint8 = ^puint8; - - pMotion_val = ^TMotion_val; - TMotion_val = array [0 .. 1] of int16; - - pRef_index = ^TRef_index; - TRef_index = array [0 .. 1] of int8; - - pAVBufferRefArray = ^TAVBufferRefArray; - TAVBufferRefArray = array [0 .. AV_NUM_DATA_POINTERS - 1] of pAVBufferRef; - - TLinesizes = array [0 .. AV_NUM_DATA_POINTERS - 1] of Integer; - pLinesizes = ^TLinesizes; - - TAVFrame = {packed} record - (* - * pointer to the picture/channel planes. - * This might be different from the first allocated byte - * - * Some decoders access areas outside 0,0 - width,height, please - * see avcodec_align_dimensions2(). Some filters and swscale can read - * up to 16 bytes beyond the planes, if these filters are to be used, - * then 16 extra bytes must be allocated. - *) - data: TAVFrameByteArray; - (* - * For video, size in bytes of each picture line. - * For audio, size in bytes of each plane. - * - * For audio, only linesize[0] may be set. For planar audio, each channel - * plane must be the same size. - * - * For video the linesizes should be multiplies of the CPUs alignment - * preference, this is 16 or 32 for modern desktop CPUs. - * Some code requires such alignment other code can be slower without - * correct alignment, for yet other it makes no difference. - * - * @note The linesize may be larger than the size of usable data -- there - * may be extra padding present for performance reasons. - *) - linesize: TLinesizes; - (* - * pointers to the data planes/channels. - * - * For video, this should simply point to data[]. - * - * For planar audio, each channel has a separate data pointer, and - * linesize[0] contains the size of each channel buffer. - * For {packed} audio, there is just one data pointer, and linesize[0] - * contains the total size of the buffer for all channels. - * - * Note: Both data and extended_data should always be set in a valid frame, - * but for planar audio with more channels that can fit in data, - * extended_data must be used in order to access all channels. - *) - extended_data: ppuint8; - (* - * width and height of the video frame - *) - width, height: Integer; - (* - * number of audio samples (per channel) described by this frame - *) - nb_samples: Integer; - - (* - * format of the frame, -1 if unknown or unset - * Values correspond to enum AVPixelFormat for video frames, - * enum AVSampleFormat for audio) - *) - format: Integer; - (* - * 1 -> keyframe, 0-> not - *) - key_frame: Integer; - (* - * Picture type of the frame. - *) - pict_type: TAVPictureType; - -{$IFDEF FF_API_AVFRAME_LAVC} - // attribute_deprecated - base: TAVFrameByteArray; -{$ENDIF} - (* - * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. - *) - sample_aspect_ratio: TAVRational; - (* - * Presentation timestamp in time_base units (time when frame should be shown to user). - *) - pts: int64_t; - (* - * PTS copied from the AVPacket that was decoded to produce this frame. - *) - pkt_pts: int64_t; - (* - * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isnt used) - * This is also the Presentation time of this AVFrame calculated from - * only AVPacket.dts values without pts values. - *) - pkt_dts: int64_t; - (* - * picture number in bitstream order - *) - coded_picture_number: Integer; - (* - * picture number in display order - *) - display_picture_number: Integer; - (* - * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) - *) - quality: Integer; -{$IFDEF FF_API_AVFRAME_LAVC} - // attribute_deprecated - reference: Integer; - (* - * QP table *) - // attribute_deprecated - qscale_table: pint8_t; - (* - * QP store stride - *) - // attribute_deprecated - qstride: Integer; - // attribute_deprecated - qscale_type: Integer; - (* - * mbskip_table[mb]>=1 if MB didn't change - * stride= mb_width = (width+15)>>4 - *) - // attribute_deprecated - mbskip_table: puint8_t; - (* - * 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 - *) - // attribute_deprecated - // int16_t (*motion_val[2])[2]; - motion_val: array [0 .. 1] of pMotion_val; - (* - * macroblock type table - * mb_type_base + mb_width + 2 - *) - // attribute_deprecated - mb_type: puint32_t; - (* - * DCT coefficients - *) - // attribute_deprecated - dct_coeff: pshort; - (* - * motion reference frame index - * the order in which these are stored can depend on the codec. - *) - // attribute_deprecated - // int8_t *ref_index[2]; - ref_index: pRef_index; -{$ENDIF} - (* - * for some private data of the user - *) - opaque: Pointer; - (* - * error - *) - error: array [0 .. AV_NUM_DATA_POINTERS - 1] of uint64; -{$IFDEF FF_API_AVFRAME_LAVC} - // attribute_deprecated - _type: Integer; -{$ENDIF} - (* - * When decoding, this signals how much the picture must be delayed. - * extra_delay = repeat_pict / (2*fps) - *) - repeat_pict: Integer; - (* - * The content of the picture is interlaced. - *) - interlaced_frame: Integer; - (* - * If the content is interlaced, is top field displayed first. - *) - top_field_first: Integer; - (* - * Tell user application that palette has changed from previous frame. - *) - palette_has_changed: Integer; - -{$IFDEF FF_API_AVFRAME_LAVC} - // attribute_deprecated - buffer_hints: Integer; - (* - * Pan scan. - *) - // attribute_deprecated - pan_scan: pAVPanScan; -{$ENDIF} - (* - * reordered opaque 64bit (generally an integer or a double precision float - * PTS but can be anything). - * The user sets AVCodecContext.reordered_opaque to represent the input at - * that time, - * the decoder reorders values as needed and sets AVFrame.reordered_opaque - * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque - * @deprecated in favor of pkt_pts - *) - reordered_opaque: int64_t; -{$IFDEF FF_API_AVFRAME_LAVC} - (* - * @deprecated this field is unused - *) - // attribute_deprecated - hwaccel_picture_private: Pointer; - // attribute_deprecated - owner: pAVCodecContext; - // attribute_deprecated - thread_opaque: Pointer; - (* - * log2 of the size of the block which a single vector in motion_val represents: - * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2) - *) - // attribute_deprecated - motion_subsample_log2: uint8_t; -{$ENDIF} - (* - * Sample rate of the audio data. - *) - sample_rate: Integer; - (* - * Channel layout of the audio data. - *) - channel_layout: uint64_t; - // - (* - * AVBuffer references backing the data for this frame. If all elements of - * this array are NULL, then this frame is not reference counted. - * - * There may be at most one AVBuffer per data plane, so for video this array - * always contains all the references. For planar audio with more than - * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in - * this array. Then the extra AVBufferRef pointers are stored in the - * extended_buf array. - *) - buf: TAVBufferRefArray; - (* - * For planar audio which requires more than AV_NUM_DATA_POINTERS - * AVBufferRef pointers, this array will hold all the references which - * cannot fit into AVFrame.buf. - * - * Note that this is different from AVFrame.extended_data, which always - * contains all the pointers. This array only contains the extra pointers, - * which cannot fit into AVFrame.buf. - * - * This array is always allocated using av_malloc() by whoever constructs - * the frame. It is freed in av_frame_unref(). - *) - extended_buf: ppAVBufferRef; - (* - * Number of elements in extended_buf. - *) - nb_extended_buf: Integer; - side_data: ppAVFrameSideData; - nb_side_data: Integer; - (* - * Frame flags, a combination of AV_FRAME_FLAG_* - *) - flags: Integer; - (* - * frame timestamp estimated using various heuristics, in stream time base - * Code outside libavcodec should access this field using: - * av_frame_get_best_effort_timestamp(frame) - * - encoding: unused - * - decoding: set by libavcodec, read by user. - *) - best_effort_timestamp: int64_t; - (* - * reordered pos from the last AVPacket that has been input into the decoder - * Code outside libavcodec should access this field using: - * av_frame_get_pkt_pos(frame) - * - encoding: unused - * - decoding: Read by user. - *) - pkt_pos: int64_t; - (* - * duration of the corresponding packet, expressed in - * AVStream->time_base units, 0 if unknown. - * Code outside libavcodec should access this field using: - * av_frame_get_pkt_duration(frame) - * - encoding: unused - * - decoding: Read by user. - *) - pkt_duration: int64_t; - (* - * metadata. - * Code outside libavcodec should access this field using: - * av_frame_get_metadata(frame) - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - metadata: pAVDictionary; - (* - * decode error flags of the frame, set to a combination of - * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there - * were errors during the decoding. - * Code outside libavcodec should access this field using: - * av_frame_get_decode_error_flags(frame) - * - encoding: unused - * - decoding: set by libavcodec, read by user. - *) - decode_error_flags: Integer; - (* - * number of audio channels, only used for audio. - * Code outside libavcodec should access this field using: - * av_frame_get_channels(frame) - * - encoding: unused - * - decoding: Read by user. - *) - channels: Integer; - (* - * size of the corresponding packet containing the compressed - * frame. It must be accessed using av_frame_get_pkt_size() and - * av_frame_set_pkt_size(). - * It is set to a negative value if unknown. - * - encoding: unused - * - decoding: set by libavcodec, read by user. - *) - pkt_size: Integer; - (* - * YUV colorspace type. - * It must be accessed using av_frame_get_colorspace() and - * av_frame_set_colorspace(). - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - colorspace: TAVColorSpace; - (* - * MPEG vs JPEG YUV range. - * It must be accessed using av_frame_get_color_range() and - * av_frame_set_color_range(). - * - encoding: Set by user - * - decoding: Set by libavcodec - *) - color_range: TAVColorRange; - (* - * Not to be accessed directly from outside libavutil - *) - qp_table_buf: pAVBufferRef; - end; - - (* - // * Accessors for some AVFrame fields. - // * The position of these field in the structure is not part of the ABI, - // * they should not be accessed directly outside libavcodec. - *) - // int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); -function av_frame_get_best_effort_timestamp(const frame: pAVFrame): int64; cdecl; -// void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); -// int64_t av_frame_get_pkt_duration (const AVFrame *frame); -// void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); -// int64_t av_frame_get_pkt_pos (const AVFrame *frame); -// void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); -// int64_t av_frame_get_channel_layout (const AVFrame *frame); -// void av_frame_set_channel_layout (AVFrame *frame, int64_t val); -// int av_frame_get_channels (const AVFrame *frame); -// void av_frame_set_channels (AVFrame *frame, int val); -// int av_frame_get_sample_rate (const AVFrame *frame); -// void av_frame_set_sample_rate (AVFrame *frame, int val); -// AVDictionary *av_frame_get_metadata (const AVFrame *frame); -// void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); -// int av_frame_get_decode_error_flags (const AVFrame *frame); -// void av_frame_set_decode_error_flags (AVFrame *frame, int val); -// int av_frame_get_pkt_size(const AVFrame *frame); -// void av_frame_set_pkt_size(AVFrame *frame, int val); -// AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame); -// int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); -// int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); -// enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); -// void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); -// enum AVColorRange av_frame_get_color_range(const AVFrame *frame); -// void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); -// -(* - // * Get the name of a colorspace. - // * @return a static string identifying the colorspace; can be NULL. -*) -// const char *av_get_colorspace_name(enum AVColorSpace val); -// -(* - // * Allocate an AVFrame and set its fields to default values. The resulting - // * struct must be freed using av_frame_free(). - // * - // * @return An AVFrame filled with default values or NULL on failure. - // * - // * @note this only allocates the AVFrame itself, not the data buffers. Those - // * must be allocated through other means, e.g. with av_frame_get_buffer() or - // * manually. -*) -// AVFrame *av_frame_alloc(void); -function av_frame_alloc(): pAVFrame; cdecl; -// -(* - // * Free the frame and any dynamically allocated objects in it, - // * e.g. extended_data. If the frame is reference counted, it will be - // * unreferenced first. - // * - // * @param frame frame to be freed. The pointer will be set to NULL. -*) -// void av_frame_free(AVFrame **frame); -procedure av_frame_free(Var frame: pAVFrame); cdecl; -(* - // * Setup a new reference to the data described by a given frame. - // * - // * Copy frame properties from src to dst and create a new reference for each - // * AVBufferRef from src. - // * - // * If src is not reference counted, new buffers are allocated and the data is - // * copied. - // * - // * @return 0 on success, a negative AVERROR on error -*) -// int av_frame_ref(AVFrame *dst, const AVFrame *src); -// -(* - // * Create a new frame that references the same data as src. - // * - // * This is a shortcut for av_frame_alloc()+av_frame_ref(). - // * - // * @return newly created AVFrame on success, NULL on error. -*) -// AVFrame *av_frame_clone(const AVFrame *src); -// -(* - // * Unreference all the buffers referenced by frame and reset the frame fields. -*) -// void av_frame_unref(AVFrame *frame); -procedure av_frame_unref(frame: pAVFrame); cdecl; - -(* - // * Move everythnig contained in src to dst and reset src. -*) -// void av_frame_move_ref(AVFrame *dst, AVFrame *src); -// -(* - // * Allocate new buffer(s) for audio or video data. - // * - // * The following fields must be set on frame before calling this function: - // * - format (pixel format for video, sample format for audio) - // * - width and height for video - // * - nb_samples and channel_layout for audio - // * - // * This function will fill AVFrame.data and AVFrame.buf arrays and, if - // * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. - // * For planar formats, one buffer will be allocated for each plane. - // * - // * @param frame frame in which to store the new buffers. - // * @param align required buffer size alignment - // * - // * @return 0 on success, a negative AVERROR on error. -*) -// int av_frame_get_buffer(AVFrame *frame, int align); -// -(* - // * Check if the frame data is writable. - // * - // * @return A positive value if the frame data is writable (which is true if and - // * only if each of the underlying buffers has only one reference, namely the one - // * stored in this frame). Return 0 otherwise. - // * - // * If 1 is returned the answer is valid until av_buffer_ref() is called on any - // * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). - // * - // * @see av_frame_make_writable(), av_buffer_is_writable() -*) -// int av_frame_is_writable(AVFrame *frame); -// -(* - // * Ensure that the frame data is writable, avoiding data copy if possible. - // * - // * Do nothing if the frame is writable, allocate new buffers and copy the data - // * if it is not. - // * - // * @return 0 on success, a negative AVERROR on error. - // * - // * @see av_frame_is_writable(), av_buffer_is_writable(), - // * av_buffer_make_writable() -*) -// int av_frame_make_writable(AVFrame *frame); -// -(* - // * Copy only "metadata" fields from src to dst. - // * - // * Metadata for the purpose of this function are those fields that do not affect - // * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample - // * aspect ratio (for video), but not width/height or channel layout. - // * Side data is also copied. -*) -// int av_frame_copy_props(AVFrame *dst, const AVFrame *src); -// -(* - // * Get the buffer reference a given data plane is stored in. - // * - // * @param plane index of the data plane of interest in frame->extended_data. - // * - // * @return the buffer reference that contains the plane or NULL if the input - // * frame is not valid. -*) -// AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); -// -(* - // * Add a new side data to a frame. - // * - // * @param frame a frame to which the side data should be added - // * @param type type of the added side data - // * @param size size of the side data - // * - // * @return newly added side data on success, NULL on error -*) -// AVFrameSideData *av_frame_new_side_data(AVFrame *frame, -// enum AVFrameSideDataType type, -// int size); -// -(* - // * @return a pointer to the side data of a given type on success, NULL if there - // * is no side data with such type in this frame. -*) -// AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, -// enum AVFrameSideDataType type); - -implementation - -uses ffm.lib; - -function av_frame_alloc; external avutil_dll; -function av_frame_get_best_effort_timestamp; external avutil_dll; -procedure av_frame_unref; external avutil_dll; -procedure av_frame_free; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.imgutils.pas b/source/ffmpeg/ffm.imgutils.pas deleted file mode 100644 index 7158979..0000000 --- a/source/ffmpeg/ffm.imgutils.pas +++ /dev/null @@ -1,210 +0,0 @@ -unit ffm.imgutils; - -{$i ffmpeg.inc} - -interface - -uses - ffm.pixfmt, ffm.frame; - -(* - * This file is part of ffm. - * - * 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 -*) - -(* - * Compute the max pixel step for each plane of an image with a - * format described by pixdesc. - * - * The pixel step is the distance in bytes between the first byte of - * the group of bytes which describe a pixel component and the first - * byte of the successive group in the same plane for the same - * component. - * - * @param max_pixsteps an array which is filled with the max pixel step - * for each plane. Since a plane may contain different pixel - * components, the computed max_pixsteps[plane] is relative to the - * component in the plane with the max pixel step. - * @param max_pixstep_comps an array which is filled with the component - * for each plane which has the max pixel step. May be NULL. -*) -// void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], -// const AVPixFmtDescriptor *pixdesc); - -(* - * Compute the size of an image line with format pix_fmt and width - * width for the plane plane. - * - * @return the computed size in bytes -*) -// int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); - -(* - * Fill plane linesizes for an image with pixel format pix_fmt and - * width width. - * - * @param linesizes array to be filled with the linesize for each plane - * @return >= 0 in case of success, a negative error code otherwise -*) -// int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); - -(* - * Fill plane data pointers for an image with pixel format pix_fmt and - * height height. - * - * @param data pointers array to be filled with the pointer for each image plane - * @param ptr the pointer to a buffer which will contain the image - * @param linesizes the array containing the linesize for each - * plane, should be filled by av_image_fill_linesizes() - * @return the size in bytes required for the image buffer, a negative - * error code in case of failure -*) -// int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, -// uint8_t *ptr, const int linesizes[4]); - -(* - * Allocate an image with size w and h and pixel format pix_fmt, and - * fill pointers and linesizes accordingly. - * The allocated image buffer has to be freed by using - * av_freep(&pointers[0]). - * - * @param align the value to use for buffer size alignment - * @return the size in bytes required for the image buffer, a negative - * error code in case of failure -*) -// int av_image_alloc(uint8_t *pointers[4], int linesizes[4], -// int w, int h, enum AVPixelFormat pix_fmt, int align); -// Type -// TPointers = array [0 .. 3] of pByte; -// pPointers = ^TPointers; -// TLinesizes = array [0 .. 3] of integer; -// pLinesizes = ^TLinesizes; - -function av_image_alloc(Var pointers: TAVFrameByteArray; linesizes: TLinesizes; w: integer; h: integer; - pix_fmt: TAVPixelFormat; align: integer): integer; cdecl; -// function av_image_alloc(pointers: pPointers; linesizes: TLinesizes; w: integer; h: integer; pix_fmt: TAVPixelFormat; -// align: integer): integer; overload; cdecl; - -(* - * Copy image plane from src to dst. - * That is, copy "height" number of lines of "bytewidth" bytes each. - * The first byte of each successive line is separated by *_linesize - * bytes. - * - * bytewidth must be contained by both absolute values of dst_linesize - * and src_linesize, otherwise the function behavior is undefined. - * - * @param dst_linesize linesize for the image plane in dst - * @param src_linesize linesize for the image plane in src -*) -// void av_image_copy_plane(uint8_t *dst, int dst_linesize, -// const uint8_t *src, int src_linesize, -// int bytewidth, int height); - -(* - * Copy image in src_data to dst_data. - * - * @param dst_linesizes linesizes for the image in dst_data - * @param src_linesizes linesizes for the image in src_data -*) -// void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], -// const uint8_t *src_data[4], const int src_linesizes[4], -// enum AVPixelFormat pix_fmt, int width, int height); - -(* - * Setup the data pointers and linesizes based on the specified image - * parameters and the provided array. - * - * The fields of the given image are filled in by using the src - * address which points to the image data buffer. Depending on the - * specified pixel 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 src == NULL to get the required - * size for the src buffer. - * - * To allocate the buffer and fill in the dst_data and dst_linesize in - * one call, use av_image_alloc(). - * - * @param dst_data data pointers to be filled in - * @param dst_linesizes linesizes for the image in dst_data to be filled in - * @param src buffer which will contain or contains the actual image data, can be NULL - * @param pix_fmt the pixel format of the image - * @param width the width of the image in pixels - * @param height the height of the image in pixels - * @param align the value used in src for linesize alignment - * @return the size in bytes required for src, a negative error code - * in case of failure -*) -// int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], -// const uint8_t *src, -// enum AVPixelFormat pix_fmt, int width, int height, int align); - -(* - * Return the size in bytes of the amount of data required to store an - * image with the given parameters. - * - * @param[in] align the assumed linesize alignment -*) -// int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); - -(* - * Copy image data from an image into a buffer. - * - * av_image_get_buffer_size() can be used to compute the required size - * for the buffer to fill. - * - * @param dst a buffer into which picture data will be copied - * @param dst_size the size in bytes of dst - * @param src_data pointers containing the source image data - * @param src_linesizes linesizes for the image in src_data - * @param pix_fmt the pixel format of the source image - * @param width the width of the source image in pixels - * @param height the height of the source image in pixels - * @param align the assumed linesize alignment for dst - * @return the number of bytes written to dst, or a negative value - * (error code) on error -*) -// int av_image_copy_to_buffer(uint8_t *dst, int dst_size, -// const uint8_t * const src_data[4], const int src_linesize[4], -// enum AVPixelFormat pix_fmt, int width, int height, int align); - -(* - * Check if the given dimension of an image is valid, meaning that all - * bytes of the image can be addressed with a signed int. - * - * @param w the width of the picture - * @param h the height of the picture - * @param log_offset the offset to sum to the log level for logging with log_ctx - * @param log_ctx the parent logging context, it may be NULL - * @return >= 0 if valid, a negative error code otherwise -*) -// int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); - -// int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); - -implementation - -uses ffm.lib; - -function av_image_alloc; external avutil_dll; -// function av_image_alloc(Var pointers: TPointers; linesizes: TLinesizes; w: integer; h: integer; pix_fmt: TAVPixelFormat; -// align: integer): integer; overload; cdecl; external avutil_dll name 'av_image_alloc'; -// function av_image_alloc(pointers: pPointers; linesizes: TLinesizes; w: integer; h: integer; pix_fmt: TAVPixelFormat; -// align: integer): integer; overload; cdecl; external avutil_dll name 'av_image_alloc'; - -end. diff --git a/source/ffmpeg/ffm.lib.pas b/source/ffmpeg/ffm.lib.pas deleted file mode 100644 index 55633db..0000000 --- a/source/ffmpeg/ffm.lib.pas +++ /dev/null @@ -1,19 +0,0 @@ -unit ffm.lib; - -{$i ffmpeg.inc} - -interface - -const - avcodec_dll = 'avcodec-57.dll'; - avdevice_all = 'avdevice-57.dll'; - avfilter_dll = 'avfilter-6.dll'; - avformat_dll = 'avformat-57.dll'; - avutil_dll = 'avutil-55.dll'; - postproc_dll = 'postproc-54.dll'; - swresample_dll = 'swresample-2.dll'; - swscale_dll = 'swscale-4.dll'; - -implementation - -end. diff --git a/source/ffmpeg/ffm.libavcodec.avcodec.pas b/source/ffmpeg/ffm.libavcodec.avcodec.pas deleted file mode 100644 index 8297437..0000000 --- a/source/ffmpeg/ffm.libavcodec.avcodec.pas +++ /dev/null @@ -1,5137 +0,0 @@ -(* - * copyright (c) 2001 Fabrice Bellard - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.libavcodec.avcodec; - -{$i ffmpeg.inc} - -interface - -uses - ffm.ctypes, ffm.buffer, ffm.frame, ffm.log, ffm.rational, ffm.avutil, ffm.pixfmt, ffm.samplefmt, ffm.dict; -(* - * @defgroup lavc_core Core functions/structures. - * @ingroup libavc - * - * Basic definitions, functions for querying libavcodec capabilities, - * allocating core structures, etc. - * @{ -*) - -(* - * 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. Give it a value which when taken as ASCII is recognized uniquely by a human as this specific codec. - * This ensures that 2 forks can independently add AVCodecIDs without producing conflicts. - * - * After adding new codec IDs, do not forget to add an entry to the codec - * descriptor list and bump libavcodec minor version. -*) - -Const - FF_COMPRESSION_DEFAULT = -1; -{$IFDEF FF_API_ASPECT_EXTENDED} - FF_ASPECT_EXTENDED = 15; -{$ENDIF} - FF_RC_STRATEGY_XVID = 1; - - FF_PRED_LEFT = 0; - FF_PRED_PLANE = 1; - FF_PRED_MEDIAN = 2; - - 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; - - 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_CODER_TYPE_VLC = 0; - FF_CODER_TYPE_AC = 1; - FF_CODER_TYPE_RAW = 2; - FF_CODER_TYPE_RLE = 3; - FF_CODER_TYPE_DEFLATE = 4; - - FF_BUG_AUTODETECT = 1; - /// < autodetection -{$IFDEF FF_API_OLD_MSMPEG4} - FF_BUG_OLD_MSMPEG4 = 2; -{$ENDIF} - FF_BUG_XVID_ILACE = 4; - FF_BUG_UMP4 = 8; - FF_BUG_NO_PADDING = 16; - FF_BUG_AMV = 32; -{$IFDEF FF_API_AC_VLC} - F_BUG_AC_VLC = 0; - /// < Will be removed, libavcodec can now handle these non-compliant files by default. -{$ENDIF} - 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; - /// < Work around various bugs in Microsoft's broken decoders. - FF_BUG_TRUNCATED = 16384; - - 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; - FF_COMPLIANCE_UNOFFICIAL = -1; - /// < Allow unofficial extensions - FF_COMPLIANCE_EXPERIMENTAL = -2; - /// < Allow nonstandardized experimental things. - - FF_EC_GUESS_MVS = 1; - FF_EC_DEBLOCK = 2; - - FF_DEBUG_PICT_INFO = 1; - FF_DEBUG_RC = 2; - FF_DEBUG_BITSTREAM = 4; - FF_DEBUG_MB_TYPE = 8; - FF_DEBUG_QP = 16; -{$IFDEF FF_API_DEBUG_MV} - (* - * @deprecated this option does nothing - *) - FF_DEBUG_MV = 32; -{$ENDIF} - 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; -{$IFDEF FF_API_DEBUG_MV} - FF_DEBUG_VIS_QP = $00002000; - /// < only access through AVOptions from outside libavcodec - FF_DEBUG_VIS_MB_TYPE = $00004000; - /// < only access through AVOptions from outside libavcodec -{$ENDIF} - FF_DEBUG_BUFFERS = $00008000; - FF_DEBUG_THREADS = $00010000; - -{$IFDEF FF_API_DEBUG_MV} - 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 -{$ENDIF} - AV_EF_CRCCHECK = (1 shl 0); - AV_EF_BITSTREAM = (1 shl 1); - /// < detect bitstream specification deviations - AV_EF_BUFFER = (1 shl 2); - /// < detect improper bitstream length - AV_EF_EXPLODE = (1 shl 3); - /// < abort decoding on minor error detection - - AV_EF_CAREFUL = (1 shl 16); - /// < consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors - AV_EF_COMPLIANT = (1 shl 17); - /// < consider all spec non compliancies as errors - AV_EF_AGGRESSIVE = (1 shl 18); - /// < consider things that a sane encoder should not do as an error - - FF_DCT_AUTO = 0; - FF_DCT_FASTINT = 1; - FF_DCT_INT = 2; - FF_DCT_MMX = 3; - 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_ARM = 7; - FF_IDCT_ALTIVEC = 8; - FF_IDCT_SH4 = 9; - FF_IDCT_SIMPLEARM = 10; - FF_IDCT_IPP = 13; - FF_IDCT_XVIDMMX = 14; - FF_IDCT_SIMPLEARMV5TE = 16; - FF_IDCT_SIMPLEARMV6 = 17; - FF_IDCT_SIMPLEVIS = 18; - FF_IDCT_FAAN = 20; - FF_IDCT_SIMPLENEON = 22; -{$IFDEF FF_API_ARCH_ALPHA} - FF_IDCT_SIMPLEALPHA = 23; -{$ENDIF} - FF_THREAD_FRAME = 1; - /// < Decode more than one frame at once - FF_THREAD_SLICE = 2; - /// < Decode more than one part of a single frame at once - - FF_PROFILE_UNKNOWN = -99; - FF_PROFILE_RESERVED = -100; - // - FF_PROFILE_AAC_MAIN = 0; - FF_PROFILE_AAC_LOW = 1; - FF_PROFILE_AAC_SSR = 2; - FF_PROFILE_AAC_LTP = 3; - FF_PROFILE_AAC_HE = 4; - FF_PROFILE_AAC_HE_V2 = 28; - FF_PROFILE_AAC_LD = 22; - FF_PROFILE_AAC_ELD = 38; - FF_PROFILE_MPEG2_AAC_LOW = 128; - FF_PROFILE_MPEG2_AAC_HE = 131; - // - FF_PROFILE_DTS = 20; - FF_PROFILE_DTS_ES = 30; - FF_PROFILE_DTS_96_24 = 40; - FF_PROFILE_DTS_HD_HRA = 50; - FF_PROFILE_DTS_HD_MA = 60; - // - FF_PROFILE_MPEG2_422 = 0; - FF_PROFILE_MPEG2_HIGH = 1; - FF_PROFILE_MPEG2_SS = 2; - FF_PROFILE_MPEG2_SNR_SCALABLE = 3; - FF_PROFILE_MPEG2_MAIN = 4; - FF_PROFILE_MPEG2_SIMPLE = 5; - // - FF_PROFILE_H264_CONSTRAINED = (1 shl 9); // 8+1; constraint_set1_flag - FF_PROFILE_H264_INTRA = (1 shl 11); // 8+3; constraint_set3_flag - // - FF_PROFILE_H264_BASELINE = 66; - FF_PROFILE_H264_CONSTRAINED_BASELINE = (66 or FF_PROFILE_H264_CONSTRAINED); - FF_PROFILE_H264_MAIN = 77; - FF_PROFILE_H264_EXTENDED = 88; - FF_PROFILE_H264_HIGH = 100; - FF_PROFILE_H264_HIGH_10 = 110; - FF_PROFILE_H264_HIGH_10_INTRA = (110 or FF_PROFILE_H264_INTRA); - FF_PROFILE_H264_HIGH_422 = 122; - FF_PROFILE_H264_HIGH_422_INTRA = (122 or FF_PROFILE_H264_INTRA); - FF_PROFILE_H264_HIGH_444 = 144; - FF_PROFILE_H264_HIGH_444_PREDICTIVE = 244; - FF_PROFILE_H264_HIGH_444_INTRA = (244 or FF_PROFILE_H264_INTRA); - FF_PROFILE_H264_CAVLC_444 = 44; - // - FF_PROFILE_VC1_SIMPLE = 0; - FF_PROFILE_VC1_MAIN = 1; - FF_PROFILE_VC1_COMPLEX = 2; - FF_PROFILE_VC1_ADVANCED = 3; - // - FF_PROFILE_MPEG4_SIMPLE = 0; - FF_PROFILE_MPEG4_SIMPLE_SCALABLE = 1; - FF_PROFILE_MPEG4_CORE = 2; - FF_PROFILE_MPEG4_MAIN = 3; - FF_PROFILE_MPEG4_N_BIT = 4; - FF_PROFILE_MPEG4_SCALABLE_TEXTURE = 5; - FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION = 6; - FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE = 7; - FF_PROFILE_MPEG4_HYBRID = 8; - FF_PROFILE_MPEG4_ADVANCED_REAL_TIME = 9; - FF_PROFILE_MPEG4_CORE_SCALABLE = 10; - FF_PROFILE_MPEG4_ADVANCED_CODING = 11; - FF_PROFILE_MPEG4_ADVANCED_CORE = 12; - FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE = 13; - FF_PROFILE_MPEG4_SIMPLE_STUDIO = 14; - FF_PROFILE_MPEG4_ADVANCED_SIMPLE = 15; - // - FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 = 0; - FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 = 1; - FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION = 2; - FF_PROFILE_JPEG2000_DCINEMA_2K = 3; - FF_PROFILE_JPEG2000_DCINEMA_4K = 4; - - FF_LEVEL_UNKNOWN = -99; - - FF_SUB_CHARENC_MODE_DO_NOTHING = -1; - /// < do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) - FF_SUB_CHARENC_MODE_AUTOMATIC = 0; - /// < libavcodec will select the mode itself - FF_SUB_CHARENC_MODE_PRE_DECODER = 1; - /// < the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv - -{$IFNDEF FF_API_DEBUG_MV} - 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 -{$ENDIF} - // - - AV_PARSER_PTS_NB = 4; - PARSER_FLAG_COMPLETE_FRAMES = $0001; - PARSER_FLAG_ONCE = $0002; - // Set if the parser has a valid file offset - PARSER_FLAG_FETCHED_OFFSET = $0004; - PARSER_FLAG_USE_CODEC_TS = $1000; - -Type - - TAVCodecID = ( // - AV_CODEC_ID_NONE, // - (* video codecs *) - AV_CODEC_ID_MPEG1VIDEO, // - AV_CODEC_ID_MPEG2VIDEO, // - /// < preferred ID for MPEG-1/2 video decoding -{$IFDEF FF_API_XVMC} - AV_CODEC_ID_MPEG2VIDEO_XVMC, // -{$ENDIF}// FF_API_XVMC *) - AV_CODEC_ID_H261, // - AV_CODEC_ID_H263, // - AV_CODEC_ID_RV10, // - AV_CODEC_ID_RV20, // - AV_CODEC_ID_MJPEG, // - AV_CODEC_ID_MJPEGB, // - AV_CODEC_ID_LJPEG, // - AV_CODEC_ID_SP5X, // - AV_CODEC_ID_JPEGLS, // - AV_CODEC_ID_MPEG4, // - AV_CODEC_ID_RAWVIDEO, // - AV_CODEC_ID_MSMPEG4V1, // - AV_CODEC_ID_MSMPEG4V2, // - AV_CODEC_ID_MSMPEG4V3, // - AV_CODEC_ID_WMV1, // - AV_CODEC_ID_WMV2, // - AV_CODEC_ID_H263P, // - AV_CODEC_ID_H263I, // - AV_CODEC_ID_FLV1, // - AV_CODEC_ID_SVQ1, // - AV_CODEC_ID_SVQ3, // - AV_CODEC_ID_DVVIDEO, // - AV_CODEC_ID_HUFFYUV, // - AV_CODEC_ID_CYUV, // - AV_CODEC_ID_H264, // - AV_CODEC_ID_INDEO3, // - AV_CODEC_ID_VP3, // - AV_CODEC_ID_THEORA, // - AV_CODEC_ID_ASV1, // - AV_CODEC_ID_ASV2, // - AV_CODEC_ID_FFV1, // - AV_CODEC_ID_4XM, // - AV_CODEC_ID_VCR1, // - AV_CODEC_ID_CLJR, // - AV_CODEC_ID_MDEC, // - AV_CODEC_ID_ROQ, // - AV_CODEC_ID_INTERPLAY_VIDEO, // - AV_CODEC_ID_XAN_WC3, // - AV_CODEC_ID_XAN_WC4, // - AV_CODEC_ID_RPZA, // - AV_CODEC_ID_CINEPAK, // - AV_CODEC_ID_WS_VQA, // - AV_CODEC_ID_MSRLE, // - AV_CODEC_ID_MSVIDEO1, // - AV_CODEC_ID_IDCIN, // - AV_CODEC_ID_8BPS, // - AV_CODEC_ID_SMC, // - AV_CODEC_ID_FLIC, // - AV_CODEC_ID_TRUEMOTION1, // - AV_CODEC_ID_VMDVIDEO, // - AV_CODEC_ID_MSZH, // - AV_CODEC_ID_ZLIB, // - AV_CODEC_ID_QTRLE, // - AV_CODEC_ID_TSCC, // - AV_CODEC_ID_ULTI, // - AV_CODEC_ID_QDRAW, // - AV_CODEC_ID_VIXL, // - AV_CODEC_ID_QPEG, // - AV_CODEC_ID_PNG, // - AV_CODEC_ID_PPM, // - AV_CODEC_ID_PBM, // - AV_CODEC_ID_PGM, // - AV_CODEC_ID_PGMYUV, // - AV_CODEC_ID_PAM, // - AV_CODEC_ID_FFVHUFF, // - AV_CODEC_ID_RV30, // - AV_CODEC_ID_RV40, // - AV_CODEC_ID_VC1, // - AV_CODEC_ID_WMV3, // - AV_CODEC_ID_LOCO, // - AV_CODEC_ID_WNV1, // - AV_CODEC_ID_AASC, // - AV_CODEC_ID_INDEO2, // - AV_CODEC_ID_FRAPS, // - AV_CODEC_ID_TRUEMOTION2, // - AV_CODEC_ID_BMP, // - AV_CODEC_ID_CSCD, // - AV_CODEC_ID_MMVIDEO, // - AV_CODEC_ID_ZMBV, // - AV_CODEC_ID_AVS, // - AV_CODEC_ID_SMACKVIDEO, // - AV_CODEC_ID_NUV, // - AV_CODEC_ID_KMVC, // - AV_CODEC_ID_FLASHSV, // - AV_CODEC_ID_CAVS, // - AV_CODEC_ID_JPEG2000, // - AV_CODEC_ID_VMNC, // - AV_CODEC_ID_VP5, // - AV_CODEC_ID_VP6, // - AV_CODEC_ID_VP6F, // - AV_CODEC_ID_TARGA, // - AV_CODEC_ID_DSICINVIDEO, // - AV_CODEC_ID_TIERTEXSEQVIDEO, // - AV_CODEC_ID_TIFF, // - AV_CODEC_ID_GIF, // - AV_CODEC_ID_DXA, // - AV_CODEC_ID_DNXHD, // - AV_CODEC_ID_THP, // - AV_CODEC_ID_SGI, // - AV_CODEC_ID_C93, // - AV_CODEC_ID_BETHSOFTVID, // - AV_CODEC_ID_PTX, // - AV_CODEC_ID_TXD, // - AV_CODEC_ID_VP6A, // - AV_CODEC_ID_AMV, // - AV_CODEC_ID_VB, // - AV_CODEC_ID_PCX, // - AV_CODEC_ID_SUNRAST, // - AV_CODEC_ID_INDEO4, // - AV_CODEC_ID_INDEO5, // - AV_CODEC_ID_MIMIC, // - AV_CODEC_ID_RL2, // - AV_CODEC_ID_ESCAPE124, // - AV_CODEC_ID_DIRAC, // - AV_CODEC_ID_BFI, // - AV_CODEC_ID_CMV, // - AV_CODEC_ID_MOTIONPIXELS, // - AV_CODEC_ID_TGV, // - AV_CODEC_ID_TGQ, // - AV_CODEC_ID_TQI, // - AV_CODEC_ID_AURA, // - AV_CODEC_ID_AURA2, // - AV_CODEC_ID_V210X, // - AV_CODEC_ID_TMV, // - AV_CODEC_ID_V210, // - AV_CODEC_ID_DPX, // - AV_CODEC_ID_MAD, // - AV_CODEC_ID_FRWU, // - AV_CODEC_ID_FLASHSV2, // - AV_CODEC_ID_CDGRAPHICS, // - AV_CODEC_ID_R210, // - AV_CODEC_ID_ANM, // - AV_CODEC_ID_BINKVIDEO, // - AV_CODEC_ID_IFF_ILBM, // - AV_CODEC_ID_IFF_BYTERUN1, // - AV_CODEC_ID_KGV1, // - AV_CODEC_ID_YOP, // - AV_CODEC_ID_VP8, // - AV_CODEC_ID_PICTOR, // - AV_CODEC_ID_ANSI, // - AV_CODEC_ID_A64_MULTI, // - AV_CODEC_ID_A64_MULTI5, // - AV_CODEC_ID_R10K, // - AV_CODEC_ID_MXPEG, // - AV_CODEC_ID_LAGARITH, // - AV_CODEC_ID_PRORES, // - AV_CODEC_ID_JV, // - AV_CODEC_ID_DFA, // - AV_CODEC_ID_WMV3IMAGE, // - AV_CODEC_ID_VC1IMAGE, // - AV_CODEC_ID_UTVIDEO, // - AV_CODEC_ID_BMV_VIDEO, // - AV_CODEC_ID_VBLE, // - AV_CODEC_ID_DXTORY, // - AV_CODEC_ID_V410, // - AV_CODEC_ID_XWD, // - AV_CODEC_ID_CDXL, // - AV_CODEC_ID_XBM, // - AV_CODEC_ID_ZEROCODEC, // - AV_CODEC_ID_MSS1, // - AV_CODEC_ID_MSA1, // - AV_CODEC_ID_TSCC2, // - AV_CODEC_ID_MTS2, // - AV_CODEC_ID_CLLC, // - AV_CODEC_ID_MSS2, // - AV_CODEC_ID_VP9, // - AV_CODEC_ID_AIC, // - AV_CODEC_ID_ESCAPE130_DEPRECATED, // - AV_CODEC_ID_G2M_DEPRECATED, // - AV_CODEC_ID_WEBP_DEPRECATED, // - AV_CODEC_ID_HNM4_VIDEO, // - AV_CODEC_ID_HEVC_DEPRECATED, // - // - // AV_CODEC_ID_BRENDER_PIX = $42504958, // MKBETAG('B','P','I','X'), - // AV_CODEC_ID_Y41P = $59343150, // MKBETAG('Y','4','1','P'), - // AV_CODEC_ID_ESCAPE130 = $45313330, // MKBETAG('E','1','3','0'), - // AV_CODEC_ID_EXR = $30455852, // MKBETAG('0','E','X','R'), - // AV_CODEC_ID_AVRP = $41565250, // MKBETAG('A','V','R','P'), - // // - // AV_CODEC_ID_012V = $30313256, // MKBETAG('0','1','2','V'), - // AV_CODEC_ID_G2M = $3047324D, // MKBETAG( 0 ,'G','2','M'), - // AV_CODEC_ID_AVUI = $41565549, // MKBETAG('A','V','U','I'), - // AV_CODEC_ID_AYUV = $41595556, // MKBETAG('A','Y','U','V'), - // AV_CODEC_ID_TARGA_Y216 = $54323136, // MKBETAG('T','2','1','6'), - // AV_CODEC_ID_V308 = $56333038, // MKBETAG('V','3','0','8'), - // AV_CODEC_ID_V408 = $56343038, // MKBETAG('V','4','0','8'), - // AV_CODEC_ID_YUV4 = $59555634, // MKBETAG('Y','U','V','4'), - // AV_CODEC_ID_SANM = $53414E4D, // MKBETAG('S','A','N','M'), - // AV_CODEC_ID_PAF_VIDEO = $50414656, // MKBETAG('P','A','F','V'), - // AV_CODEC_ID_AVRN = $4156526E, // MKBETAG('A','V','R','n'), - // AV_CODEC_ID_CPIA = $43504941, // MKBETAG('C','P','I','A'), - // AV_CODEC_ID_XFACE = $58464143, // MKBETAG('X','F','A','C'), - // AV_CODEC_ID_SGIRLE = $53474952, // MKBETAG('S','G','I','R'), - // AV_CODEC_ID_MVC1 = $4D564331, // MKBETAG('M','V','C','1'), - // AV_CODEC_ID_MVC2 = $4D564332, // MKBETAG('M','V','C','2'), - // AV_CODEC_ID_SNOW = $534E4F57, // MKBETAG('S','N','O','W'), - // AV_CODEC_ID_WEBP = $57454250, // MKBETAG('W','E','B','P'), - // AV_CODEC_ID_SMVJPEG = $534D564A, // MKBETAG('S','M','V','J'), - // AV_CODEC_ID_HEVC = $48323635, // MKBETAG('H','2','6','5'), - // * various PCM "codecs" *) - // AV_CODEC_ID_FIRST_AUDIO = $10000, // < A dummy id pointing at the start of audio codecs - AV_CODEC_ID_PCM_S16LE = $10000, // - AV_CODEC_ID_PCM_S16BE, // - AV_CODEC_ID_PCM_U16LE, // - AV_CODEC_ID_PCM_U16BE, // - AV_CODEC_ID_PCM_S8, // - AV_CODEC_ID_PCM_U8, // - AV_CODEC_ID_PCM_MULAW, // - AV_CODEC_ID_PCM_ALAW, // - AV_CODEC_ID_PCM_S32LE, // - AV_CODEC_ID_PCM_S32BE, // - AV_CODEC_ID_PCM_U32LE, // - AV_CODEC_ID_PCM_U32BE, // - AV_CODEC_ID_PCM_S24LE, // - AV_CODEC_ID_PCM_S24BE, // - AV_CODEC_ID_PCM_U24LE, // - AV_CODEC_ID_PCM_U24BE, // - AV_CODEC_ID_PCM_S24DAUD, // - AV_CODEC_ID_PCM_ZORK, // - AV_CODEC_ID_PCM_S16LE_PLANAR, // - AV_CODEC_ID_PCM_DVD, // - AV_CODEC_ID_PCM_F32BE, // - AV_CODEC_ID_PCM_F32LE, // - AV_CODEC_ID_PCM_F64BE, // - AV_CODEC_ID_PCM_F64LE, // - AV_CODEC_ID_PCM_BLURAY, // - AV_CODEC_ID_PCM_LXF, // - AV_CODEC_ID_S302M, // - AV_CODEC_ID_PCM_S8_PLANAR, // - AV_CODEC_ID_PCM_S24LE_PLANAR_DEPRECATED, // - AV_CODEC_ID_PCM_S32LE_PLANAR_DEPRECATED, // - // AV_CODEC_ID_PCM_S24LE_PLANAR = $18505350, // MKBETAG(24,'P','S','P'), - // AV_CODEC_ID_PCM_S32LE_PLANAR = $20505350, // MKBETAG(32,'P','S','P'), - // AV_CODEC_ID_PCM_S16BE_PLANAR = $50535010, // MKBETAG('P','S','P',16), - - // * various ADPCM codecs *) - AV_CODEC_ID_ADPCM_IMA_QT = $11000, // - AV_CODEC_ID_ADPCM_IMA_WAV, // - AV_CODEC_ID_ADPCM_IMA_DK3, // - AV_CODEC_ID_ADPCM_IMA_DK4, // - AV_CODEC_ID_ADPCM_IMA_WS, // - AV_CODEC_ID_ADPCM_IMA_SMJPEG, // - AV_CODEC_ID_ADPCM_MS, // - AV_CODEC_ID_ADPCM_4XM, // - AV_CODEC_ID_ADPCM_XA, // - AV_CODEC_ID_ADPCM_ADX, // - AV_CODEC_ID_ADPCM_EA, // - AV_CODEC_ID_ADPCM_G726, // - AV_CODEC_ID_ADPCM_CT, // - AV_CODEC_ID_ADPCM_SWF, // - AV_CODEC_ID_ADPCM_YAMAHA, // - AV_CODEC_ID_ADPCM_SBPRO_4, // - AV_CODEC_ID_ADPCM_SBPRO_3, // - AV_CODEC_ID_ADPCM_SBPRO_2, // - AV_CODEC_ID_ADPCM_THP, // - AV_CODEC_ID_ADPCM_IMA_AMV, // - AV_CODEC_ID_ADPCM_EA_R1, // - AV_CODEC_ID_ADPCM_EA_R3, // - AV_CODEC_ID_ADPCM_EA_R2, // - AV_CODEC_ID_ADPCM_IMA_EA_SEAD, // - AV_CODEC_ID_ADPCM_IMA_EA_EACS, // - AV_CODEC_ID_ADPCM_EA_XAS, // - AV_CODEC_ID_ADPCM_EA_MAXIS_XA, // - AV_CODEC_ID_ADPCM_IMA_ISS, // - AV_CODEC_ID_ADPCM_G722, // - AV_CODEC_ID_ADPCM_IMA_APC, // - // AV_CODEC_ID_VIMA = $56494D41, // MKBETAG('V','I','M','A'), - // AV_CODEC_ID_ADPCM_AFC = $41464320, // MKBETAG('A','F','C',' '), - // AV_CODEC_ID_ADPCM_IMA_OKI = $4F4B4920, // MKBETAG('O','K','I',' '), - // AV_CODEC_ID_ADPCM_DTK = $44544B20, // MKBETAG('D','T','K',' '), - // AV_CODEC_ID_ADPCM_IMA_RAD = $52414420, // MKBETAG('R','A','D',' '), - // AV_CODEC_ID_ADPCM_G726LE = $36323736, // MKBETAG('6','2','7','G'), - // - // * AMR * / - AV_CODEC_ID_AMR_NB = $12000, // - AV_CODEC_ID_AMR_WB, // - // - // * RealAudio codecs * / // - AV_CODEC_ID_RA_144 = $13000, // - AV_CODEC_ID_RA_288, // - // - // * various DPCM codecs * / // - AV_CODEC_ID_ROQ_DPCM = $14000, // - AV_CODEC_ID_INTERPLAY_DPCM, // - AV_CODEC_ID_XAN_DPCM, // - AV_CODEC_ID_SOL_DPCM, // - // - // * audio codecs * / // - AV_CODEC_ID_MP2 = $15000, // - AV_CODEC_ID_MP3, - /// < preferred ID for decoding MPEG audio layer 1, 2 or 3 - AV_CODEC_ID_AAC, // - AV_CODEC_ID_AC3, // - AV_CODEC_ID_DTS, // - AV_CODEC_ID_VORBIS, // - AV_CODEC_ID_DVAUDIO, // - AV_CODEC_ID_WMAV1, // - AV_CODEC_ID_WMAV2, // - AV_CODEC_ID_MACE3, // - AV_CODEC_ID_MACE6, // - AV_CODEC_ID_VMDAUDIO, // - AV_CODEC_ID_FLAC, // - AV_CODEC_ID_MP3ADU, // - AV_CODEC_ID_MP3ON4, // - AV_CODEC_ID_SHORTEN, // - AV_CODEC_ID_ALAC, // - AV_CODEC_ID_WESTWOOD_SND1, // - AV_CODEC_ID_GSM, - /// < as in Berlin toast format - AV_CODEC_ID_QDM2, // - AV_CODEC_ID_COOK, // - AV_CODEC_ID_TRUESPEECH, // - AV_CODEC_ID_TTA, // - AV_CODEC_ID_SMACKAUDIO, // - AV_CODEC_ID_QCELP, // - AV_CODEC_ID_WAVPACK, // - AV_CODEC_ID_DSICINAUDIO, // - AV_CODEC_ID_IMC, // - AV_CODEC_ID_MUSEPACK7, // - AV_CODEC_ID_MLP, // - AV_CODEC_ID_GSM_MS, // * as found in WAV * / // - AV_CODEC_ID_ATRAC3, // -{$IFDEF FF_API_VOXWARE} - AV_CODEC_ID_VOXWARE, // -{$ENDIF} - AV_CODEC_ID_APE, // - AV_CODEC_ID_NELLYMOSER, // - AV_CODEC_ID_MUSEPACK8, // - AV_CODEC_ID_SPEEX, // - AV_CODEC_ID_WMAVOICE, // - AV_CODEC_ID_WMAPRO, // - AV_CODEC_ID_WMALOSSLESS, // - AV_CODEC_ID_ATRAC3P, // - AV_CODEC_ID_EAC3, // - AV_CODEC_ID_SIPR, // - AV_CODEC_ID_MP1, // - AV_CODEC_ID_TWINVQ, // - AV_CODEC_ID_TRUEHD, // - AV_CODEC_ID_MP4ALS, // - AV_CODEC_ID_ATRAC1, // - AV_CODEC_ID_BINKAUDIO_RDFT, // - AV_CODEC_ID_BINKAUDIO_DCT, // - AV_CODEC_ID_AAC_LATM, // - AV_CODEC_ID_QDMC, // - AV_CODEC_ID_CELT, // - AV_CODEC_ID_G723_1, // - AV_CODEC_ID_G729, // - AV_CODEC_ID_8SVX_EXP, // - AV_CODEC_ID_8SVX_FIB, // - AV_CODEC_ID_BMV_AUDIO, // - AV_CODEC_ID_RALF, // - AV_CODEC_ID_IAC, // - AV_CODEC_ID_ILBC, // - AV_CODEC_ID_OPUS_DEPRECATED, // - AV_CODEC_ID_COMFORT_NOISE, // - AV_CODEC_ID_TAK_DEPRECATED, // - AV_CODEC_ID_METASOUND, // - // AV_CODEC_ID_FFWAVESYNTH = $46465753, // MKBETAG('F','F','W','S'), - // AV_CODEC_ID_SONIC = $534F4E43, // MKBETAG('S','O','N','C'), - // AV_CODEC_ID_SONIC_LS = $534F4E4C, // MKBETAG('S','O','N','L'), - // AV_CODEC_ID_PAF_AUDIO = $50414641, // MKBETAG('P','A','F','A'), - // AV_CODEC_ID_OPUS = $4F505553, // MKBETAG('O','P','U','S'), - // AV_CODEC_ID_TAK = $7442614B, // MKBETAG('t','B','a','K'), - // AV_CODEC_ID_EVRC = $73657663, // MKBETAG('s','e','v','c'), - // AV_CODEC_ID_SMV = $73736D76, // MKBETAG('s','s','m','v'), - - // * subtitle codecs *) - // AV_CODEC_ID_FIRST_SUBTITLE = $17000, // < A dummy ID pointing at the start of subtitle codecs. - AV_CODEC_ID_DVD_SUBTITLE = $17000, // - AV_CODEC_ID_DVB_SUBTITLE, // - AV_CODEC_ID_TEXT, // < raw UTF-8 text - AV_CODEC_ID_XSUB, // - AV_CODEC_ID_SSA, // - AV_CODEC_ID_MOV_TEXT, // - AV_CODEC_ID_HDMV_PGS_SUBTITLE, // - AV_CODEC_ID_DVB_TELETEXT, // - AV_CODEC_ID_SRT, // - // AV_CODEC_ID_MICRODVD = $6D445644, // MKBETAG('m','D','V','D'), - // AV_CODEC_ID_EIA_608 = $63363038, // MKBETAG('c','6','0','8'), - // AV_CODEC_ID_JACOSUB = $4A535542, // MKBETAG('J','S','U','B'), - // AV_CODEC_ID_SAMI = $53414D49, // MKBETAG('S','A','M','I'), - // AV_CODEC_ID_REALTEXT = $52545854, // MKBETAG('R','T','X','T'), - // AV_CODEC_ID_SUBVIEWER1 = $53625631, // MKBETAG('S','b','V','1'), - // AV_CODEC_ID_SUBVIEWER = $53756256, // MKBETAG('S','u','b','V'), - // AV_CODEC_ID_SUBRIP = $53526970, // MKBETAG('S','R','i','p'), - // AV_CODEC_ID_WEBVTT = $57565454, // MKBETAG('W','V','T','T'), - // AV_CODEC_ID_MPL2 = $4D504C32, // MKBETAG('M','P','L','2'), - // AV_CODEC_ID_VPLAYER = $56506C72, // MKBETAG('V','P','l','r'), - // AV_CODEC_ID_PJS = $50684A53, // MKBETAG('P','h','J','S'), - // AV_CODEC_ID_ASS = $41535320, // MKBETAG('A','S','S',' '), //< ASS as defined in Matroska - - // * other specific kind of codecs (generally used for attachments) *) - // AV_CODEC_ID_FIRST_UNKNOWN = $18000, // < A dummy ID pointing at the start of various fake codecs. - AV_CODEC_ID_TTF = $18000, // - // AV_CODEC_ID_BINTEXT = $42545854, // MKBETAG('B','T','X','T'), - // AV_CODEC_ID_XBIN = $5842494E, // MKBETAG('X','B','I','N'), - // AV_CODEC_ID_IDF = $30494446, // MKBETAG( 0 ,'I','D','F'), - // AV_CODEC_ID_OTF = $304F5446, // MKBETAG( 0 ,'O','T','F'), - // AV_CODEC_ID_SMPTE_KLV = $4B4C5641, // MKBETAG('K','L','V','A'), - // AV_CODEC_ID_DVD_NAV = $444E4156, // MKBETAG('D','N','A','V'), - - AV_CODEC_ID_PROBE = $19000, - // < codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it - - AV_CODEC_ID_MPEG2TS = $20000, // **< _FAKE_ codec to indicate a raw MPEG-2 TS - // * stream (only used by libavformat) *) - AV_CODEC_ID_MPEG4SYSTEMS = $20001, // **< _FAKE_ codec to indicate a MPEG-4 Systems - // * stream (only used by libavformat) *) - AV_CODEC_ID_FFMETADATA = $21000, // < Dummy codec for streams containing only metadata information. - - // ------------------------------------- - AV_CODEC_ID_PCM_S24LE_PLANAR = $18505350, // MKBETAG(24,'P','S','P'), - AV_CODEC_ID_PCM_S32LE_PLANAR = $20505350, // MKBETAG(32,'P','S','P'), - AV_CODEC_ID_012V = $30313256, // MKBETAG('0','1','2','V'), - AV_CODEC_ID_EXR = $30455852, // MKBETAG('0','E','X','R'), - AV_CODEC_ID_G2M = $3047324D, // MKBETAG( 0 ,'G','2','M'), - AV_CODEC_ID_IDF = $30494446, // MKBETAG( 0 ,'I','D','F'), - AV_CODEC_ID_OTF = $304F5446, // MKBETAG( 0 ,'O','T','F'), - AV_CODEC_ID_ADPCM_G726LE = $36323736, // MKBETAG('6','2','7','G'), - AV_CODEC_ID_ADPCM_AFC = $41464320, // MKBETAG('A','F','C',' '), - AV_CODEC_ID_ASS = $41535320, // MKBETAG('A','S','S',' '), //< ASS as defined in Matroska - AV_CODEC_ID_AVRP = $41565250, // MKBETAG('A','V','R','P'), - AV_CODEC_ID_AVRN = $4156526E, // MKBETAG('A','V','R','n'), - AV_CODEC_ID_AVUI = $41565549, // MKBETAG('A','V','U','I'), - AV_CODEC_ID_AYUV = $41595556, // MKBETAG('A','Y','U','V'), - AV_CODEC_ID_BRENDER_PIX = $42504958, // MKBETAG('B','P','I','X'), - AV_CODEC_ID_BINTEXT = $42545854, // MKBETAG('B','T','X','T'), - AV_CODEC_ID_CPIA = $43504941, // MKBETAG('C','P','I','A'), - AV_CODEC_ID_DVD_NAV = $444E4156, // MKBETAG('D','N','A','V'), - AV_CODEC_ID_ADPCM_DTK = $44544B20, // MKBETAG('D','T','K',' '), - AV_CODEC_ID_ESCAPE130 = $45313330, // MKBETAG('E','1','3','0'), - AV_CODEC_ID_FFWAVESYNTH = $46465753, // MKBETAG('F','F','W','S'), - AV_CODEC_ID_HEVC = $48323635, // MKBETAG('H','2','6','5'), - AV_CODEC_ID_JACOSUB = $4A535542, // MKBETAG('J','S','U','B'), - AV_CODEC_ID_SMPTE_KLV = $4B4C5641, // MKBETAG('K','L','V','A'), - AV_CODEC_ID_MPL2 = $4D504C32, // MKBETAG('M','P','L','2'), - AV_CODEC_ID_MVC1 = $4D564331, // MKBETAG('M','V','C','1'), - AV_CODEC_ID_MVC2 = $4D564332, // MKBETAG('M','V','C','2'), - AV_CODEC_ID_ADPCM_IMA_OKI = $4F4B4920, // MKBETAG('O','K','I',' '), - AV_CODEC_ID_OPUS = $4F505553, // MKBETAG('O','P','U','S'), - AV_CODEC_ID_PAF_AUDIO = $50414641, // MKBETAG('P','A','F','A'), - AV_CODEC_ID_PAF_VIDEO = $50414656, // MKBETAG('P','A','F','V'), - AV_CODEC_ID_PCM_S16BE_PLANAR = $50535010, // MKBETAG('P','S','P',16), - AV_CODEC_ID_PJS = $50684A53, // MKBETAG('P','h','J','S'), - AV_CODEC_ID_ADPCM_IMA_RAD = $52414420, // MKBETAG('R','A','D',' '), - AV_CODEC_ID_REALTEXT = $52545854, // MKBETAG('R','T','X','T'), - AV_CODEC_ID_SAMI = $53414D49, // MKBETAG('S','A','M','I'), - AV_CODEC_ID_SANM = $53414E4D, // MKBETAG('S','A','N','M'), - AV_CODEC_ID_SGIRLE = $53474952, // MKBETAG('S','G','I','R'), - AV_CODEC_ID_SMVJPEG = $534D564A, // MKBETAG('S','M','V','J'), - AV_CODEC_ID_SNOW = $534E4F57, // MKBETAG('S','N','O','W'), - AV_CODEC_ID_SONIC = $534F4E43, // MKBETAG('S','O','N','C'), - AV_CODEC_ID_SONIC_LS = $534F4E4C, // MKBETAG('S','O','N','L'), - AV_CODEC_ID_SUBRIP = $53526970, // MKBETAG('S','R','i','p'), - AV_CODEC_ID_SUBVIEWER1 = $53625631, // MKBETAG('S','b','V','1'), - AV_CODEC_ID_SUBVIEWER = $53756256, // MKBETAG('S','u','b','V'), - AV_CODEC_ID_TARGA_Y216 = $54323136, // MKBETAG('T','2','1','6'), - AV_CODEC_ID_V308 = $56333038, // MKBETAG('V','3','0','8'), - AV_CODEC_ID_V408 = $56343038, // MKBETAG('V','4','0','8'), - AV_CODEC_ID_VIMA = $56494D41, // MKBETAG('V','I','M','A'), - AV_CODEC_ID_VPLAYER = $56506C72, // MKBETAG('V','P','l','r'), - AV_CODEC_ID_WEBP = $57454250, // MKBETAG('W','E','B','P'), - AV_CODEC_ID_WEBVTT = $57565454, // MKBETAG('W','V','T','T'), - AV_CODEC_ID_XBIN = $5842494E, // MKBETAG('X','B','I','N'), - AV_CODEC_ID_XFACE = $58464143, // MKBETAG('X','F','A','C'), - AV_CODEC_ID_Y41P = $59343150, // MKBETAG('Y','4','1','P'), - AV_CODEC_ID_YUV4 = $59555634, // MKBETAG('Y','U','V','4'), - AV_CODEC_ID_EIA_608 = $63363038, // MKBETAG('c','6','0','8'), - AV_CODEC_ID_MICRODVD = $6D445644, // MKBETAG('m','D','V','D'), - AV_CODEC_ID_EVRC = $73657663, // MKBETAG('s','e','v','c'), - AV_CODEC_ID_SMV = $73736D76, // MKBETAG('s','s','m','v'), - AV_CODEC_ID_TAK = $7442614B // MKBETAG('t','B','a','K'), -{$IFDEF FF_API_CODEC_ID} -{$INCLUDE ffmpeg.old_codec_ids.inc} -{$ENDIF} - ); - -const - AV_PKT_FLAG_KEY = $0001; - /// < The packet contains a keyframe - AV_PKT_FLAG_CORRUPT = $0002; - /// < The packet content is corrupted - // - AV_CODEC_ID_H265 = AV_CODEC_ID_HEVC; - -Type - (* - * This struct describes the properties of a single codec described by an - * AVCodecID. - * @see avcodec_get_descriptor() - *) - pAVCodecDescriptor = ^TAVCodecDescriptor; - - TAVCodecDescriptor = record - id: TAVCodecID; - _type: TAVMediaType; - (* - * Name of the codec described by this descriptor. It is non-empty and - * unique for each codec descriptor. It should contain alphanumeric - * characters and '_' only. - *) - name: pAnsiChar; - (* - * A more descriptive name for this codec. May be NULL. - *) - long_name: pAnsiChar; - (* - * Codec properties, a combination of AV_CODEC_PROP_* flags. - *) - props: Integer; - end; - - (* - * Codec uses only intra compression. - * Video codecs only. - *) - // #define AV_CODEC_PROP_INTRA_ONLY (1 << 0) - (* - // * Codec supports lossy compression. Audio and video codecs only. - // * @note a codec may support both lossy and lossless - // * compression modes - *) - // #define AV_CODEC_PROP_LOSSY (1 << 1) - (* - // * Codec supports lossless compression. Audio and video codecs only. - *) - // #define AV_CODEC_PROP_LOSSLESS (1 << 2) - (* - // * Subtitle codec is bitmap based - // * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. - *) - // #define AV_CODEC_PROP_BITMAP_SUB (1 << 16) - (* - // * Subtitle codec is text based. - // * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. - *) - // #define AV_CODEC_PROP_TEXT_SUB (1 << 17) -Const - (* - * @ingroup lavc_decoding - * 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.
- * 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 = 16; - - (* - // * @ingroup lavc_encoding - // * minimum encoding buffer size - // * Used to avoid some checks during header writing. - *) - // #define FF_MIN_BUFFER_SIZE 16384 - // - // - (* - // * @ingroup lavc_encoding - // * motion estimation type. - *) -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_TESA, - /// < transformed exhaustive search algorithm - ME_ITER = 50 - /// < iterative search - ); - - (* - * @ingroup lavc_decoding - *) - 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 - ); - - 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_BT2020 = 9, - /// < ITU-R BT2020 - 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_SMPTE170M = 6, - /// < also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC - AVCOL_TRC_SMPTE240M = 7, AVCOL_TRC_LINEAR = 8, - /// < "Linear transfer characteristics" - AVCOL_TRC_LOG = 9, - /// < "Logarithmic transfer characteristic (100:1 range)" - AVCOL_TRC_LOG_SQRT = 10, - /// < "Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range)" - AVCOL_TRC_IEC61966_2_4 = 11, - /// < IEC 61966-2-4 - AVCOL_TRC_BT1361_ECG = 12, - /// < ITU-R BT1361 Extended Colour Gamut - AVCOL_TRC_IEC61966_2_1 = 13, - /// < IEC 61966-2-1 (sRGB or sYCC) - AVCOL_TRC_BT2020_10 = 14, - /// < ITU-R BT2020 for 10 bit system - AVCOL_TRC_BT2020_12 = 15, - /// < ITU-R BT2020 for 12 bit system - AVCOL_TRC_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 - ); - - TAVAudioServiceType = ( // - AV_AUDIO_SERVICE_TYPE_MAIN = 0, // - AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, // - AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, // - AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, // - AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, // - AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, // - AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, // - AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, // - AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, // - AV_AUDIO_SERVICE_TYPE_NB - /// < Not part of ABI - ); - - (* - * @ingroup lavc_encoding - *) - pRcOverride = ^TRcOverride; - - TRcOverride = record - start_frame: Integer; - end_frame: Integer; - qscale: Integer; - // If this is 0 then quality_factor will be used instead. - quality_factor: single; - end; - - // #if FF_API_MAX_BFRAMES - (* - // * @deprecated there is no libavcodec-wide limit on the number of B-frames - *) - // #define FF_MAX_B_FRAMES 16 - // #endif -const - (* encoding support - These flags can be passed in AVCodecContext.flags before initialization. - Note: Not everything is supported yet. - * ) - - (* - * Allow decoders to produce frames with data planes that are not aligned - * to CPU requirements (e.g. due to cropping). - *) - CODEC_FLAG_UNALIGNED = $0001; - CODEC_FLAG_QSCALE = $0002; - /// < Use fixed qscale. - CODEC_FLAG_4MV = $0004; - /// < 4 MV per MB allowed / advanced prediction for H.263. - CODEC_FLAG_OUTPUT_CORRUPT = $0008; - /// < Output even those frames that might be corrupted - 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>. - (* - // * 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_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_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 *) - CODEC_FLAG_AC_PRED = $01000000; - /// < H.263 advanced intra coding / MPEG-4 AC prediction - CODEC_FLAG_LOOP_FILTER = $00000800; - /// < loop filter - CODEC_FLAG_INTERLACED_ME = $20000000; - /// < interlaced motion estimation - CODEC_FLAG_CLOSED_GOP = $80000000; - CODEC_FLAG2_FAST = $00000001; - /// < Allow non spec compliant speedup tricks. - 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_DROP_FRAME_TIMECODE = $00002000; - /// < timecode is in drop frame format. DEPRECATED!!!! - CODEC_FLAG2_IGNORE_CROP = $00010000; - /// < Discard cropping information from SPS. - - CODEC_FLAG2_CHUNKS = $00008000; - /// < Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries. - CODEC_FLAG2_SHOW_ALL = $00400000; - /// < Show all frames before the first keyframe - - (* Unsupported options : - * Syntax Arithmetic coding (SAC) - * Reference Picture Selection - * Independent 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; - CODEC_CAP_TRUNCATED = $0008; - // #if FF_API_XVMC - (* Codec can export data for HW decoding (XvMC). *) - // #define CODEC_CAP_HWACCEL $0010 - // #endif (* FF_API_XVMC *) - (* - * Encoder or decoder requires flushing with NULL input at the end in order to - * give the complete and correct output. - * - * NOTE: If this flag is not set, the codec is guaranteed to never be fed with - * with NULL data. The user can still send NULL data to the public encode - * or decode function, but libavcodec will not pass it along to the codec - * unless this flag is set. - * - * Decoders: - * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, - * avpkt->size=0 at the end to get the delayed data until the decoder no longer - * returns frames. - * - * Encoders: - * The encoder needs to be fed with NULL data at the end of encoding until the - * encoder no longer returns data. - * - * NOTE: For encoders implementing the AVCodec.encode2() function, setting this - * flag also means that the encoder must set the pts and duration for - * each output packet. If this flag is not set, the pts and duration will - * be determined by libavcodec from the input frame. - *) - CODEC_CAP_DELAY = $0020; - (* - // * 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; - // #if FF_API_CAP_VDPAU - (* - * Codec can export data for HW decoding (VDPAU). - *) - // #define CODEC_CAP_HWACCEL_VDPAU $0080 - // #endif - (* - * 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; - (* - * Codec is experimental and is thus avoided in favor of non experimental - * encoders - *) - CODEC_CAP_EXPERIMENTAL = $0200; - (* - * Codec should fill in channel configuration and samplerate instead of container - *) - CODEC_CAP_CHANNEL_CONF = $0400; - - (* - // * Codec is able to deal with negative linesizes - *) - CODEC_CAP_NEG_LINESIZES = $0800; - - (* - // * Codec supports frame-level multithreading. - *) - // #define CODEC_CAP_FRAME_THREADS $1000 - (* - // * Codec supports slice-based (or partition-based) multithreading. - *) - // #define CODEC_CAP_SLICE_THREADS $2000 - (* - // * Codec supports changed parameters at any point. - *) - // #define CODEC_CAP_PARAM_CHANGE $4000 - (* - // * Codec supports avctx->thread_count == 0 (auto). - *) - // #define CODEC_CAP_AUTO_THREADS $8000 - (* - // * Audio encoder supports receiving a different number of samples in each call. - *) - // #define CODEC_CAP_VARIABLE_FRAME_SIZE $10000 - (* - // * Codec is intra only. - *) - // #define CODEC_CAP_INTRA_ONLY $40000000 - (* - // * Codec is lossless. - *) - // #define CODEC_CAP_LOSSLESS $80000000 - // - // #if FF_API_MB_TYPE - /// /The following defines may change, don't expect compatibility if you use them. - // #define MB_TYPE_INTRA4x4 $0001 - // #define MB_TYPE_INTRA16x16 $0002 //FIXME H.264-specific - // #define MB_TYPE_INTRA_PCM $0004 //FIXME H.264-specific - // #define MB_TYPE_16x16 $0008 - // #define MB_TYPE_16x8 $0010 - // #define MB_TYPE_8x16 $0020 - // #define MB_TYPE_8x8 $0040 - // #define MB_TYPE_INTERLACED $0080 - // #define MB_TYPE_DIRECT2 $0100 //FIXME - // #define MB_TYPE_ACPRED $0200 - // #define MB_TYPE_GMC $0400 - // #define MB_TYPE_SKIP $0800 - // #define MB_TYPE_P0L0 $1000 - // #define MB_TYPE_P1L0 $2000 - // #define MB_TYPE_P0L1 $4000 - // #define MB_TYPE_P1L1 $8000 - // #define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) - // #define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) - // #define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) - // #define MB_TYPE_QUANT $00010000 - // #define MB_TYPE_CBP $00020000 - /// /Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...) - // #endif - // - (* - // * Pan Scan area. - // * This specifies the area which should be displayed. - // * Note there may be multiple such areas for one frame. - *) - // typedef struct AVPanScan{ - (* - // * id - // * - encoding: Set by user. - // * - decoding: Set by libavcodec. - *) - // int id; - // - (* - // * width and height in 1/16 pel - // * - encoding: Set by user. - // * - decoding: Set by libavcodec. - *) - // int width; - // int height; - // - (* - // * position of the top left corner in 1/16 pel for up to 3 fields/frames - // * - encoding: Set by user. - // * - decoding: Set by libavcodec. - *) - // int16_t position[3][2]; - // }AVPanScan; - // - // #if FF_API_QSCALE_TYPE - // #define FF_QSCALE_TYPE_MPEG1 0 - // #define FF_QSCALE_TYPE_MPEG2 1 - // #define FF_QSCALE_TYPE_H264 2 - // #define FF_QSCALE_TYPE_VP56 3 - // #endif - // - // #if FF_API_GET_BUFFER - // #define FF_BUFFER_TYPE_INTERNAL 1 - // #define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user) - // #define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared. - // #define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything. - // - // #define FF_BUFFER_HINTS_VALID $01 // Buffer hints value is meaningful (if 0 ignore). - // #define FF_BUFFER_HINTS_READABLE $02 // Codec will read from buffer. - // #define FF_BUFFER_HINTS_PRESERVE $04 // User must not alter buffer content. - // #define FF_BUFFER_HINTS_REUSABLE $08 // Codec will reuse the buffer (update). - // #endif - // - (* - // * The decoder will keep a reference to the frame and may reuse it later. - *) - // #define AV_GET_BUFFER_FLAG_REF (1 << 0) - - (* - // * @defgroup lavc_packet AVPacket - // * - // * Types and functions for working with AVPacket. - // * @{ - *) -Type - - TAVPacketSideDataType = ( // - AV_PKT_DATA_PALETTE, // - AV_PKT_DATA_NEW_EXTRADATA, // - (* - * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: - * @code - * u32le param_flags - * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) - * s32le channel_count - * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) - * u64le channel_layout - * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) - * s32le sample_rate - * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) - * s32le width - * s32le height - * @endcode - *) - AV_PKT_DATA_PARAM_CHANGE, // - (* - * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of - * structures with info about macroblocks relevant to splitting the - * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). - * That is, it does not necessarily contain info about all macroblocks, - * as long as the distance between macroblocks in the info is smaller - * than the target payload size. - * Each MB info structure is 12 bytes, and is laid out as follows: - * @code - * u32le bit offset from the start of the packet - * u8 current quantizer at the start of the macroblock - * u8 GOB number - * u16le macroblock address within the GOB - * u8 horizontal MV predictor - * u8 vertical MV predictor - * u8 horizontal MV predictor for block number 3 - * u8 vertical MV predictor for block number 3 - * @endcode - *) - AV_PKT_DATA_H263_MB_INFO, - - (* - * Recommmends skipping the specified number of samples - * @code - * u32le number of samples to skip from start of this packet - * u32le number of samples to skip from end of this packet - * u8 reason for start skip - * u8 reason for end skip (0=padding silence, 1=convergence) - * @endcode - *) - AV_PKT_DATA_SKIP_SAMPLES = 70, - - (* - * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that - * the packet may contain "dual mono" audio specific to Japanese DTV - * and if it is true, recommends only the selected channel to be used. - * @code - * u8 selected channels (0=mail/left, 1=sub/right, 2=both) - * @endcode - *) - AV_PKT_DATA_JP_DUALMONO, - - (* - * A list of zero terminated key/value strings. There is no end marker for - * the list, so it is required to rely on the side data size to stop. - *) - AV_PKT_DATA_STRINGS_METADATA, - - (* - * Subtitle event position - * @code - * u32le x1 - * u32le y1 - * u32le x2 - * u32le y2 - * @endcode - *) - AV_PKT_DATA_SUBTITLE_POSITION, - - (* - * Data found in BlockAdditional element of matroska container. There is - * no end marker for the data, so it is required to rely on the side data - * size to recognize the end. 8 byte id (as found in BlockAddId) followed - * by data. - *) - AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, - - (* - * The optional first identifier line of a WebVTT cue. - *) - AV_PKT_DATA_WEBVTT_IDENTIFIER, - - (* - * The optional settings (rendering instructions) that immediately - * follow the timestamp specifier of a WebVTT cue. - *) - AV_PKT_DATA_WEBVTT_SETTINGS); - - (* - * This structure stores compressed data. It is typically exported by demuxers - * and then passed as input to decoders, or received as output from encoders and - * then passed to muxers. - * - * For video, it should typically contain one compressed frame. For audio it may - * contain several compressed frames. - * - * AVPacket is one of the few structs in FFmpeg, whose size is a part of public - * ABI. Thus it may be allocated on stack and no new fields can be added to it - * without libavcodec and libavformat major bump. - * - * The semantics of data ownership depends on the buf or destruct (deprecated) - * fields. If either is set, the packet data is dynamically allocated and is - * valid indefinitely until av_free_packet() is called (which in turn calls - * av_buffer_unref()/the destruct callback to free the data). If neither is set, - * the packet data is typically backed by some static buffer somewhere and is - * only valid for a limited time (e.g. until the next read call when demuxing). - * - * The side data is always allocated with av_malloc() and is freed in - * av_free_packet(). - *) -Type - - pAVHWAccel = ^TAVHWAccel; - - pAVPacket = ^TAVPacket; - - pSide_data = ^TSide_data; - - TSide_data = record - data: pByte; - size: Integer; - _type: TAVPacketSideDataType; - end; - - TAVPacket = record - (* - * A reference to the reference-counted buffer where the packet data is - * stored. - * May be NULL, then the packet data is not reference-counted. - *) - buf: pAVBufferRef; - (* - * 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: int64_t; - (* - * 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: int64_t; - data: pByte; - size: Integer; - stream_index: Integer; - (* - * A combination of AV_PKT_FLAG values - *) - flags: Integer; - (* - * Additional packet data that can be provided by the container. - * Packet can contain several types of side information. - *) - side_data: pSide_data; - side_data_elems: Integer; - (* - * Duration of this packet in AVStream->time_base units, 0 if unknown. - * Equals next_pts - this_pts in presentation order. - *) - duration: Integer; -{$IFDEF FF_API_DESTRUCT_PACKET} - destruct: procedure(AV_Packet: pAVPacket); cdecl; - priv: pointer; -{$ENDIF} - pos: int64_t; - // < 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 is not the display duration of the current packet. - * 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: int64_t; - end; - - TAVSideDataParamChangeFlags = ( // - AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = $0001, // - AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = $0002, // - AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = $0004, // - AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = $0008 // - ); - - // struct AVCodecInternal; - TAVFieldOrder = ( // - AV_FIELD_UNKNOWN, // - AV_FIELD_PROGRESSIVE, // - AV_FIELD_TT, // < Top coded_first, top displayed first - AV_FIELD_BB, // < Bottom coded first, bottom displayed first - AV_FIELD_TB, // < Top coded first, bottom displayed first - AV_FIELD_BT // < Bottom coded first, top displayed first - ); - - (* - // * main external API structure. - // * New fields can be added to the end with minor version bumps. - // * Removal, reordering and changes to existing fields require a major - // * version bump. - // * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user - // * applications. - // * sizeof(AVCodecContext) must not be used outside libav*. - *) - pAVCodecContext = ^TAVCodecContext; - ppAVCodecContext = ^pAVCodecContext; - - // int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); - TExecuteFunc = function(c2: pAVCodecContext; arg: pointer): Integer; cdecl; - TExecute = function(c: pAVCodecContext; ExecuteFunc: TExecuteFunc; arg2: pointer; ret: PInteger; count: Integer; size: Integer): Integer; cdecl; - - // int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); - TExecuteFunc2 = function(c2: pAVCodecContext; arg: pointer; jobnr: Integer; threadnr: Integer): Integer; cdecl; - TExecute2 = function(c: pAVCodecContext; ExecuteFunc2: TExecuteFunc2; arg2: pointer; ret: PInteger; count: Integer): Integer; cdecl; - - pAVCodec = ^TAVCodec; - - TAVCodecInternal = record - end; - - pAVCodecInternal = ^TAVCodecInternal; - - TAVCodecContext = record - (* - * information on struct for av_log - * - set by avcodec_alloc_context3 - *) - av_class: pAVClass; - log_level_offset: Integer; - codec_type: TAVMediaType; // * see AVMEDIA_TYPE_xxx *) - codec: pAVCodec; - codec_name: array [0 .. 31] of AnsiChar; // attribute_deprecated - codec_id: TAVCodecID; // * see AV_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 than 32 bits then the demuxer should - * remap the longer ID to 32 bits with a table or other structure. Alternatively a new - * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated - * first. - * - 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; - (* - * 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: cuint; // attribute_deprecated - priv_data: pointer; - (* - * Private context used for internal data. - * - * Unlike priv_data, this is not codec-specific. It is used in general - * libavcodec functions. - *) - internal: pAVCodecInternal; - (* - * Private data of the user, can be used to carry app specific stuff. - * - encoding: Set by user. - * - decoding: Set by user. - *) - opaque: pointer; - (* - * 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: int64_t; - - (* - * 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; - - (* - * 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; - (* - * - encoding: Set by user. - * - decoding: unused - *) - compression_level: cint; - // #define FF_COMPRESSION_DEFAULT -1 - - (* - * CODEC_FLAG_*. - * - encoding: Set by user. - * - decoding: Set by user. - *) - flags: cint; - - (* - * CODEC_FLAG2_* - * - encoding: Set by user. - * - decoding: Set by user. - *) - flags2: 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 problems 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; - - (* - * 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; - (* - * Codec delay. - * - * Encoding: Number of frames delay there will be from the encoder input to - * the decoder output. (we assume the decoder matches the spec) - * Decoding: Number of frames delay in addition to what a standard decoder - * as specified in the spec would produce. - * - * Video: - * Number of frames the decoded output will be delayed relative to the - * encoded input. - * - * Audio: - * For encoding, this is the number of "priming" samples added to the - * beginning of the stream. The decoded output will be delayed by this - * many samples relative to the input to the encoder. Note that this - * field is purely informational and does not directly affect the pts - * output by the encoder, which should always be based on the actual - * presentation time, including any delay. - * For decoding, this is the number of samples the decoder needs to - * output before the decoder's output is valid. When seeking, you should - * start decoding this many samples prior to your desired seek point. - * - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - delay: cint; - - (* video only *) - (* - * picture width / height. - * - encoding: MUST be set by user. - * - decoding: May be set by the user before opening the decoder if known e.g. - * from the container. Some decoders will require the dimensions - * to be set by the caller. During decoding, the decoder may - * overwrite those values as required. - *) - width, height: cint; - (* - * Bitstream width / height, may be different from width/height e.g. when - * the decoded frame is cropped before being output or lowres is enabled. - * - encoding: unused - * - decoding: May be set by the user before opening the decoder if known - * e.g. from the container. During decoding, the decoder may - * overwrite those values as required. - *) - coded_width, coded_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 AV_PIX_FMT_xxx. - * May be set by the demuxer if known from headers. - * May be overridden 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; - (* - * 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; // attribute_deprecated - (* - * 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. - * When multithreading is used, it may be called from multiple threads - * at the same time; threads might draw different parts of the same AVFrame, - * or multiple AVFrames, and there is no guarantee that slices will be drawn - * in order. - * 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 - *) - // void (*draw_horiz_band)(struct AVCodecContext *s, - // const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], - // int y, int type, int height); - draw_horiz_band: procedure(s: pAVCodecContext; const src: pAVFrame; offset: pAVNDPArray; y: cint; type_: cint; height: cint); cdecl; - (* - * 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. - *) - // enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); - get_format: function(s: pAVCodecContext; const fmt: pAVPixelFormat): TAVPixelFormat; cdecl; - (* - * 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; // attribute_deprecated - // #define FF_RC_STRATEGY_XVID 1 - b_frame_strategy: cint; // attribute_deprecated - (* - * qscale offset between IP and B-frames - * - encoding: Set by user. - * - decoding: unused - *) - b_quant_offset: cfloat; - (* - * 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; - (* - * 0-> h263 quant 1-> mpeg quant - * - encoding: Set by user. - * - decoding: unused - *) - mpeg_quant: cint; // attribute_deprecated - (* - * 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; - (* - * 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; - (* - * slice count - * - encoding: Set by libavcodec. - * - decoding: Set by user (or 0). - *) - slice_count: Integer; - (* - * prediction method (needed for huffyuv) - * - encoding: Set by user. - * - decoding: unused - *) - prediction_method: cint; // attribute_deprecated - (* - * slice offsets in the frame in bytes - * - encoding: Set/allocated by libavcodec. - * - decoding: Set/allocated by user (or NULL). - *) - slice_offset: pcint; - (* - * 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; - (* - * 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; // attribute_deprecated - (* - * 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; - (* - * 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; // attribute_deprecated - // #define FF_DEFAULT_QUANT_BIAS 999999 - (* - * inter quantizer bias - * - encoding: Set by user. - * - decoding: unused - *) - inter_quant_bias: cint; - (* - * slice flags - * - encoding: unused - * - decoding: Set by user. - *) - slice_flags: cint; -{$IFDEF FF_API_XVMC} - (* - * XVideo Motion Acceleration - * - encoding: forbidden - * - decoding: set by decoder - * @deprecated XvMC support is slated for removal. - *) - - xvmc_acceleration: cint; // attribute_deprecated -{$ENDIF} // * FF_API_XVMC * / - - (* - * 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; - { * - * scene change detection threshold - * 0 is default, larger means fewer detected scene changes. - * - encoding: Set by user. - * - decoding: unused - * } - scenechange_threshold: cint; // attribute_deprecated - (* - * noise reduction strength - * - encoding: Set by user. - * - decoding: unused - *) - noise_reduction: cint; // attribute_deprecated - (* - * 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; // attribute_deprecated - (* - * 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; - (* - * 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; - (* - * Border processing masking, raises the quantizer for mbs on the borders - * of the picture. - * - encoding: Set by user. - * - decoding: unused - *) - border_masking: cfloat; // attribute_deprecated - (* - * 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; // attribute_deprecated - (* - * - * - encoding: Set by user. - * - decoding: unused - *) - bidir_refine: cint; - (* - * - * - encoding: Set by user. - * - decoding: unused - *) - brd_scale: cint; // attribute_deprecated - (* - * 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; // attribute_deprecated - (* - * Multiplied by qscale for each frame and added to scene_change_score. - * - encoding: Set by user. - * - decoding: unused - *) - scenechange_factor: cint; // attribute_deprecated - (* - * - * Note: Value depends upon the compare function used for fullpel ME. - * - encoding: Set by user. - * - decoding: unused - *) - mv0_threshold: cint; - (* - * Adjust sensitivity of b_frame_strategy 1. - * - encoding: Set by user. - * - decoding: unused - *) - b_sensitivity: cint; // attribute_deprecated - (* - * 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; - (* - * Number of slices. - * Indicates number of picture subdivisions. Used for parallelized - * decoding. - * - encoding: Set by user - * - decoding: unused - *) - slices: cint; - (* Field order - * - encoding: set by libavcodec - * - decoding: Set by user. - *) - field_order: TAVFieldOrder; - (* 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: TAVSampleFormat; - /// < sample format - (* The following data should not be initialized. *) - (* - * Number of samples per channel in an audio frame. - * - * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame - * except the last must contain exactly frame_size samples per channel. - * May be 0 when the codec has CODEC_CAP_VARIABLE_FRAME_SIZE set, then the - * frame size is not restricted. - * - decoding: may be set by some decoders to indicate constant frame size - *) - frame_size: cint; - (* - * Frame counter, set by libavcodec. - * - * - decoding: total number of frames returned from the decoder so far. - * - encoding: total number of frames passed to the encoder so far. - * - * @note the counter is not incremented if encoding/decoding resulted in - * an error. - *) - frame_number: cint; - (* - * number of bytes per packet if constant and known or 0 - * Used by some WAV based audio codecs. - *) - block_align: cint; - (* - * Audio cutoff bandwidth (0 means "automatic") - * - encoding: Set by user. - * - decoding: unused - *) - cutoff: cint; -{$IFDEF FF_API_REQUEST_CHANNELS} - (* - * 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; // attribute_deprecated -{$ENDIF} - (* - * Audio channel layout. - * - encoding: set by user. - * - decoding: set by user, may be overwritten by libavcodec. - *) - channel_layout: cuint64; - (* - * Request decoder to use this channel layout if it can (0 for default) - * - encoding: unused - * - decoding: Set by user. - *) - request_channel_layout: cuint64; - (* - * Type of service that the audio stream conveys. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - audio_service_type: TAVAudioServiceType; - (* - * desired sample format - * - encoding: Not used. - * - decoding: Set by user. - * Decoder will decode to this format if it can. - *) - request_sample_fmt: TAVSampleFormat; - -{$IFDEF FF_API_GET_BUFFER} - (* - * Called at the beginning of each frame to get a buffer for it. - * - * The function will set AVFrame.data[], AVFrame.linesize[]. - * AVFrame.extended_data[] must also be set, but it should be the same as - * AVFrame.data[] except for planar audio with more channels than can fit - * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as - * many data pointers as it can hold. - * - * if CODEC_CAP_DR1 is not set then get_buffer() must call - * avcodec_default_get_buffer() instead of providing buffers allocated by - * some other means. - * - * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't - * need it. avcodec_default_get_buffer() aligns the output buffer properly, - * but if get_buffer() is overridden then alignment considerations should - * be taken into account. - * - * @see avcodec_default_get_buffer() - * - * Video: - * - * If pic.reference is set then the frame will be read later by libavcodec. - * avcodec_align_dimensions2() should be used to find the required width and - * height, as they normally need to be rounded up to the next multiple of 16. - * - * If frame multithreading is used and thread_safe_callbacks is set, - * it may be called from a different thread, but not from more than one at - * once. Does not need to be reentrant. - * - * @see release_buffer(), reget_buffer() - * @see avcodec_align_dimensions2() - * - * Audio: - * - * Decoders request a buffer of a particular size by setting - * AVFrame.nb_samples prior to calling get_buffer(). The decoder may, - * however, utilize only part of the buffer by setting AVFrame.nb_samples - * to a smaller value in the output frame. - * - * Decoders cannot use the buffer after returning from - * avcodec_decode_audio4(), so they will not call release_buffer(), as it - * is assumed to be released immediately upon return. In some rare cases, - * a decoder may need to call get_buffer() more than once in a single - * call to avcodec_decode_audio4(). In that case, when get_buffer() is - * called again after it has already been called once, the previously - * acquired buffer is assumed to be released at that time and may not be - * reused by the decoder. - * - * As a convenience, av_samples_get_buffer_size() and - * av_samples_fill_arrays() in libavutil may be used by custom get_buffer() - * functions to find the required data size and to fill data pointers and - * linesize. In AVFrame.linesize, only linesize[0] may be set for audio - * since all planes must be the same size. - * - * @see av_samples_get_buffer_size(), av_samples_fill_arrays() - * - * - encoding: unused - * - decoding: Set by libavcodec, user can override. - * - * @deprecated use get_buffer2() - *) - // int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic); // attribute_deprecated - 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. - * May be called from a different thread if frame multithreading is used, - * but not by more than one thread at once, so does not need to be reentrant. - * - encoding: unused - * - decoding: Set by libavcodec, user can override. - * - * @deprecated custom freeing callbacks should be set from get_buffer2() - *) - // void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic); - release_buffer: procedure(c: pAVCodecContext; pic: pAVFrame); cdecl; // attribute_deprecated - - (* - * 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. - *) - // int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic); - reget_buffer: function(c: pAVCodecContext; pic: pAVFrame): cint; cdecl; // attribute_deprecated -{$ENDIF} - (* - * This callback is called at the beginning of each frame to get data - * buffer(s) for it. There may be one contiguous buffer for all the data or - * there may be a buffer per each data plane or anything in between. What - * this means is, you may set however many entries in buf[] you feel necessary. - * Each buffer must be reference-counted using the AVBuffer API (see description - * of buf[] below). - * - * The following fields will be set in the frame before this callback is - * called: - * - format - * - width, height (video only) - * - sample_rate, channel_layout, nb_samples (audio only) - * Their values may differ from the corresponding values in - * AVCodecContext. This callback must use the frame values, not the codec - * context values, to calculate the required buffer size. - * - * This callback must fill the following fields in the frame: - * - data[] - * - linesize[] - * - extended_data: - * * if the data is planar audio with more than 8 channels, then this - * callback must allocate and fill extended_data to contain all pointers - * to all data planes. data[] must hold as many pointers as it can. - * extended_data must be allocated with av_malloc() and will be freed in - * av_frame_unref(). - * * otherwise exended_data must point to data - * - buf[] must contain one or more pointers to AVBufferRef structures. Each of - * the frame's data and extended_data pointers must be contained in these. That - * is, one AVBufferRef for each allocated chunk of memory, not necessarily one - * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), - * and av_buffer_ref(). - * - extended_buf and nb_extended_buf must be allocated with av_malloc() by - * this callback and filled with the extra buffers if there are more - * buffers than buf[] can hold. extended_buf will be freed in - * av_frame_unref(). - * - * If CODEC_CAP_DR1 is not set then get_buffer2() must call - * avcodec_default_get_buffer2() instead of providing buffers allocated by - * some other means. - * - * Each data plane must be aligned to the maximum required by the target - * CPU. - * - * @see avcodec_default_get_buffer2() - * - * Video: - * - * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused - * (read and/or written to if it is writable) later by libavcodec. - * - * If CODEC_FLAG_EMU_EDGE is not set in s->flags, the buffer must contain an - * edge of the size returned by avcodec_get_edge_width() on all sides. - * - * 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 frame multithreading is used and thread_safe_callbacks is set, - * this callback may be called from a different thread, but not from more - * than one at once. Does not need to be reentrant. - * - * @see avcodec_align_dimensions2() - * - * Audio: - * - * Decoders request a buffer of a particular size by setting - * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, - * however, utilize only part of the buffer by setting AVFrame.nb_samples - * to a smaller value in the output frame. - * - * As a convenience, av_samples_get_buffer_size() and - * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() - * functions to find the required data size and to fill data pointers and - * linesize. In AVFrame.linesize, only linesize[0] may be set for audio - * since all planes must be the same size. - * - * @see av_samples_get_buffer_size(), av_samples_fill_arrays() - * - * - encoding: unused - * - decoding: Set by libavcodec, user can override. - *) - // int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); - get_buffer2: function(s: pAVCodecContext; frame: pAVFrame; flags: cint): cint; cdecl; - - (* - * If non-zero, the decoded audio and video frames returned from - * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted - * and are valid indefinitely. The caller must free them with - * av_frame_unref() when they are not needed anymore. - * Otherwise, the decoded frames must not be freed by the caller and are - * only valid until the next decode call. - * - * - encoding: unused - * - decoding: set by the caller before avcodec_open2(). - *) - refcounted_frames: 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; - - (* - * ratecontrol qmin qmax limiting method - * 0-> clipping, 1-> use a nice continuous function to limit qscale wthin qmin/qmax. - * - encoding: Set by user. - * - decoding: unused - *) - rc_qsquish: cfloat; - - rc_qmod_amp: cfloat; - rc_qmod_freq: cint; - - (* - * decoder bitstream buffer size - * - encoding: Set by user. - * - decoding: unused - *) - rc_buffer_size: cint; - - (* - * ratecontrol override, see RcOverride - * - encoding: Allocated/set/freed by user. - * - decoding: unused - *) - rc_override_count: cint; - rc_override: pRcOverride; - - (* - * rate control equation - * - encoding: Set by user - * - decoding: unused - *) - rc_eq: pAnsiChar; - - (* - * maximum bitrate - * - encoding: Set by user. - * - decoding: unused - *) - rc_max_rate: cint; - - (* - * minimum bitrate - * - encoding: Set by user. - * - decoding: unused - *) - rc_min_rate: cint; - rc_buffer_aggressivity: cfloat; - (* - * initial complexity for pass1 ratecontrol - * - encoding: Set by user. - * - decoding: unused - *) - rc_initial_cplx: cfloat; - - (* - * Ratecontrol attempt to use, at maximum, 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, times the amount needed to prevent a vbv overflow. - * - encoding: Set by user. - * - decoding: unused. - *) - rc_min_vbv_overflow_use: cfloat; - - (* - * 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; - - (* - * coder type - * - encoding: Set by user. - * - decoding: unused - *) - coder_type: cint; - - (* - * context model - * - encoding: Set by user. - * - decoding: unused - *) - context_model: cint; - - (* - * minimum Lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - lmin: cint; - - (* - * maximum Lagrange multipler - * - encoding: Set by user. - * - decoding: unused - *) - lmax: 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; - - (* - * trellis RD quantization - * - encoding: Set by user. - * - decoding: unused - *) - trellis: cint; - - (* - * - encoding: Set by user. - * - decoding: unused - *) - min_prediction_order: cint; - - (* - * - encoding: Set by user. - * - decoding: unused - *) - max_prediction_order: cint; - - (* - * GOP timecode frame start number - * - encoding: Set by user, in non drop frame format - * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset) - *) - timecode_frame_start: cint64; - - (* The RTP callback: This function is called *) - (* every time the encoder has a packet to send. *) - (* It 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. *) - // void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); - rtp_callback: procedure(avctx: pAVCodecContext; data: pointer; size: cint; mb_nb: cint); cdecl; - rtp_payload_size: cint; // * The size of the RTP payload: the coder will *) - (* do its 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 transmitted RTP payload. *) - // - (* 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; - - (* - * pass1 encoding statistics output buffer - * - encoding: Set by libavcodec. - * - decoding: unused - *) - stats_out: pAnsiChar; - - (* - * 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: pAnsiChar; - - (* - * Work around bugs in encoders which sometimes cannot be detected automatically. - * - encoding: Set by user - * - decoding: Set by user - *) - workaround_bugs: 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; - - (* - * error concealment flags - * - encoding: unused - * - decoding: Set by user. - *) - error_concealment: cint; - (* - * debug - * - encoding: Set by user. - * - decoding: Set by user. - *) - debug: cint; -{$IFDEF FF_API_DEBUG_MV} - (* - * debug - * Code outside libavcodec should access this field using AVOptions - * - encoding: Set by user. - * - decoding: Set by user. - *) - debug_mv: cint; -{$ENDIF} - { * - * Error recognition; may misdetect some more or less valid parts as errors. - * - encoding: unused - * - decoding: Set by user. - * } - err_recognition: cint; - - (* - * Verify checksums embedded in the bitstream (could be of either encoded or - * decoded data, depending on the codec) and print an error message on mismatch. - * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the - * decoder returning an error. - *) - (* - * opaque 64bit number (generally a PTS) that will be reordered and - * output in AVFrame.reordered_opaque - * @deprecated in favor of pkt_pts - * - encoding: unused - * - decoding: Set by user. - *) - reordered_opaque: cint64; - - (* - * Hardware accelerator in use - * - encoding: unused. - * - decoding: Set by libavcodec - *) - hwaccel: pAVHWAccel; - - (* - * 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; - - (* - * error - * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR. - * - decoding: unused - *) - error: array [0 .. AV_NUM_DATA_POINTERS - 1] of cuint64; - - (* - * DCT algorithm, see FF_DCT_* below - * - encoding: Set by user. - * - decoding: unused - *) - dct_algo: cint; - - (* - * IDCT algorithm, see FF_IDCT_* below. - * - encoding: Set by user. - * - decoding: Set by user. - *) - idct_algo: cint; - - (* - * bits per sample/pixel from the demuxer (needed for huffyuv). - * - encoding: Set by libavcodec. - * - decoding: Set by user. - *) - bits_per_coded_sample: cint; - - (* - * Bits per sample/pixel of internal libavcodec pixel/sample format. - * - encoding: set by user. - * - decoding: set by libavcodec. - *) - bits_per_raw_sample: cint; - -{$IFDEF FF_API_LOWRES} - (* - * low resolution decoding, 1-> 1/2 size, 2->1/4 size - * - encoding: unused - * - decoding: Set by user. - * Code outside libavcodec should access this field using: - * av_codec_{get,set } _lowres(avctx) - *) - lowres: cint; -{$ENDIF} - (* - * the picture in the bitstream - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - coded_frame: pAVFrame; - - (* - * 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; - - (* - * Which multithreading methods to use. - * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, - * so clients which cannot provide future frames should not use it. - * - * - encoding: Set by user, otherwise the default is used. - * - decoding: Set by user, otherwise the default is used. - *) - thread_type: cint; - - (* - * Which multithreading methods are in use by the codec. - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - *) - active_thread_type: cint; - - (* - * Set by the client if its custom get_buffer() callback can be called - * synchronously from another thread, which allows faster multithreaded decoding. - * draw_horiz_band() will be called from other threads regardless of this setting. - * Ignored if the default get_buffer() is used. - * - encoding: Set by user. - * - decoding: Set by user. - *) - thread_safe_callbacks: 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. - *) - // int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); - execute: function(c: pAVCodecContext; func: TExecuteFunc; arg2: pointer; Var ret: cint; count: cint; size: cint): cint; cdecl; - - (* - * 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. - *) - // int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); - execute2: function(c: pAVCodecContext; func: TExecuteFunc2; arg2: pointer; var ret: cint; count: cint): cint; cdecl; - -{$IFDEF FF_API_THREAD_OPAQUE} - (* - * @deprecated this field should not be used from outside of lavc - *) - // attribute_deprecated - thread_opaque: pointer; -{$ENDIF} - (* - * noise vs. sse weight for the nsse comparsion function - * - encoding: Set by user. - * - decoding: unused - *) - nsse_weight: cint; - - (* - * profile - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - profile: cint; - - (* - * level - * - encoding: Set by user. - * - decoding: Set by libavcodec. - *) - level: cint; - - (* - * Skip loop filtering for selected frames. - * - encoding: unused - * - decoding: Set by user. - *) - skip_loop_filter: TAVDiscard; - - (* - * Skip IDCT/dequantization for selected frames. - * - encoding: unused - * - decoding: Set by user. - *) - skip_idct: TAVDiscard; - - (* - * Skip decoding for selected frames. - * - encoding: unused - * - decoding: Set by user. - *) - skip_frame: TAVDiscard; - - (* - * Header containing style information for text subtitles. - * For SUBTITLE_ASS subtitle type, it should contain the whole ASS - * [Script Info] and [V4+ Styles] section, plus the [Events] line and - * the Format line following. It shouldn't include any Dialogue line. - * - encoding: Set/allocated/freed by user (before avcodec_open2()) - * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) - *) - subtitle_header: pByte; - subtitle_header_size: cint; - -{$IFDEF FF_API_ERROR_RATE} - (* - * @deprecated use the 'error_rate' private AVOption of the mpegvideo - * encoders - *) - // attribute_deprecated - error_rate: cint; -{$ENDIF} -{$IFDEF FF_API_CODEC_PKT} - (* - * @deprecated this field is not supposed to be accessed from outside lavc - *) - // attribute_deprecated - pkt: pAVPacket; -{$ENDIF} - (* - * VBV delay coded in the last frame (in periods of a 27 MHz clock). - * Used for compliant TS muxing. - * - encoding: Set by libavcodec. - * - decoding: unused. - *) - vbv_delay: cuint64; - - (* - * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_pkt_timebase(avctx) - * - encoding unused. - * - decoding set by user. - *) - pkt_timebase: TAVRational; - - (* - * AVCodecDescriptor - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_codec_descriptor(avctx) - * - encoding: unused. - * - decoding: set by libavcodec. - *) - codec_descriptor: pAVCodecDescriptor; - -{$IFNDEF FF_API_LOWRES} - (* - * low resolution decoding, 1-> 1/2 size, 2->1/4 size - * - encoding: unused - * - decoding: Set by user. - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_lowres(avctx) - *) - lowres: Integer; -{$ENDIF} - (* - * Current statistics for PTS correction. - * - decoding: maintained and used by libavcodec, not intended to be used by user apps - * - encoding: unused - *) - pts_correction_num_faulty_pts: cint64; - /// Number of incorrect PTS values so far - pts_correction_num_faulty_dts: cint64; - /// Number of incorrect DTS values so far - pts_correction_last_pts: cint64; - /// PTS of the last frame - pts_correction_last_dts: cint64; - /// DTS of the last frame - - (* - * Character encoding of the input subtitles file. - * - decoding: set by user - * - encoding: unused - *) - sub_charenc: pAnsiChar; - - (* - * Subtitles character encoding mode. Formats or codecs might be adjusting - * this setting (if they are doing the conversion themselves for instance). - * - decoding: set by libavcodec - * - encoding: unused - *) - sub_charenc_mode: cint; - - (* - * Skip processing alpha if supported by codec. - * Note that if the format uses pre-multiplied alpha (common with VP6, - * and recommended due to better video quality/compression) - * the image will look as if alpha-blended onto a black background. - * However for formats that do not use pre-multiplied alpha - * there might be serious artefacts (though e.g. libswscale currently - * assumes pre-multiplied alpha anyway). - * Code outside libavcodec should access this field using AVOptions - * - * - decoding: set by user - * - encoding: unused - *) - skip_alpha: cint; - - (* - * Number of samples to skip after a discontinuity - * - decoding: unused - * - encoding: set by libavcodec - *) - seek_preroll: cint; - -{$IFNDEF FF_API_DEBUG_MV} - (* - * debug motion vectors - * Code outside libavcodec should access this field using AVOptions - * - encoding: Set by user. - * - decoding: Set by user. - *) - debug_mv: cint; -{$ENDIF} - end; - - // AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); - // void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); - // - // const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); - // void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); - // - // int av_codec_get_lowres(const AVCodecContext *avctx); - // void av_codec_set_lowres(AVCodecContext *avctx, int val); - // - // int av_codec_get_seek_preroll(const AVCodecContext *avctx); - // void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); - - (* - * AVProfile. - *) - pAVProfile = ^TAVProfile; - - TAVProfile = record - profile: Integer; - name: pAnsiChar; - /// < short name for the profile - end; - - pAVCodecDefault = ^TAVCodecDefault; - - TAVCodecDefault = record - end; - - pAVSubtitle = ^TAVSubtitle; - - TAVSubtitle = record - - end; - - (* - * AVCodec. - *) - TAVCodec = record - (* - * Name of the codec implementation. - * The name is globally unique among encoders and among decoders (but an - * encoder and a decoder can share the same name). - * This is the primary way to find a codec from the user perspective. - *) - name: pAnsiChar; - (* - * 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: pAnsiChar; - _type: TAVMediaType; - id: TAVCodecID; - (* - * Codec capabilities. - * see CODEC_CAP_* - *) - capabilities: Integer; - supported_framerates: pAVRational; - /// < array of supported framerates, or NULL if any, array is terminated by {0,0} - pix_fmts: pAVPixelFormat; - /// < array of supported pixel formats, or NULL if unknown, array is terminated by -1 - supported_samplerates: PInteger; - /// < array of supported audio samplerates, or NULL if unknown, array is terminated by 0 - sample_fmts: pAVSampleFormat; - /// < array of supported sample formats, or NULL if unknown, array is terminated by -1 - channel_layouts: puint64_t; - /// < array of support channel layouts, or NULL if unknown. array is terminated by 0 -{$IFDEF FF_API_LOWRES} - max_lowres: uint8_t; - /// < maximum value for lowres supported by the decoder, no direct access, use av_codec_get_max_lowres() -{$ENDIF} - priv_class: pAVClass; - /// < AVClass for the private context - profiles: pAVProfile; - /// < array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} - - (* *************************************************************** - // * No fields below this line are part of the public API. They - // * may not be used outside of libavcodec and can be changed and - // * removed at will. - // * New public fields should be added right above. - // ***************************************************************** - *) - priv_data_size: Integer; - next: pAVCodec; - (* - * @name Frame-level threading support functions - * @{ - *) - (* - * If defined, called on thread contexts when they are created. - * If the codec allocates writable tables in init(), re-allocate them here. - * priv_data will be set to a copy of the original. - *) - // int (*init_thread_copy)(AVCodecContext *); - init_thread_copy: function(avctx: pAVCodecContext): pcint; cdecl; - (* - * Copy necessary context variables from a previous thread context to the current one. - * If not defined, the next thread will start automatically; otherwise, the codec - * must call ff_thread_finish_setup(). - * - * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. - *) - // int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); - update_thread_context: function(dst: pAVCodecContext; - - const src: pAVCodecContext): cint; cdecl; - - (* - * Private codec-specific defaults. - *) - defaults: pAVCodecDefault; - - (* - * Initialize codec static data, called from avcodec_register(). - *) - // void (*init_static_data)(struct AVCodec *codec); - init_static_data: procedure(codec: pAVCodec); cdecl; - - // int (*init)(AVCodecContext *); - init: function(avctx: pAVCodecContext): cint; cdecl; - // int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, const struct AVSubtitle *sub); - encode_sub: function(avctx: pAVCodecContext; buf: pByte; buf_size: cint; - - const sub: pAVSubtitle): cint; cdecl; - (* - * Encode data to an AVPacket. - * - * @param avctx codec context - * @param avpkt output AVPacket (may contain a user-provided buffer) - * @param[in] frame AVFrame containing the raw data to be encoded - * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a - * non-empty packet was returned in avpkt. - * @return 0 on success, negative error code on failure - *) - - // int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr); - encode2: function(avctx: pAVCodecContext; avpkt: pAVPacket; - - const frame: pAVFrame; got_packet_ptr: pcint): cint; cdecl; - // int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); - decode: function(avctx: pAVCodecContext; outdata: pointer; - - var outdata_size: cint; avpkt: pAVPacket): cint; cdecl; - // int (*close)(AVCodecContext *); - close: function(avctx: pAVCodecContext): cint; cdecl; - (* - * Flush buffers. - * Will be called when seeking - *) - // void (*flush)(AVCodecContext *); - flush: procedure(avctx: pAVCodecContext); cdecl; - end; - - - - // int av_codec_get_max_lowres(const AVCodec *codec); - - (* - * 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; - (* - * Type of codec implemented by the hardware accelerator. - * - * See AVMEDIA_TYPE_xxx - *) - _type: TAVMediaType; - (* - * Codec implemented by the hardware accelerator. - * - * See AV_CODEC_ID_xxx - *) - id: TAVCodecID; - (* - * Supported pixel format. - * - * Only hardware accelerated formats are supported here. - *) - pix_fmt: TAVPixelFormat; - (* - * Hardware accelerated codec capabilities. - * see FF_HWACCEL_CODEC_CAP_* - *) - capabilities: Integer; - next: pAVHWAccel; - (* - * 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; const buf: pByte; buf_size: uint32): Integer; 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; const buf: pByte; buf_size: uint32): Integer; 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): Integer; cdecl; - (* - * 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: Integer; - end; - - (* - * Picture data structure. - * - * Up to four components can be stored into it, the last component is - * alpha. - *) - pAVPicture = ^TAVPicture; - - TAVPicture = record - data: TAVFrameByteArray; - /// < pointers to the image data planes - linesize: TAVNDPArray; - /// < number of bytes per line - end; - - (* - // * @} - *) - // - // enum AVSubtitleType { - // 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, - // }; - // - // #define AV_SUBTITLE_FLAG_FORCED $00000001 - // - // typedef struct AVSubtitleRect { - // int x; ///< top left corner of pict, undefined when pict is not set - // int y; ///< top left corner of pict, undefined when pict is not set - // int w; ///< width of pict, undefined when pict is not set - // int h; ///< height of pict, undefined when pict is not set - // int nb_colors; ///< 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 - *) - // AVPicture pict; - // enum AVSubtitleType type; - // - // char *text; ///< 0 terminated plain UTF-8 text - // - (* - // * 0 terminated ASS/SSA compatible event line. - // * The presentation of this is unaffected by the other values in this - // * struct. - *) - // char *ass; - // - // int flags; - // } AVSubtitleRect; - // - // typedef struct AVSubtitle { - // uint16_t format; (* 0 = graphics *) - // uint32_t start_display_time; (* relative to packet pts, in ms *) - // uint32_t end_display_time; (* relative to packet pts, in ms *) - // unsigned num_rects; - // AVSubtitleRect **rects; - // int64_t pts; ///< Same as packet pts, in AV_TIME_BASE - // } AVSubtitle; - // - (* - // * 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. - *) - // AVCodec *av_codec_next(const AVCodec *c); -function av_codec_next(const c: pAVCodec): pAVCodec; cdecl; -// -(* - // * Return the LIBAVCODEC_VERSION_INT constant. -*) -// unsigned avcodec_version(void); -// -(* - // * Return the libavcodec build-time configuration. -*) -// const char *avcodec_configuration(void); -// -(* - // * Return the libavcodec license. -*) -// const char *avcodec_license(void); -// -(* - // * Register the codec codec and initialize libavcodec. - // * - // * @warning either this function or avcodec_register_all() must be called - // * before any other libavcodec functions. - // * - // * @see avcodec_register_all() -*) -// void avcodec_register(AVCodec *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 avcodec_register - // * @see av_register_codec_parser - // * @see av_register_bitstream_filter -*) -// void avcodec_register_all(void); -procedure avcodec_register_all(); cdecl; -// -(* - // * Allocate an AVCodecContext and set its fields to default values. The - // * resulting struct can be deallocated by calling avcodec_close() on it followed - // * by av_free(). - // * - // * @param codec if non-NULL, allocate private data and initialize defaults - // * for the given codec. It is illegal to then call avcodec_open2() - // * with a different codec. - // * If NULL, then the codec-specific defaults won't be initialized, - // * which may result in suboptimal default settings (this is - // * important mainly for encoders, e.g. libx264). - // * - // * @return An AVCodecContext filled with default values or NULL on failure. - // * @see avcodec_get_context_defaults -*) -// AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); -function avcodec_alloc_context3(const codec: pAVCodec): pAVCodecContext; cdecl; -// -(* - // * Set the fields of the given AVCodecContext to default values corresponding - // * to the given codec (defaults may be codec-dependent). - // * - // * Do not call this function if a non-NULL codec has been passed - // * to avcodec_alloc_context3() that allocated this AVCodecContext. - // * If codec is non-NULL, it is illegal to call avcodec_open2() with a - // * different codec on this AVCodecContext. -*) -// int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); -function avcodec_get_context_defaults3(s: pAVCodecContext; const codec: pAVCodec): Integer; cdecl; -// -(* - // * Get the AVClass for AVCodecContext. It can be used in combination with - // * AV_OPT_SEARCH_FAKE_OBJ for examining options. - // * - // * @see av_opt_find(). -*) -// const AVClass *avcodec_get_class(void); -// -(* - // * Get the AVClass for AVFrame. It can be used in combination with - // * AV_OPT_SEARCH_FAKE_OBJ for examining options. - // * - // * @see av_opt_find(). -*) -// const AVClass *avcodec_get_frame_class(void); -// -(* - // * Get the AVClass for AVSubtitleRect. It can be used in combination with - // * AV_OPT_SEARCH_FAKE_OBJ for examining options. - // * - // * @see av_opt_find(). -*) -// const AVClass *avcodec_get_subtitle_rect_class(void); -// -(* - // * 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_open2() before you - // * can use this AVCodecContext to decode/encode video/audio data. - // * - // * @param dest target codec context, should be initialized with - // * avcodec_alloc_context3(NULL), but otherwise uninitialized - // * @param src source codec context - // * @return AVERROR() on error (e.g. memory allocation error), 0 on success -*) -// int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); -// -(* - // * Allocate an AVFrame and set its fields to default values. The resulting - // * struct must be freed using avcodec_free_frame(). - // * - // * @return An AVFrame filled with default values or NULL on failure. - // * @see avcodec_get_frame_defaults -*) -// AVFrame *avcodec_alloc_frame(void); -// function avcodec_alloc_frame: pAVFrame; cdecl; -// -(* - // * Set the fields of the given AVFrame to default values. - // * - // * @param frame The AVFrame of which the fields should be set to default values. -*) -// void avcodec_get_frame_defaults(AVFrame *frame); -// procedure avcodec_get_frame_defaults(frame: pAVFrame); cdecl; -// -(* - // * Free the frame and any dynamically allocated objects in it, - // * e.g. extended_data. - // * - // * @param frame frame to be freed. The pointer will be set to NULL. - // * - // * @warning this function does NOT free the data buffers themselves - // * (it does not know how, since they might have been allocated with - // * a custom get_buffer()). -*) -// void avcodec_free_frame(AVFrame **frame); -procedure avcodec_free_frame(Var frame: pAVFrame); cdecl; -// -(* - * Initialize the AVCodecContext to use the given AVCodec. Prior to using this - * function the context has to be allocated with avcodec_alloc_context3(). - * - * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), - * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for - * retrieving a codec. - * - * @warning This function is not thread safe! - * - * @code - * avcodec_register_all(); - * av_dict_set(&opts, "b", "2.5M", 0); - * codec = avcodec_find_decoder(AV_CODEC_ID_H264); - * if (!codec) - * exit(1); - * - * context = avcodec_alloc_context3(codec); - * - * if (avcodec_open2(context, codec, opts) < 0) - * exit(1); - * @endcode - * - * @param avctx The context to initialize. - * @param codec The codec to open this context for. If a non-NULL codec has been - * previously passed to avcodec_alloc_context3() or - * avcodec_get_context_defaults3() for this context, then this - * parameter MUST be either NULL or equal to the previously passed - * codec. - * @param options A dictionary filled with AVCodecContext and codec-private options. - * On return this object will be filled with options that were not found. - * - * @return zero on success, a negative value on error - * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), - * av_dict_set(), av_opt_find(). -*) -// int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); -function avcodec_open2(avctx: pAVCodecContext; const codec: pAVCodec; options: ppAVDictionary): Integer; cdecl; - -(* - // * Close a given AVCodecContext and free all the data associated with it - // * (but not the AVCodecContext itself). - // * - // * Calling this function on an AVCodecContext that hasn't been opened will free - // * the codec-specific data allocated in avcodec_alloc_context3() / - // * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will - // * do nothing. -*) -// int avcodec_close(AVCodecContext *avctx); -function avcodec_close(avctx: pAVCodecContext): Integer; cdecl; - -(* - // * Free all allocated data in the given subtitle struct. - // * - // * @param sub AVSubtitle to free. -*) -// void avsubtitle_free(AVSubtitle *sub); -// -(* - // * @} -*) -// -(* - // * @addtogroup lavc_packet - // * @{ -*) -// -{$IFDEF FF_API_DESTRUCT_PACKET} -(* - * Default packet destructor. - * @deprecated use the AVBuffer API instead -*) -// attribute_deprecated -// void av_destruct_packet(AVPacket *pkt); -procedure av_destruct_packet(pkt: pAVPacket); cdecl; -{$ENDIF} -// -(* - // * Initialize optional fields of a packet with default values. - // * - // * Note, this does not touch the data and size members, which have to be - // * initialized separately. - // * - // * @param pkt packet -*) -// void av_init_packet(AVPacket *pkt); -procedure av_init_packet(pkt: pAVPacket); cdecl; -(* - // * 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 -*) -// int av_new_packet(AVPacket *pkt, int size); -function av_new_packet(pkt: pAVPacket; size: Integer): Integer; cdecl; -(* - // * Reduce packet size, correctly zeroing padding - // * - // * @param pkt packet - // * @param size new size -*) -// void av_shrink_packet(AVPacket *pkt, int size); -procedure av_shrink_packet(pkt: pAVPacket; size: Integer); cdecl; -(* - // * Increase packet size, correctly zeroing padding - // * - // * @param pkt packet - // * @param grow_by number of bytes by which to increase the size of the packet -*) -// int av_grow_packet(AVPacket *pkt, int grow_by); -function av_grow_packet(pkt: pAVPacket; grow_by: Integer): Integer; cdecl; -// -(* - * Initialize a reference-counted packet from av_malloc()ed data. - * - * @param pkt packet to be initialized. This function will set the data, size, - * buf and destruct fields, all others are left untouched. - * @param data Data allocated by av_malloc() to be used as packet data. If this - * function returns successfully, the data is owned by the underlying AVBuffer. - * The caller may not access the data through other means. - * @param size size of data in bytes, without the padding. I.e. the full buffer - * size is assumed to be size + FF_INPUT_BUFFER_PADDING_SIZE. - * - * @return 0 on success, a negative AVERROR on error -*) -// int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); -function av_packet_from_data(pkt: pAVPacket; data: pByte; size: Integer): Integer; cdecl; - -(* - // * @warning This is a hack - the packet memory allocation stuff is broken. The - // * packet is allocated if it was not really allocated. -*) -// int av_dup_packet(AVPacket *pkt); -function av_dup_packet(pkt: pAVPacket): Integer; cdecl; -// -(* - // * Copy packet, including contents - // * - // * @return 0 on success, negative AVERROR on fail -*) -// int av_copy_packet(AVPacket *dst, AVPacket *src); -function av_copy_packet(dst: pAVPacket; src: pAVPacket): Integer; cdecl; -(* - // * Copy packet side data - // * - // * @return 0 on success, negative AVERROR on fail -*) -// int av_copy_packet_side_data(AVPacket *dst, AVPacket *src); -function av_copy_packet_side_data(dst: pAVPacket; src: pAVPacket): Integer; cdecl; -(* - * Free a packet. - * - * @param pkt packet to free -*) -// void av_free_packet(AVPacket *pkt); -procedure av_free_packet(Var pkt: TAVPacket); cdecl; - -(* - // * Allocate new information of a packet. - // * - // * @param pkt packet - // * @param type side information type - // * @param size side information size - // * @return pointer to fresh allocated data or NULL otherwise -*) -// uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, -// int size); -function av_packet_new_side_data(pkt: pAVPacket; _type: TAVPacketSideDataType; size: Integer): pByte; cdecl; -(* - // * Shrink the already allocated side data buffer - // * - // * @param pkt packet - // * @param type side information type - // * @param size new side information size - // * @return 0 on success, < 0 on failure -*) -// int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size); -function av_packet_shrink_side_data(pkt: pAVPacket; _type: TAVPacketSideDataType; size: Integer): Integer; cdecl; -(* - // * Get side information from packet. - // * - // * @param pkt packet - // * @param type desired side information type - // * @param size pointer for side information size to store (optional) - // * @return pointer to data if present or NULL otherwise -*) -// uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type, -// int *size); -function av_packet_get_side_data(pkt: pAVPacket; _type: TAVPacketSideDataType; Var size: Integer): pByte; cdecl; -// int av_packet_merge_side_data(AVPacket *pkt); -function av_packet_merge_side_data(pkt: pAVPacket): Integer; -cdecl -// -// int av_packet_split_side_data(AVPacket *pkt); -function av_packet_split_side_data(pkt: pAVPacket): Integer; -cdecl; -// -(* - // * Convenience function to free all the side data stored. - // * All the other fields stay untouched. - // * - // * @param pkt packet -*) -// void av_packet_free_side_data(AVPacket *pkt); -procedure av_packet_free_side_data(pkt: pAVPacket); cdecl; -(* - // * Setup a new reference to the data described by a given packet - // * - // * If src is reference-counted, setup dst as a new reference to the - // * buffer in src. Otherwise allocate a new buffer in dst and copy the - // * data from src into it. - // * - // * All the other fields are copied from src. - // * - // * @see av_packet_unref - // * - // * @param dst Destination packet - // * @param src Source packet - // * - // * @return 0 on success, a negative AVERROR on error. -*) -// int av_packet_ref(AVPacket *dst, AVPacket *src); -function av_packet_ref(dst: pAVPacket; src: pAVPacket): Integer; cdecl; -// -(* - // * Wipe the packet. - // * - // * Unreference the buffer referenced by the packet and reset the - // * remaining packet fields to their default values. - // * - // * @param pkt The packet to be unreferenced. -*) -// void av_packet_unref(AVPacket *pkt); -procedure av_packet_unref(pkt: pAVPacket); cdecl; -(* - // * Move every field in src to dst and reset src. - // * - // * @see av_packet_unref - // * - // * @param src Source packet, will be reset - // * @param dst Destination packet -*) -// void av_packet_move_ref(AVPacket *dst, AVPacket *src); -procedure av_packet_move_ref(dst: pAVPacket; src: pAVPacket); cdecl; -(* - // * Copy only "properties" fields from src to dst. - // * - // * Properties for the purpose of this function are all the fields - // * beside those related to the packet data (buf, data, size) - // * - // * @param dst Destination packet - // * @param src Source packet - // * - // * @return 0 on success AVERROR on failure. - // * -*) -// int av_packet_copy_props(AVPacket *dst, const AVPacket *src); -function av_packet_copy_props(dst: pAVPacket; const src: pAVPacket): Integer; cdecl; -(* - // * Find a registered decoder with a matching codec ID. - // * - // * @param id AVCodecID of the requested decoder - // * @return A decoder if one was found, NULL otherwise. -*) -// AVCodec *avcodec_find_decoder(enum AVCodecID id); -function avcodec_find_decoder(id: TAVCodecID): pAVCodec; cdecl; -// -(* - // * Find a registered decoder with the specified name. - // * - // * @param name name of the requested decoder - // * @return A decoder if one was found, NULL otherwise. -*) -// AVCodec *avcodec_find_decoder_by_name(const char *name); -// -// #if FF_API_GET_BUFFER -// attribute_deprecated int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic); -// attribute_deprecated void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic); -// attribute_deprecated int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic); -// #endif -// -(* - // * The default callback for AVCodecContext.get_buffer2(). It is made public so - // * it can be called by custom get_buffer2() implementations for decoders without - // * CODEC_CAP_DR1 set. -*) -// int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); -// -(* - // * 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. -*) -// unsigned avcodec_get_edge_width(void); -// -(* - // * 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. -*) -// void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); -// -(* - // * Modify 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. -*) -// void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, -// int linesize_align[AV_NUM_DATA_POINTERS]); -// -(* - // * Converts AVChromaLocation to swscale x/y chroma position. - // * - // * The positions represent the chroma (0,0) position in a coordinates system - // * with luma (0,0) representing the origin and luma(1,1) representing 256,256 - // * - // * @param xpos horizontal chroma sample position - // * @param ypos vertical chroma sample position -*) -// int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); -// -(* - // * Converts swscale x/y chroma position to AVChromaLocation. - // * - // * The positions represent the chroma (0,0) position in a coordinates system - // * with luma (0,0) representing the origin and luma(1,1) representing 256,256 - // * - // * @param xpos horizontal chroma sample position - // * @param ypos vertical chroma sample position -*) -// enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); -// -// #if FF_API_OLD_DECODE_AUDIO -(* - * Wrapper function which calls avcodec_decode_audio4. - * - * @deprecated Use avcodec_decode_audio4 instead. - * - * Decode the audio frame of size avpkt->size from avpkt->data into samples. - * Some decoders may support multiple frames in a single AVPacket, such - * decoders would then just decode the first frame. In this case, - * 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. - * - * @warning You must not provide a custom get_buffer() when using - * avcodec_decode_audio3(). Doing so will override it with - * avcodec_default_get_buffer. Use avcodec_decode_audio4() instead, - * which does allow the application to provide a custom get_buffer(). - * - * @note You might have to align the input buffer avpkt->data and output buffer - * samples. The alignment requirements depend on the CPU: On some CPUs it isn't - * necessary at all, on others it won't work at all if not aligned and on others - * 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 Codecs which have the CODEC_CAP_DELAY capability set have a delay - * between input and output, these need to be fed with avpkt->data=NULL, - * avpkt->size=0 at the end to return the remaining frames. - * - * @param avctx the codec context - * @param[out] samples the output buffer, sample type in avctx->sample_fmt - * If the sample format is planar, each channel plane will - * be the same size, with no padding between channels. - * @param[in,out] frame_size_ptr the output buffer size in bytes - * @param[in] avpkt The input AVPacket containing the input buffer. - * You can create such packet with av_init_packet() and by then setting - * 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. -*) -// attribute_deprecated int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, -// int *frame_size_ptr, -// AVPacket *avpkt); -// #endif -// -(* - * Decode the audio frame of size avpkt->size from avpkt->data into frame. - * - * Some decoders may support multiple frames in a single AVPacket. Such - * decoders would then just decode the first frame and the return value would be - * less than the packet size. In this case, avcodec_decode_audio4 has to be - * called again with an AVPacket containing the remaining data in order to - * decode the second frame, etc... Even if no frames are returned, the packet - * needs to be fed to the decoder with remaining data until it is completely - * consumed or an error occurs. - * - * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input - * and output. This means that for some packets they will not immediately - * produce decoded output and need to be flushed at the end of decoding to get - * all the decoded data. Flushing is done by calling this function with packets - * with avpkt->data set to NULL and avpkt->size set to 0 until it stops - * returning samples. It is safe to flush even those decoders that are not - * marked with CODEC_CAP_DELAY, then no samples will be returned. - * - * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE - * larger than the actual read bytes because some optimized bitstream - * readers read 32 or 64 bits at once and could read over the end. - * - * @param avctx the codec context - * @param[out] frame The AVFrame in which to store decoded audio samples. - * The decoder will allocate a buffer for the decoded frame by - * calling the AVCodecContext.get_buffer2() callback. - * When AVCodecContext.refcounted_frames is set to 1, the frame is - * reference counted and the returned reference belongs to the - * caller. The caller must release the frame using av_frame_unref() - * when the frame is no longer needed. The caller may safely write - * to the frame if av_frame_is_writable() returns 1. - * When AVCodecContext.refcounted_frames is set to 0, the returned - * reference belongs to the decoder and is valid only until the - * next call to this function or until closing or flushing the - * decoder. The caller may not write to it. - * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is - * non-zero. Note that this field being set to zero - * does not mean that an error has occurred. For - * decoders with CODEC_CAP_DELAY set, no given decode - * call is guaranteed to produce a frame. - * @param[in] avpkt The input AVPacket containing the input buffer. - * At least avpkt->data and avpkt->size should be set. Some - * decoders might also require additional fields to be set. - * @return A negative error code is returned if an error occurred during - * decoding, otherwise the number of bytes consumed from the input - * AVPacket is returned. -*) -// int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt); -function avcodec_decode_audio4(avctx: pAVCodecContext; frame: pAVFrame; var got_frame_ptr: Integer; const avpkt: pAVPacket): Integer; cdecl; -(* - * 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 Codecs which have the CODEC_CAP_DELAY capability set have a delay - * between input and output, these need to be fed with avpkt->data=NULL, - * avpkt->size=0 at the end to return the remaining frames. - * - * @param avctx the codec context - * @param[out] picture The AVFrame in which the decoded video frame will be stored. - * Use av_frame_alloc() to get an AVFrame. The codec will - * allocate memory for the actual bitmap by calling the - * AVCodecContext.get_buffer2() callback. - * When AVCodecContext.refcounted_frames is set to 1, the frame is - * reference counted and the returned reference belongs to the - * caller. The caller must release the frame using av_frame_unref() - * when the frame is no longer needed. The caller may safely write - * to the frame if av_frame_is_writable() returns 1. - * When AVCodecContext.refcounted_frames is set to 0, the returned - * reference belongs to the decoder and is valid only until the - * next call to this function or until closing or flushing the - * decoder. The caller may not write to it. - * - * @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. -*) -// int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, -// int *got_picture_ptr, -// const AVPacket *avpkt); -function avcodec_decode_video2( // - avctx: pAVCodecContext; // AVCodecContext *avctx - picture: pAVFrame; // AVFrame *picture - Var got_picture_ptr: Integer; // int *got_picture_ptr - const avpkt: pAVPacket // const AVPacket *avpkt - ): Integer; cdecl; - -(* - * 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. - * - * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input - * and output. This means that for some packets they will not immediately - * produce decoded output and need to be flushed at the end of decoding to get - * all the decoded data. Flushing is done by calling this function with packets - * with avpkt->data set to NULL and avpkt->size set to 0 until it stops - * returning subtitles. It is safe to flush even those decoders that are not - * marked with CODEC_CAP_DELAY, then no subtitles will be returned. - * - * @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. -*) -// int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, -// int *got_sub_ptr, -// AVPacket *avpkt); -// -Type - TAVPictureStructure = ( // - AV_PICTURE_STRUCTURE_UNKNOWN, // < unknown - AV_PICTURE_STRUCTURE_TOP_FIELD, // < coded as top field - AV_PICTURE_STRUCTURE_BOTTOM_FIELD, // < coded as bottom field - AV_PICTURE_STRUCTURE_FRAME // < coded as frame - ); - - pAVCodecParserContext = ^TAVCodecParserContext; - - pAVCodecParser = ^TAVCodecParser; - - TAVCodecParserContext = record - priv_data: pointer; - parser: pAVCodecParser; - frame_offset: int64_t; (* offset of the current frame *) - cur_offset: int64_t; (* current offset - (* (incremented by each av_parser_parse()) *) - next_frame_offset: int64_t; (* offset of the next frame *) - (* video info *) - pict_type: Integer; (* 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: Integer; (* XXX: Put it back in AVCodecContext. *) - pts: int64_t; (* pts of the current frame *) - dts: int64_t; (* dts of the current frame *) - (* private data *) - last_pts: int64_t; - last_dts: int64_t; - fetch_timestamp: Integer; - cur_frame_start_index: Integer; - cur_frame_offset: array [0 .. AV_PARSER_PTS_NB - 1] of int64_t; - cur_frame_pts: array [0 .. AV_PARSER_PTS_NB - 1] of int64_t; - cur_frame_dts: array [0 .. AV_PARSER_PTS_NB - 1] of int64_t; - flags: Integer; - offset: int64_t; - /// < byte offset from starting packet start - cur_frame_end: array [0 .. AV_PARSER_PTS_NB - 1] of int64_t; - // - (* - * 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 AV_PICTURE_TYPE_I picture type as key frames - * will be used. - *) - key_frame: Integer; - (* - * 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 frame. - * 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: int64_t; - // 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: Integer; - (* - * 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: Integer; - (* - * 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: Integer; - (* - * Position of the packet in file. - * - * Analogous to cur_frame_pts/dts - *) - cur_frame_pos: array [0 .. AV_PARSER_PTS_NB - 1] of int64_t; - (* - * Byte position of currently parsed frame in stream. - *) - pos: int64_t; - (* - * Previous frame byte position. - *) - last_pos: int64_t; - (* - * Duration of the current frame. - * For audio, this is in units of 1 / AVCodecContext.sample_rate. - * For all other types, this is in units of AVCodecContext.time_base. - *) - duration: Integer; - field_order: TAVFieldOrder; - (* - * Indicate whether a picture is coded as a frame, top field or bottom field. - * - * For example, H.264 field_pic_flag equal to 0 corresponds to - * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag - * equal to 1 and bottom_field_flag equal to 0 corresponds to - * AV_PICTURE_STRUCTURE_TOP_FIELD. - *) - picture_structure: TAVPictureStructure; - (* - * Picture number incremented in presentation or output order. - * This field may be reinitialized at the first picture of a new sequence. - * - * For example, this corresponds to H.264 PicOrderCnt. - *) - output_picture_number: Integer; - end; - - ppByte = ^pByte; - - TAVCodecParser = record - codec_ids: array [0 .. 4] of Integer; (* several codec IDs are permitted *) - priv_data_size: Integer; - // int (*parser_init)(AVCodecParserContext *s); - parser_init: function(s: pAVCodecParserContext): Integer; cdecl; - // int (*parser_parse)(AVCodecParserContext *s, - // AVCodecContext *avctx, - // const uint8_t **poutbuf, int *poutbuf_size, - // const uint8_t *buf, int buf_size); - parser_parse: function(s: pAVCodecParserContext; avctx: pAVCodecContext; const poutbuf: ppByte; poutbuf_size: PInteger; const buf: pByte; - buf_size: Integer): Integer; cdecl; - // void (*parser_close)(AVCodecParserContext *s); - parser_close: procedure(s: pAVCodecParserContext); cdecl; - // int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); - split: function(avctx: pAVCodecContext; const buf: pByte; buf_size: Integer): Integer; cdecl; - next: pAVCodecParser; - end; - - // AVCodecParser *av_parser_next(AVCodecParser *c); - // - // void av_register_codec_parser(AVCodecParser *parser); - // AVCodecParserContext *av_parser_init(int codec_id); - // - (* - * 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){ - * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, - * in_data, in_len, - * pts, dts, pos); - * in_data += len; - * in_len -= len; - * - * if(size) - * decode_frame(data, size); - * } - * @endcode - *) - // int av_parser_parse2(AVCodecParserContext *s, - // AVCodecContext *avctx, - // uint8_t **poutbuf, int *poutbuf_size, - // const uint8_t *buf, int buf_size, - // int64_t pts, int64_t dts, - // int64_t pos); - // - (* - // * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed - // * @deprecated use AVBitStreamFilter - *) - // int av_parser_change(AVCodecParserContext *s, - // AVCodecContext *avctx, - // uint8_t **poutbuf, int *poutbuf_size, - // const uint8_t *buf, int buf_size, int keyframe); - // void av_parser_close(AVCodecParserContext *s); - // - (* - * Find a registered encoder with a matching codec ID. - * - * @param id AVCodecID of the requested encoder - * @return An encoder if one was found, NULL otherwise. - *) - // AVCodec *avcodec_find_encoder(enum AVCodecID id); -function avcodec_find_encoder(id: TAVCodecID): pAVCodec; cdecl; -(* - * Find a registered encoder with the specified name. - * - * @param name name of the requested encoder - * @return An encoder if one was found, NULL otherwise. -*) -// AVCodec *avcodec_find_encoder_by_name(const char *name); -// -// #if FF_API_OLD_ENCODE_AUDIO -(* - * Encode an audio frame from samples into buf. - * - * @deprecated Use avcodec_encode_audio2 instead. - * - * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large. - * However, for codecs with avctx->frame_size equal to 0 (e.g. PCM) the user - * will know how much space is needed because it depends on the value passed - * in buf_size as described below. In that case a lower value can be used. - * - * @param avctx the codec context - * @param[out] buf the output buffer - * @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 codecs which have avctx->frame_size equal to 0 (e.g. PCM) the number of - * samples read from samples is equal to: - * buf_size * 8 / (avctx->channels * av_get_bits_per_sample(avctx->codec_id)) - * This also implies that av_get_bits_per_sample() must not return 0 for these - * codecs. - * @return On error a negative value is returned, on success zero or the number - * of bytes used to encode the data read from the input buffer. -*) -// int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx, -// uint8_t *buf, int buf_size, -// const short *samples); -// #endif -// -(* - * Encode a frame of audio. - * - * Takes input samples from frame and writes the next output packet, if - * available, to avpkt. The output packet does not necessarily contain data for - * the most recent frame, as encoders can delay, split, and combine input frames - * internally as needed. - * - * @param avctx codec context - * @param avpkt output AVPacket. - * The user can supply an output buffer by setting - * avpkt->data and avpkt->size prior to calling the - * function, but if the size of the user-provided data is not - * large enough, encoding will fail. If avpkt->data and - * avpkt->size are set, avpkt->destruct must also be set. All - * other AVPacket fields will be reset by the encoder using - * av_init_packet(). If avpkt->data is NULL, the encoder will - * allocate it. The encoder will set avpkt->size to the size - * of the output packet. - * - * If this function fails or produces no output, avpkt will be - * freed using av_free_packet() (i.e. avpkt->destruct will be - * called to free the user supplied buffer). - * @param[in] frame AVFrame containing the raw audio data to be encoded. - * May be NULL when flushing an encoder that has the - * CODEC_CAP_DELAY capability set. - * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame - * can have any number of samples. - * If it is not set, frame->nb_samples must be equal to - * avctx->frame_size for all frames except the last. - * The final frame may be smaller than avctx->frame_size. - * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the - * output packet is non-empty, and to 0 if it is - * empty. If the function returns an error, the - * packet can be assumed to be invalid, and the - * value of got_packet_ptr is undefined and should - * not be used. - * @return 0 on success, negative error code on failure -*) -// int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, -// const AVFrame *frame, int *got_packet_ptr); -function avcodec_encode_audio2(avctx: pAVCodecContext; avpkt: pAVPacket; const frame: pAVFrame; Var got_packet_ptr: Integer): Integer; cdecl; - -// #if FF_API_OLD_ENCODE_VIDEO -(* - * @deprecated use avcodec_encode_video2() instead. - * - * 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. -*) -// attribute_deprecated -// int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, -// const AVFrame *pict); -// #endif -// -(* - * Encode a frame of video. - * - * Takes input raw video data from frame and writes the next output packet, if - * available, to avpkt. The output packet does not necessarily contain data for - * the most recent frame, as encoders can delay and reorder input frames - * internally as needed. - * - * @param avctx codec context - * @param avpkt output AVPacket. - * The user can supply an output buffer by setting - * avpkt->data and avpkt->size prior to calling the - * function, but if the size of the user-provided data is not - * large enough, encoding will fail. All other AVPacket fields - * will be reset by the encoder using av_init_packet(). If - * avpkt->data is NULL, the encoder will allocate it. - * The encoder will set avpkt->size to the size of the - * output packet. The returned data (if any) belongs to the - * caller, he is responsible for freeing it. - * - * If this function fails or produces no output, avpkt will be - * freed using av_free_packet() (i.e. avpkt->destruct will be - * called to free the user supplied buffer). - * @param[in] frame AVFrame containing the raw video data to be encoded. - * May be NULL when flushing an encoder that has the - * CODEC_CAP_DELAY capability set. - * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the - * output packet is non-empty, and to 0 if it is - * empty. If the function returns an error, the - * packet can be assumed to be invalid, and the - * value of got_packet_ptr is undefined and should - * not be used. - * @return 0 on success, negative error code on failure -*) -// int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, -// const AVFrame *frame, int *got_packet_ptr); -function avcodec_encode_video2(avctx: pAVCodecContext; avpkt: pAVPacket; const frame: pAVFrame; Var got_packet_ptr: Integer): Integer; cdecl; - -// int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, -// const AVSubtitle *sub); -// -// #if FF_API_AVCODEC_RESAMPLE -(* - * @defgroup lavc_resample Audio resampling - * @ingroup libavc - * @deprecated use libswresample instead - * - * @{ -*) -// struct ReSampleContext; -// struct AVResampleContext; -// -// typedef struct ReSampleContext ReSampleContext; -// -(* - * Initialize audio resampling context. - * - * @param output_channels number of output channels - * @param input_channels number of input channels - * @param output_rate output sample rate - * @param input_rate input sample rate - * @param sample_fmt_out requested output sample format - * @param sample_fmt_in input sample format - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency - * @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 - * @return allocated ReSampleContext, NULL if error occurred -*) -// attribute_deprecated -// ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, -// int output_rate, int input_rate, -// enum AVSampleFormat sample_fmt_out, -// enum AVSampleFormat sample_fmt_in, -// int filter_length, int log2_phase_count, -// int linear, double cutoff); -// -// attribute_deprecated -// int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples); -// -(* - * Free resample context. - * - * @param s a non-NULL pointer to a resample context previously - * created with av_audio_resample_init() -*) -// attribute_deprecated -// void audio_resample_close(ReSampleContext *s); -// -// -(* - * 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 -*) -// attribute_deprecated -// struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff); -// -(* - * 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 -*) -// attribute_deprecated -// int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx); -// -// -(* - * 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 -*) -// attribute_deprecated -// void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance); -// attribute_deprecated -// void av_resample_close(struct AVResampleContext *c); -// -(* - * Allocate memory for the pixels of a picture and setup the AVPicture - * fields for it. - * - * Call avpicture_free() to free it. - * - * @param picture the picture structure to be filled in - * @param pix_fmt the pixel format of the picture - * @param width the width of the picture - * @param height the height of the picture - * @return zero if successful, a negative error code otherwise - * - * @see av_image_alloc(), avpicture_fill() -*) -// int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); -// -(* - * Free a picture previously allocated by avpicture_alloc(). - * The data buffer used by the AVPicture is freed, but the AVPicture structure - * itself is not. - * - * @param picture the AVPicture to be freed -*) -// void avpicture_free(AVPicture *picture); -// -(* - * Setup the picture fields based on the specified image parameters - * and the provided image data buffer. - * - * The picture fields are filled in by using the image data buffer - * pointed to by ptr. - * - * If ptr is NULL, the function will fill only the picture linesize - * array and return the required size for the image buffer. - * - * To allocate an image buffer and fill the picture data in one call, - * use avpicture_alloc(). - * - * @param picture the picture to be filled in - * @param ptr buffer where the image data is stored, or NULL - * @param pix_fmt the pixel format of the image - * @param width the width of the image in pixels - * @param height the height of the image in pixels - * @return the size in bytes required for src, a negative error code - * in case of failure - * - * @see av_image_fill_arrays() -*) -// int avpicture_fill(AVPicture *picture, const uint8_t *ptr, -// enum AVPixelFormat pix_fmt, int width, int height); -function avpicture_fill(picture: pAVPicture; const ptr: pByte; pix_fmt: TAVPixelFormat; width: Integer; height: Integer): Integer; cdecl; -// -(* - * Copy pixel data from an AVPicture into a buffer. - * - * avpicture_get_size() can be used to compute the required size for - * the buffer to fill. - * - * @param src source picture with filled data - * @param pix_fmt picture pixel format - * @param width picture width - * @param height picture height - * @param dest destination buffer - * @param dest_size destination buffer size in bytes - * @return the number of bytes written to dest, or a negative value - * (error code) on error, for example if the destination buffer is not - * big enough - * - * @see av_image_copy_to_buffer() -*) -(* - int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, - int width, int height, - unsigned char *dest, int dest_size); -*) -function avpicture_layout(const src: pAVPicture; pix_fmt: TAVPixelFormat; width: Integer; height: Integer; dest: pByte; dest_size: Integer) - : Integer; cdecl; - -(* - * Calculate the size in bytes that a picture of the given width and height - * would occupy if stored in the given picture format. - * - * @param pix_fmt picture pixel format - * @param width picture width - * @param height picture height - * @return the computed picture buffer size or a negative error code - * in case of error - * - * @see av_image_get_buffer_size(). -*) -// int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); -function avpicture_get_size(pix_fmt: TAVPixelFormat; width: Integer; height: Integer): Integer; cdecl; - -// #if FF_API_DEINTERLACE -(* - // * deinterlace - if not supported return -1 - // * - // * @deprecated - use yadif (in libavfilter) instead -*) -// attribute_deprecated -// int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, -// enum AVPixelFormat pix_fmt, int width, int height); -// #endif -(* - * Copy image src to dst. Wraps av_image_copy(). -*) -// void av_picture_copy(AVPicture *dst, const AVPicture *src, -// enum AVPixelFormat pix_fmt, int width, int height); -// -(* - * Crop image top and left side. -*) -// int av_picture_crop(AVPicture *dst, const AVPicture *src, -// enum AVPixelFormat pix_fmt, int top_band, int left_band); -// -(* - * Pad image. -*) -// int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, -// int padtop, int padbottom, int padleft, int padright, int *color); -// -(* - * Utility function to access log2_chroma_w log2_chroma_h from - * the pixel format AVPixFmtDescriptor. - * - * This function asserts that pix_fmt is valid. See av_pix_fmt_get_chroma_sub_sample - * for one that returns a failure code and continues in case of invalid - * pix_fmts. - * - * @param[in] pix_fmt the pixel format - * @param[out] h_shift store log2_chroma_w - * @param[out] v_shift store log2_chroma_h - * - * @see av_pix_fmt_get_chroma_sub_sample -*) -// -// void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); -// -(* - * Return a value representing the fourCC code associated to the - * pixel format pix_fmt, or 0 if no associated fourCC code can be - * found. -*) -// unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); -// -// #define FF_LOSS_RESOLUTION $0001 (**< loss due to resolution change *) -// #define FF_LOSS_DEPTH $0002 (**< loss due to color depth change *) -// #define FF_LOSS_COLORSPACE $0004 (**< loss due to color space conversion *) -// #define FF_LOSS_ALPHA $0008 (**< loss of alpha bits *) -// #define FF_LOSS_COLORQUANT $0010 (**< loss due to color quantization *) -// #define 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 - * (maximum loss for an invalid dst_pix_fmt). -*) -// int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, -// int has_alpha); -// -(* - * 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_of_2() 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_list parameter. - * - * - * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats 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. -*) -// enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, -// enum AVPixelFormat src_pix_fmt, -// int has_alpha, int *loss_ptr); -// -(* - * Find the best pixel format to convert to given a certain source pixel - * format and a selection of two destination pixel formats. 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_of_2() selects which of - * the given pixel formats should be used to suffer the least amount of loss. - * - * If one of the destination formats is AV_PIX_FMT_NONE the other pixel format (if valid) will be - * returned. - * - * @code - * src_pix_fmt = AV_PIX_FMT_YUV420P; - * dst_pix_fmt1= AV_PIX_FMT_RGB24; - * dst_pix_fmt2= AV_PIX_FMT_GRAY8; - * dst_pix_fmt3= AV_PIX_FMT_RGB8; - * loss= FF_LOSS_CHROMA; // don't care about chroma loss, so chroma loss will be ignored. - * dst_pix_fmt = avcodec_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, alpha, &loss); - * dst_pix_fmt = avcodec_find_best_pix_fmt_of_2(dst_pix_fmt, dst_pix_fmt3, src_pix_fmt, alpha, &loss); - * @endcode - * - * @param[in] dst_pix_fmt1 One of the two destination pixel formats to choose from - * @param[in] dst_pix_fmt2 The other of the two destination pixel formats 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[in, out] loss_ptr Combination of loss flags. In: selects which of the losses to ignore, i.e. - * NULL or value of zero means we care about all losses. Out: the loss - * that occurs when converting from src to selected dst pixel format. - * @return The best pixel format to convert to or -1 if none was found. -*) -// enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, -// enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -// -// attribute_deprecated -// #if AV_HAVE_INCOMPATIBLE_LIBAV_ABI -// enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list, -// enum AVPixelFormat src_pix_fmt, -// int has_alpha, int *loss_ptr); -// #else -// enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, -// enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -// #endif -// -// -// enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); -// -(* - // * @} -*) -// -// #if FF_API_SET_DIMENSIONS -(* - // * @deprecated this function is not supposed to be used from outside of lavc -*) -// attribute_deprecated -// void avcodec_set_dimensions(AVCodecContext *s, int width, int height); -// #endif -// -(* - // * 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 -*) -// size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); -// -// void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); -// -(* - // * Return a name for the specified profile, if available. - // * - // * @param codec the codec that is searched for the given profile - // * @param profile the profile value for which a name is requested - // * @return A name for the profile if found, NULL otherwise. -*) -// const char *av_get_profile_name(const AVCodec *codec, int profile); -// -// int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); -// int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); -/// /FIXME func typedef -// -(* - // * Fill AVFrame audio data and linesize pointers. - // * - // * The buffer buf must be a preallocated buffer with a size big enough - // * to contain the specified samples amount. The filled AVFrame data - // * pointers will point to this buffer. - // * - // * AVFrame extended_data channel pointers are allocated if necessary for - // * planar audio. - // * - // * @param frame the AVFrame - // * frame->nb_samples must be set prior to calling the - // * function. This function fills in frame->data, - // * frame->extended_data, frame->linesize[0]. - // * @param nb_channels channel count - // * @param sample_fmt sample format - // * @param buf buffer to use for frame data - // * @param buf_size size of buffer - // * @param align plane size sample alignment (0 = default) - // * @return >=0 on success, negative error code on failure - // * @todo return the size in bytes required to store the samples in - // * case of success, at the next libavutil bump -*) -// int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, -// enum AVSampleFormat sample_fmt, const uint8_t *buf, -// int buf_size, int align); - -function avcodec_fill_audio_frame(frame: pAVFrame; nb_channels: Integer; sample_fmt: TAVSampleFormat; const buf: pByte; buf_size: Integer; - align: Integer): Integer; cdecl; - -(* - // * Reset the internal decoder state / flush internal buffers. Should be called - // * e.g. when seeking or when switching to a different stream. - // * - // * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), - // * this invalidates the frames previously returned from the decoder. When - // * refcounted frames are used, the decoder just releases any references it might - // * keep internally, but the caller's reference remains valid. -*) -// void avcodec_flush_buffers(AVCodecContext *avctx); -procedure avcodec_flush_buffers(avctx: pAVCodecContext); cdecl; - -(* - // * 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. -*) -// int av_get_bits_per_sample(enum AVCodecID codec_id); -// -(* - // * Return the PCM codec associated with a sample format. - // * @param be endianness, 0 for little, 1 for big, - // * -1 (or anything else) for native - // * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE -*) -// enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); -// -(* - // * Return codec bits per sample. - // * Only return non-zero if the bits per sample is exactly correct, not an - // * approximation. - // * - // * @param[in] codec_id the codec - // * @return Number of bits per sample or zero if unknown for the given codec. -*) -// int av_get_exact_bits_per_sample(enum AVCodecID codec_id); -// -(* - // * Return audio frame duration. - // * - // * @param avctx codec context - // * @param frame_bytes size of the frame, or 0 if unknown - // * @return frame duration, in samples, if known. 0 if not able to - // * determine. -*) -// int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); -// -// -// typedef struct AVBitStreamFilterContext { -// void *priv_data; -// struct AVBitStreamFilter *filter; -// AVCodecParserContext *parser; -// struct AVBitStreamFilterContext *next; -// } AVBitStreamFilterContext; -// -// -// typedef struct AVBitStreamFilter { -// const char *name; -// int priv_data_size; -// int (*filter)(AVBitStreamFilterContext *bsfc, -// AVCodecContext *avctx, const char *args, -// uint8_t **poutbuf, int *poutbuf_size, -// const uint8_t *buf, int buf_size, int keyframe); -// void (*close)(AVBitStreamFilterContext *bsfc); -// struct AVBitStreamFilter *next; -// } AVBitStreamFilter; -// -(* - // * Register a bitstream filter. - // * - // * The filter will be accessible to the application code through - // * av_bitstream_filter_next() or can be directly initialized with - // * av_bitstream_filter_init(). - // * - // * @see avcodec_register_all() -*) -// void av_register_bitstream_filter(AVBitStreamFilter *bsf); -// -(* - // * Create and initialize a bitstream filter context given a bitstream - // * filter name. - // * - // * The returned context must be freed with av_bitstream_filter_close(). - // * - // * @param name the name of the bitstream filter - // * @return a bitstream filter context if a matching filter was found - // * and successfully initialized, NULL otherwise -*) -// AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); -(* - // * Filter bitstream. - // * - // * This function filters the buffer buf with size buf_size, and places the - // * filtered buffer in the buffer pointed to by poutbuf. - // * - // * The output buffer must be freed by the caller. - // * - // * @param bsfc bitstream filter context created by av_bitstream_filter_init() - // * @param avctx AVCodecContext accessed by the filter, may be NULL. - // * If specified, this must point to the encoder context of the - // * output stream the packet is sent to. - // * @param args arguments which specify the filter configuration, may be NULL - // * @param poutbuf pointer which is updated to point to the filtered buffer - // * @param poutbuf_size pointer which is updated to the filtered buffer size in bytes - // * @param buf buffer containing the data to filter - // * @param buf_size size in bytes of buf - // * @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data - // * @return >= 0 in case of success, or a negative error code in case of failure - // * - // * If the return value is positive, an output buffer is allocated and - // * is availble in *poutbuf, and is distinct from the input buffer. - // * - // * If the return value is 0, the output buffer is not allocated and - // * should be considered identical to the input buffer, or in case - // * *poutbuf was set it points to the input buffer (not necessarily to - // * its starting address). -*) -// int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, -// AVCodecContext *avctx, const char *args, -// uint8_t **poutbuf, int *poutbuf_size, -// const uint8_t *buf, int buf_size, int keyframe); -// -(* - // * Release bitstream filter context. - // * - // * @param bsf the bitstream filter context created with - // * av_bitstream_filter_init(), can be NULL -*) -// void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); -// -(* - // * If f is NULL, return the first registered bitstream filter, - // * if f is non-NULL, return the next registered bitstream filter - // * after f, or NULL if f is the last one. - // * - // * This function can be used to iterate over all registered bitstream - // * filters. -*) -// AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f); -// -(* memory *) -// -(* - // * Same behaviour av_fast_malloc but the buffer has additional - // * FF_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. - // * - // * In addition the whole buffer will initially and after resizes - // * be 0-initialized so that no uninitialized data will ever appear. -*) -// void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); -// -(* - // * Same behaviour av_fast_padded_malloc except that buffer will always - // * be 0-initialized after call. -*) -// void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); -// -(* - // * 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. -*) -// unsigned int av_xiphlacing(unsigned char *s, unsigned int v); -// -// #if FF_API_MISSING_SAMPLE -(* - // * 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. - // * @deprecated Use avpriv_report_missing_feature() instead. -*) -// attribute_deprecated -// void av_log_missing_feature(void *avc, const char *feature, int want_sample); -// -(* - // * 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 - // * @deprecated Use avpriv_request_sample() instead. -*) -// attribute_deprecated -// void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3); -// #endif (* FF_API_MISSING_SAMPLE *) -// -(* - // * Register the hardware accelerator hwaccel. -*) -// void av_register_hwaccel(AVHWAccel *hwaccel); -// -(* - // * 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. -*) -// AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel); -// -// -(* - * Lock operation used by lockmgr -*) -Type - TAVLockOp = ( - /// < Create a mutex - AV_LOCK_CREATE = 0, - /// < Lock the mutex - AV_LOCK_OBTAIN = 1, - /// < Unlock the mutex - AV_LOCK_RELEASE = 2, - /// < Free mutex resources - AV_LOCK_DESTROY = 3); - - (* - * 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. - *) - - PPointer = ^pointer; - Tav_lockmgr_proc = function(mutex: PPointer; op: TAVLockOp): Integer; cdecl; - - // int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) -function av_lockmgr_register(proc: Tav_lockmgr_proc): Integer; cdecl; - -(* - // * Get the type of the given codec. -*) -// enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); -// -(* - // * Get the name of a codec. - // * @return a static string identifying the codec; never NULL -*) -// const char *avcodec_get_name(enum AVCodecID id); -// -(* - // * @return a positive value if s is open (i.e. avcodec_open2() was called on it - // * with no corresponding avcodec_close()), 0 otherwise. -*) -// int avcodec_is_open(AVCodecContext *s); -// -(* - // * @return a non-zero number if codec is an encoder, zero otherwise -*) -// int av_codec_is_encoder(const AVCodec *codec); -// -(* - // * @return a non-zero number if codec is a decoder, zero otherwise -*) -// int av_codec_is_decoder(const AVCodec *codec); -// -(* - // * @return descriptor for given codec ID or NULL if no descriptor exists. -*) -// const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); -// -(* - // * Iterate over all codec descriptors known to libavcodec. - // * - // * @param prev previous descriptor. NULL to get the first descriptor. - // * - // * @return next descriptor or NULL after the last descriptor -*) -// const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); -// -(* - // * @return codec descriptor with the given name or NULL if no such descriptor - // * exists. -*) -// const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); - -implementation - -uses ffm.lib; - -function avpicture_get_size; external avcodec_dll; -function avcodec_open2; external avcodec_dll; -procedure avcodec_register_all; external avcodec_dll; -// procedure avcodec_get_frame_defaults; external avcodec_dll; -procedure avcodec_free_frame; external avcodec_dll; -function avcodec_decode_video2; external avcodec_dll; -procedure av_free_packet; external avcodec_dll; -function avcodec_close; external avcodec_dll; -function av_codec_next; external avcodec_dll; -// function avcodec_alloc_frame; external avcodec_dll; -function avpicture_fill; external avcodec_dll; -function avcodec_find_decoder; external avcodec_dll; -{$IFDEF FF_API_DESTRUCT_PACKET} -procedure av_destruct_packet; external avcodec_dll; -{$ENDIF} -procedure av_init_packet; external avcodec_dll; -function av_new_packet; external avcodec_dll; -procedure av_shrink_packet; external avcodec_dll; -function av_grow_packet; external avcodec_dll; -function av_packet_from_data; external avcodec_dll; -function av_dup_packet; external avcodec_dll; -function av_copy_packet; external avcodec_dll; -function av_copy_packet_side_data; external avcodec_dll; -function av_packet_new_side_data; external avcodec_dll; -function av_packet_shrink_side_data; external avcodec_dll; -function av_packet_get_side_data; external avcodec_dll; -function av_packet_merge_side_data; external avcodec_dll; -function av_packet_split_side_data; external avcodec_dll; -procedure av_packet_free_side_data; external avcodec_dll; -function av_packet_ref; external avcodec_dll; -procedure av_packet_unref; external avcodec_dll; -procedure av_packet_move_ref; external avcodec_dll; -function av_packet_copy_props; external avcodec_dll; -function avcodec_alloc_context3; external avcodec_dll; -function avcodec_get_context_defaults3; external avcodec_dll; -function avcodec_find_encoder; external avcodec_dll; -function avcodec_encode_video2; external avcodec_dll; -function avcodec_fill_audio_frame; external avcodec_dll; -function avcodec_encode_audio2; external avcodec_dll; -procedure avcodec_flush_buffers; external avcodec_dll; -function avcodec_decode_audio4; external avcodec_dll; -function avpicture_layout; external avcodec_dll; -function av_lockmgr_register; external avcodec_dll; - -end. diff --git a/source/ffmpeg/ffm.log.pas b/source/ffmpeg/ffm.log.pas deleted file mode 100644 index f842416..0000000 --- a/source/ffmpeg/ffm.log.pas +++ /dev/null @@ -1,309 +0,0 @@ -(* - // * copyright (c) 2006 Michael Niedermayer - // * - // * This file is part of ffm. - // * - // * 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 -*) -unit ffm.log; - -{$i ffmpeg.inc} - -interface - -uses - ffm.opt; - -Type - - PVA_LIST = ^VA_LIST; - VA_LIST = array [0 .. 0] of Pointer; - - TAVClassCategory = (AV_CLASS_CATEGORY_NA = 0, AV_CLASS_CATEGORY_INPUT, AV_CLASS_CATEGORY_OUTPUT, - AV_CLASS_CATEGORY_MUXER, AV_CLASS_CATEGORY_DEMUXER, AV_CLASS_CATEGORY_ENCODER, AV_CLASS_CATEGORY_DECODER, - AV_CLASS_CATEGORY_FILTER, AV_CLASS_CATEGORY_BITSTREAM_FILTER, AV_CLASS_CATEGORY_SWSCALER, - AV_CLASS_CATEGORY_SWRESAMPLER, AV_CLASS_CATEGORY_NB); - - // struct AVOptionRanges; - - (* - // * Describe the class of an AVClass context structure. That is an - // * arbitrary struct of which the first field is a pointer to an - // * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). - *) - pAVClass = ^TAVClass; - - TItem_name = function(ctx: Pointer): PAnsiChar; cdecl; - TChild_next = procedure(obj: Pointer; prev: Pointer); cdecl; - TChild_class_next = function(prev: pAVClass): pAVClass; cdecl; - TGet_category = function(ctx: Pointer): TAVClassCategory; cdecl; - TQuery_ranges = function(av_ranges: ppAVOptionRanges; obj: Pointer; key: PAnsiChar; flag: Integer): Integer; cdecl; - - TAVClass = record - (* - * The name of the class; usually it is the same name as the - * context structure type to which the AVClass is associated. - *) - class_name: PAnsiChar; - (* - * A pointer to a function which returns the name of a context - * instance ctx associated with the class. - *) - // const char* (*item_name)(void* ctx); - item_name: TItem_name; - (* - * a pointer to the first option specified in the class if any or NULL - * - * @see av_set_default_options() - *) - option: pAVOption; - (* - * LIBAVUTIL_VERSION with which this structure was created. - * This is used to allow fields to be added without requiring major - * version bumps everywhere. - *) - version: Integer; - (* - * Offset in the structure where log_level_offset is stored. - * 0 means there is no such variable - *) - log_level_offset_offset: Integer; - (* - * Offset in the structure where a pointer to the parent context for - * logging is stored. For example a decoder could pass its AVCodecContext - * to eval as such a parent context, which an av_log() implementation - * could then leverage to display the parent context. - * The offset can be NULL. - *) - parent_log_context_offset: Integer; - (* - * Return next AVOptions-enabled child or NULL - *) - // void* (*child_next)(void *obj, void *prev); - child_next: TChild_next; - (* - * Return an AVClass corresponding to the next potential - * AVOptions-enabled child. - * - * The difference between child_next and this is that - * child_next iterates over _already existing_ objects, while - * child_class_next iterates over _all possible_ children. - *) - // const struct AVClass* (*child_class_next)(const struct AVClass *prev); - child_class_next: TChild_class_next; - (* - * Category used for visualization (like color) - * This is only set if the category is equal for all objects using this class. - * available since version (51 << 16 | 56 << 8 | 100) - *) - category: TAVClassCategory; - (* - * Callback to return the category. - * available since version (51 << 16 | 59 << 8 | 100) - *) - // AVClassCategory (*get_category)(void* ctx); - get_category: TGet_category; - (* - // * Callback to return the supported/allowed ranges. - // * available since version (52.12) - *) - // int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); - query_ranges: TQuery_ranges; - end; - -const - (* Print no output. *) - 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; - (* - * Standard information. - *) - AV_LOG_INFO = 32; - (* - * Detailed information. - *) - AV_LOG_VERBOSE = 40; - (* - * Stuff which is only useful for libav* developers. - *) - AV_LOG_DEBUG = 48; - AV_LOG_MAX_OFFSET = (AV_LOG_DEBUG - AV_LOG_QUIET); - (* - * 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 logging callback - * function. - * @see av_log_set_callback - * - * @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 expressed using a @ref - * lavu_log_constants "Logging Constant". - * @param fmt The format string (printf-compatible) that specifies how - * subsequent arguments are converted to output. - *) - - // void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); - - (* - * 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 logging callback - * function. - * @see av_log_set_callback - * - * @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 expressed using a @ref - * lavu_log_constants "Logging Constant". - * @param fmt The format string (printf-compatible) that specifies how - * subsequent arguments are converted to output. - * @param vl The arguments referenced by the format string. - *) - // void av_vlog(void *avcl, int level, const char *fmt, va_list vl); - (* - * Get the current log level - * - * @see lavu_log_constants - * - * @return Current log level - *) - // int av_log_get_level(void); -function av_log_get_level: Integer; cdecl; - -(* - * Set the log level - * - * @see lavu_log_constants - * - * @param level Logging level -*) -// void av_log_set_level(int level); -procedure av_log_set_level(level: Integer); cdecl; - -(* - * Set the logging callback - * - * @note The callback must be thread safe, even if the application does not use - * threads itself as some codecs are multithreaded. - * - * @see av_log_default_callback - * - * @param callback A logging function with a compatible signature. -*) -// void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); -Type - Tav_log_set_callback = procedure(prt: Pointer; level: Integer; fmt: PAnsiChar; vl: PVA_LIST); cdecl varargs; - -procedure av_log_set_callback(callbackproc: Tav_log_set_callback); cdecl; - -(* - * Default logging callback - * - * It prints the message to stderr, optionally colorizing it. - * - * @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 expressed using a @ref - * lavu_log_constants "Logging Constant". - * @param fmt The format string (printf-compatible) that specifies how - * subsequent arguments are converted to output. - * @param ap The arguments referenced by the format string. -*) -// void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl); - -(* - * Return the context name - * - * @param ctx The AVClass context - * - * @return The AVClass class_name -*) -// const char* av_default_item_name(void* ctx); -function av_default_item_name(clx: Pointer): PAnsiChar; cdecl; - -// AVClassCategory av_default_get_category(void *ptr); -function av_default_get_category(ptr: Pointer): TAVClassCategory; cdecl; - -(* - * Format a line of log the same way as the default callback. - * @param line buffer to receive the formated line - * @param line_size size of the buffer - * @param print_prefix used to store whether the prefix must be printed; - * must point to a persistent integer initially set to 1 -*) -// void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, -// char *line, int line_size, int *print_prefix); -procedure av_log_format_line(ptr: Pointer; level: Integer; const fmt: PAnsiChar; vl: PVA_LIST; line: PAnsiChar; - line_size: Integer; Var print_prefix: Integer); cdecl; - -(* - * av_dlog macros - * Useful to print debug messages that shouldn't get compiled in normally. -*) -// #ifdef DEBUG -// # define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) -// #else -// # define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) -// #endif - -(* - * Skip repeated messages, this requires the user app to use av_log() instead of - * (f)printf as the 2 would otherwise interfere and lead to - * "Last message repeated x times" messages below (f)printf messages with some - * bad luck. - * Also to receive the last, "last repeated" line if any, the user app must - * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end -*) -const - AV_LOG_SKIP_REPEATED = 1; - AV_LOG_PRINT_LEVEL = 2; - - // void av_log_set_flags(int arg); -procedure av_log_set_flags(arg: Integer); cdecl; -// int av_log_get_flags(void); -function av_log_get_flags: Integer; cdecl; - -implementation - -uses ffm.lib; - -procedure av_log_set_flags; external avutil_dll; -function av_log_get_level; external avutil_dll; -procedure av_log_set_level; external avutil_dll; -function av_default_item_name; external avutil_dll; -function av_default_get_category; external avutil_dll; -function av_log_get_flags; external avutil_dll; -procedure av_log_set_callback; external avutil_dll; -procedure av_log_format_line; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.mathematics.pas b/source/ffmpeg/ffm.mathematics.pas deleted file mode 100644 index f1d5ebe..0000000 --- a/source/ffmpeg/ffm.mathematics.pas +++ /dev/null @@ -1,169 +0,0 @@ -(* - * copyright (c) 2005-2012 Michael Niedermayer - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.mathematics; - -{$i ffmpeg.inc} - -interface - -uses - ffm.rational; - -{$IFNDEF M_E} - -const - M_E = 2.7182818284590452354; (* e *) -{$ENDIF} -{$IFNDEF M_LN2} - -const - M_LN2 = 0.69314718055994530942; (* log_e 2 *) -{$ENDIF} -{$IFNDEF M_LN10} - -const - M_LN10 = 2.30258509299404568402; (* log_e 10 *) -{$ENDIF} -{$IFNDEF M_LOG2_10} - -const - M_LOG2_10 = 3.32192809488736234787; (* log_2 10 *) -{$ENDIF} -{$IFNDEF M_PHI} - -const - M_PHI = 1.61803398874989484820; (* phi / golden ratio *) -{$ENDIF} -{$IFNDEF M_PI} - -const - M_PI = 3.14159265358979323846; (* pi *) -{$ENDIF} -{$IFNDEF M_SQRT1_2} - -const - M_SQRT1_2 = 0.70710678118654752440; (* 1/sqrt(2) *) -{$ENDIF} -{$IFNDEF M_SQRT2} - -const - M_SQRT2 = 1.41421356237309504880; (* sqrt(2) *) -{$ENDIF} -{$IFNDEF NAN} - -const - NAN = $7FC00000; -{$ENDIF} -{$IFNDEF INFINITY} - -const - INFINITY = $7F800000; -{$ENDIF} - -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. - AV_ROUND_PASS_MINMAX = 8192 - /// < Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE - ); - - (* - * Return the greatest common divisor of a and b. - * If both a and b are 0 or either or both are <0 then behavior is - * undefined. - *) - // int64_t av_const av_gcd(int64_t a, int64_t b); - - (* - * Rescale a 64-bit integer with rounding to nearest. - * A simple a*b/c isn't possible as it can overflow. - *) - // int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; - - (* - * Rescale a 64-bit integer with specified rounding. - * A simple a*b/c isn't possible as it can overflow. - * - * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is - * INT64_MIN or INT64_MAX then a is passed through unchanged. - *) - // int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const; - - (* - * Rescale a 64-bit integer by 2 rational numbers. - *) - // int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; -function av_rescale_q(a: int64; bq: TAVRational; cq: TAVRational): int64; cdecl; - -(* - * Rescale a 64-bit integer by 2 rational numbers with specified rounding. - * - * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is - * INT64_MIN or INT64_MAX then a is passed through unchanged. -*) -// int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding)av_const; - -(* - * 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 -*) -// int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); - -(* - * 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 positive value if a is greater than b - * 0 if a equals b -*) -// int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); - -(* - * Rescale a timestamp while preserving known durations. - * - * @param in_ts Input timestamp - * @param in_tb Input timesbase - * @param fs_tb Duration and *last timebase - * @param duration duration till the next call - * @param out_tb Output timesbase -*) -// int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t * last, AVRational out_tb); - -implementation - -uses ffm.lib; - -function av_rescale_q; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.mem.pas b/source/ffmpeg/ffm.mem.pas deleted file mode 100644 index 0bb8643..0000000 --- a/source/ffmpeg/ffm.mem.pas +++ /dev/null @@ -1,359 +0,0 @@ -unit ffm.mem; - -{$i ffmpeg.inc} - -interface - -(* - * copyright (c) 2006 Michael Niedermayer - * - * This file is part of ffm. - * - * 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 -*) - -// #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) -// #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -// #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v -// #elif defined(__TI_COMPILER_VERSION__) -// #define DECLARE_ALIGNED(n,t,v) \ -// AV_PRAGMA(DATA_ALIGN(v,n)) \ -// t __attribute__((aligned(n))) v -// #define DECLARE_ASM_CONST(n,t,v) \ -// AV_PRAGMA(DATA_ALIGN(v,n)) \ -// static const t __attribute__((aligned(n))) v -// #elif defined(__GNUC__) -// #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -// #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v -// #elif defined(_MSC_VER) -// #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v -// #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v -// #else -// #define DECLARE_ALIGNED(n,t,v) t v -// #define DECLARE_ASM_CONST(n,t,v) static const t v -// #endif -// -// #if AV_GCC_VERSION_AT_LEAST(3,1) -// #define av_malloc_attrib __attribute__((__malloc__)) -// #else -// #define av_malloc_attrib -// #endif -// -// #if AV_GCC_VERSION_AT_LEAST(4,3) -// #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) -// #else -// #define av_alloc_size(...) -// #endif - -(* - * 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() -*) -// void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); -function av_malloc(size: Cardinal): Pointer; cdecl; - -(* - * Allocate a block of size * nmemb bytes with av_malloc(). - * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. - * @see av_malloc() -*) -// av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) -{ - if (!size || nmemb >= INT_MAX / size) - return NULL; - return av_malloc(nmemb * size); -} - -(* - * 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 ptr Pointer to a memory block already allocated with - * av_realloc() or NULL. - * @param size Size in bytes of the memory block to be allocated or - * reallocated. - * @return Pointer to a newly-reallocated block or NULL if the block - * cannot be reallocated or the function is used to free the memory block. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. - * @see av_fast_realloc() -*) -// void *av_realloc(void *ptr, size_t size) av_alloc_size(2); - -(* - * Allocate or reallocate a block of memory. - * This function does the same thing as av_realloc, except: - * - It takes two arguments and checks the result of the multiplication for - * integer overflow. - * - It frees the input block in case of failure, thus avoiding the memory - * leak with the classic "buf = realloc(buf); if (!buf) return -1;". -*) -// void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); - -(* - * 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 ptr Pointer to a pointer to a memory block already allocated - * with av_realloc(), or pointer to a pointer to NULL. - * The pointer is updated on success, or freed on failure. - * @param size Size in bytes for the memory block to be allocated or - * reallocated - * @return Zero on success, an AVERROR error code on failure. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_reallocp(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. -*) -// int av_reallocp(void *ptr, size_t size); - -(* - * Allocate or reallocate an array. - * If ptr is NULL and nmemb > 0, allocate a new block. If - * nmemb is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a memory block already allocated with - * av_realloc() or NULL. - * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to a newly-reallocated block or NULL if the block - * cannot be reallocated or the function is used to free the memory block. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. -*) -// av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); - -(* - * Allocate or reallocate an array through a pointer to a pointer. - * If *ptr is NULL and nmemb > 0, allocate a new block. If - * nmemb is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a pointer to a memory block already allocated - * with av_realloc(), or pointer to a pointer to NULL. - * The pointer is updated on success, or freed on failure. - * @param nmemb Number of elements - * @param size Size of the single element - * @return Zero on success, an AVERROR error code on failure. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. -*) -// av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); - -(* - * 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() -*) -// void av_free(void *ptr); -procedure av_free(ptr: Pointer); cdecl; - -(* - * Allocate a block of size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zero 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() -*) -// void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); -function av_mallocz(size: Cardinal): Pointer; cdecl; - -(* - * Allocate a block of nmemb * size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zero all the bytes of the block. - * The allocation will fail if nmemb * size is greater than or equal - * to INT_MAX. - * @param nmemb - * @param size - * @return Pointer to the allocated block, NULL if it cannot be allocated. -*) -// void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; - -(* - * Allocate a block of size * nmemb bytes with av_mallocz(). - * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. - * @see av_mallocz() - * @see av_malloc_array() -*) -// av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size) -{ - if (!size || nmemb >= INT_MAX / size) - return NULL; - return av_mallocz(nmemb * size); -} - -(* - * 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. -*) -// char *av_strdup(const char *s) av_malloc_attrib; -function av_strdup(const s: pAnsiChar): pAnsiChar; cdecl; - -(* - * Duplicate the buffer p. - * @param p buffer to be duplicated - * @return Pointer to a newly allocated buffer containing a - * copy of p or NULL if the buffer cannot be allocated. -*) -// void *av_memdup(const void *p, size_t size); - -(* - * Free a memory block which has been allocated with av_malloc(z)() or - * av_realloc() and set the pointer pointing to it to NULL. - * @param ptr Pointer to the pointer to the memory block which should - * be freed. - * @see av_free() -*) -// void av_freep(void *ptr); -procedure av_freep(ptr: Pointer); cdecl; - -(* - * Add an element to a dynamic array. - * - * The array to grow is supposed to be an array of pointers to - * structures, and the element to add must be a pointer to an already - * allocated structure. - * - * The array is reallocated when its size reaches powers of 2. - * Therefore, the amortized cost of adding an element is constant. - * - * In case of success, the pointer to the array is updated in order to - * point to the new grown array, and the number pointed to by nb_ptr - * is incremented. - * In case of failure, the array is freed, *tab_ptr is set to NULL and - * *nb_ptr is set to 0. - * - * @param tab_ptr pointer to the array to grow - * @param nb_ptr pointer to the number of elements in the array - * @param elem element to add - * @see av_dynarray2_add() -*) -// void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); - -(* - * Add an element of size elem_size to a dynamic array. - * - * The array is reallocated when its number of elements reaches powers of 2. - * Therefore, the amortized cost of adding an element is constant. - * - * In case of success, the pointer to the array is updated in order to - * point to the new grown array, and the number pointed to by nb_ptr - * is incremented. - * In case of failure, the array is freed, *tab_ptr is set to NULL and - * *nb_ptr is set to 0. - * - * @param tab_ptr pointer to the array to grow - * @param nb_ptr pointer to the number of elements in the array - * @param elem_size size in bytes of the elements in the array - * @param elem_data pointer to the data of the element to add. If NULL, the space of - * the new added element is not filled. - * @return pointer to the data of the element to copy in the new allocated space. - * If NULL, the new allocated space is left uninitialized." - * @see av_dynarray_add() -*) -// void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, -// const uint8_t *elem_data); - -(* - * Multiply two size_t values checking for overflow. - * @return 0 if success, AVERROR(EINVAL) if overflow. -*) -// static inline int av_size_mult(size_t a, size_t b, size_t *r) -{ - size_t t = a * b; - (* Hack inspired from glibc: only try the division if nelem and elsize - * are both greater than sqrt(SIZE_MAX). *) - if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) - return AVERROR(EINVAL); - *r = t; - return 0; -} - -(* - * Set the maximum size that may me allocated in one block. -*) -// void av_max_alloc(size_t max); - -(* - * deliberately overlapping memcpy implementation - * @param dst destination buffer - * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 - * @param cnt number of bytes to copy, must be >= 0 - * - * cnt > back is valid, this will copy the bytes we just copied, - * thus creating a repeating pattern with a period length of back. -*) -// void av_memcpy_backptr(uint8_t *dst, int back, int cnt); - -(* - * Reallocate the given block if it is not large enough, otherwise do nothing. - * - * @see av_realloc -*) -// void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); - -(* - * 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. -*) -// void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); - -implementation - -uses ffm.lib; - -procedure av_free; external avutil_dll; -procedure av_freep; external avutil_dll; -function av_strdup; external avutil_dll; -function av_malloc; external avutil_dll; -function av_mallocz; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.opt.pas b/source/ffmpeg/ffm.opt.pas deleted file mode 100644 index 618feec..0000000 --- a/source/ffmpeg/ffm.opt.pas +++ /dev/null @@ -1,792 +0,0 @@ -unit ffm.opt; - -{$i ffmpeg.inc} - -interface - -uses - ffm.ctypes, ffm.rational; - -/// * -// * AVOptions -// * copyright (c) 2005 Michael Niedermayer -// * -// * This file is part of ffm. -// * -// * 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 -// */ -// -/// ** -// * @file -// * AVOptions -// */ -// -// #include "rational.h" -// #include "avutil.h" -// #include "dict.h" -// #include "log.h" -// #include "pixfmt.h" -// #include "samplefmt.h" -// -/// ** -// * @defgroup avoptions AVOptions -// * @ingroup lavu_data -// * @{ -// * AVOptions provide a generic system to declare options on arbitrary structs -// * ("objects"). An option can have a help text, a type and a range of possible -// * values. Options may then be enumerated, read and written to. -// * -// * @section avoptions_implement Implementing AVOptions -// * This section describes how to add AVOptions capabilities to a struct. -// * -// * All AVOptions-related information is stored in an AVClass. Therefore -// * the first member of the struct should be a pointer to an AVClass describing it. -// * The option field of the AVClass must be set to a NULL-terminated static array -// * of AVOptions. Each AVOption must have a non-empty name, a type, a default -// * value and for number-type AVOptions also a range of allowed values. It must -// * also declare an offset in bytes from the start of the struct, where the field -// * associated with this AVOption is located. Other fields in the AVOption struct -// * should also be set when applicable, but are not required. -// * -// * The following example illustrates an AVOptions-enabled struct: -// * @code -// * typedef struct test_struct { -// * AVClass *class; -// * int int_opt; -// * char *str_opt; -// * uint8_t *bin_opt; -// * int bin_len; -// * } test_struct; -// * -// * static const AVOption test_options[] = { -// * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), -// * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, -// * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), -// * AV_OPT_TYPE_STRING }, -// * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), -// * AV_OPT_TYPE_BINARY }, -// * { NULL }, -// * }; -// * -// * static const AVClass test_class = { -// * .class_name = "test class", -// * .item_name = av_default_item_name, -// * .option = test_options, -// * .version = LIBAVUTIL_VERSION_INT, -// * }; -// * @endcode -// * -// * Next, when allocating your struct, you must ensure that the AVClass pointer -// * is set to the correct value. Then, av_opt_set_defaults() can be called to -// * initialize defaults. After that the struct is ready to be used with the -// * AVOptions API. -// * -// * When cleaning up, you may use the av_opt_free() function to automatically -// * free all the allocated string and binary options. -// * -// * Continuing with the above example: -// * -// * @code -// * test_struct *alloc_test_struct(void) -// * { -// * test_struct *ret = av_malloc(sizeof(*ret)); -// * ret->class = &test_class; -// * av_opt_set_defaults(ret); -// * return ret; -// * } -// * void free_test_struct(test_struct **foo) -// * { -// * av_opt_free(*foo); -// * av_freep(foo); -// * } -// * @endcode -// * -// * @subsection avoptions_implement_nesting Nesting -// * It may happen that an AVOptions-enabled struct contains another -// * AVOptions-enabled struct as a member (e.g. AVCodecContext in -// * libavcodec exports generic options, while its priv_data field exports -// * codec-specific options). In such a case, it is possible to set up the -// * parent struct to export a child's options. To do that, simply -// * implement AVClass.child_next() and AVClass.child_class_next() in the -// * parent struct's AVClass. -// * Assuming that the test_struct from above now also contains a -// * child_struct field: -// * -// * @code -// * typedef struct child_struct { -// * AVClass *class; -// * int flags_opt; -// * } child_struct; -// * static const AVOption child_opts[] = { -// * { "test_flags", "This is a test option of flags type.", -// * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, -// * { NULL }, -// * }; -// * static const AVClass child_class = { -// * .class_name = "child class", -// * .item_name = av_default_item_name, -// * .option = child_opts, -// * .version = LIBAVUTIL_VERSION_INT, -// * }; -// * -// * void *child_next(void *obj, void *prev) -// * { -// * test_struct *t = obj; -// * if (!prev && t->child_struct) -// * return t->child_struct; -// * return NULL -// * } -// * const AVClass child_class_next(const AVClass *prev) -// * { -// * return prev ? NULL : &child_class; -// * } -// * @endcode -// * Putting child_next() and child_class_next() as defined above into -// * test_class will now make child_struct's options accessible through -// * test_struct (again, proper setup as described above needs to be done on -// * child_struct right after it is created). -// * -// * From the above example it might not be clear why both child_next() -// * and child_class_next() are needed. The distinction is that child_next() -// * iterates over actually existing objects, while child_class_next() -// * iterates over all possible child classes. E.g. if an AVCodecContext -// * was initialized to use a codec which has private options, then its -// * child_next() will return AVCodecContext.priv_data and finish -// * iterating. OTOH child_class_next() on AVCodecContext.av_class will -// * iterate over all available codecs with private options. -// * -// * @subsection avoptions_implement_named_constants Named constants -// * It is possible to create named constants for options. Simply set the unit -// * field of the option the constants should apply to a string and -// * create the constants themselves as options of type AV_OPT_TYPE_CONST -// * with their unit field set to the same string. -// * Their default_val field should contain the value of the named -// * constant. -// * For example, to add some named constants for the test_flags option -// * above, put the following into the child_opts array: -// * @code -// * { "test_flags", "This is a test option of flags type.", -// * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, -// * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, -// * @endcode -// * -// * @section avoptions_use Using AVOptions -// * This section deals with accessing options in an AVOptions-enabled struct. -// * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or -// * AVFormatContext in libavformat. -// * -// * @subsection avoptions_use_examine Examining AVOptions -// * The basic functions for examining options are av_opt_next(), which iterates -// * over all options defined for one object, and av_opt_find(), which searches -// * for an option with the given name. -// * -// * The situation is more complicated with nesting. An AVOptions-enabled struct -// * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag -// * to av_opt_find() will make the function search children recursively. -// * -// * For enumerating there are basically two cases. The first is when you want to -// * get all options that may potentially exist on the struct and its children -// * (e.g. when constructing documentation). In that case you should call -// * av_opt_child_class_next() recursively on the parent struct's AVClass. The -// * second case is when you have an already initialized struct with all its -// * children and you want to get all options that can be actually written or read -// * from it. In that case you should call av_opt_child_next() recursively (and -// * av_opt_next() on each result). -// * -// * @subsection avoptions_use_get_set Reading and writing AVOptions -// * When setting options, you often have a string read directly from the -// * user. In such a case, simply passing it to av_opt_set() is enough. For -// * non-string type options, av_opt_set() will parse the string according to the -// * option type. -// * -// * Similarly av_opt_get() will read any option type and convert it to a string -// * which will be returned. Do not forget that the string is allocated, so you -// * have to free it with av_free(). -// * -// * In some cases it may be more convenient to put all options into an -// * AVDictionary and call av_opt_set_dict() on it. A specific case of this -// * are the format/codec open functions in lavf/lavc which take a dictionary -// * filled with option as a parameter. This allows to set some options -// * that cannot be set otherwise, since e.g. the input file format is not known -// * before the file is actually opened. -// */ -Type - TAVOptionType = ( - { } AV_OPT_TYPE_FLAGS, - { } AV_OPT_TYPE_INT, - { } AV_OPT_TYPE_INT64, - { } AV_OPT_TYPE_DOUBLE, - { } AV_OPT_TYPE_FLOAT, - { } AV_OPT_TYPE_STRING, - { } AV_OPT_TYPE_RATIONAL, - { } AV_OPT_TYPE_BINARY, - // < offset must point to a pointer immediately followed by an int for the length - { } AV_OPT_TYPE_CONST = 128, - { } AV_OPT_TYPE_IMAGE_SIZE = $53495A45, - // MKBETAG('S', 'I', 'Z', 'E'), // < offset must point to two consecutive integers - { } AV_OPT_TYPE_PIXEL_FMT = $50464D54, // MKBETAG('P', 'F', 'M', 'T'), - { } AV_OPT_TYPE_SAMPLE_FMT = $53464D54, // MKBETAG('S', 'F', 'M', 'T'), - { } AV_OPT_TYPE_VIDEO_RATE = $56524154, // MKBETAG('V', 'R', 'A', 'T'), // < offset must point to AVRational - { } AV_OPT_TYPE_DURATION = $44555220, // MKBETAG('D', 'U', 'R', ' '), - { } AV_OPT_TYPE_COLOR = $434F4C52, // MKBETAG('C', 'O', 'L', 'R'), - { } AV_OPT_TYPE_CHANNEL_LAYOUT = $43484C41 // MKBETAG('C', 'H', 'L', 'A'), -{$IFDEF FF_API_OLD_AVOPTIONS} - , - { } FF_OPT_TYPE_FLAGS = 0, - { } 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 -{$ENDIF} - ); - -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; - AV_OPT_FLAG_FILTERING_PARAM = (1 shl 16); - - /// < a generic parameter which can be set by the user for filtering - /// -Type - (* - * AVOption - *) - pAVOption = ^TAVOption; - - TAVOption = { packed } record - name: pAnsiChar; - (* - * short English help text - * @todo What about other languages? - *) - help: pAnsiChar; - (* - * The offset relative to the context structure where the option - * value is stored. It should be 0 for named constants. - *) - offset: Integer; - _type: TAVOptionType; - (* - * the default value for scalar options - *) - default_val: record case cint of 0: (i64: cint64); - 1: (dbl: cdouble); - 2: (str: pAnsiChar); - (* TODO those are unused now *) - 3: (q: TAVRational); - end; - -min: -double; -/// < minimum valid value for the option -max: -double; -/// < maximum valid value for the option - -flags: -Integer; -// 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: -pAnsiChar; -end; - -(* - // * A single allowed range of values, or a single allowed value. -*) -pAVOptionRange = ^TAVOptionRange; -ppAVOptionRange = ^pAVOptionRange; -TAVOptionRange = { packed } record str: pAnsiChar; -value_min, value_max: double; -/// < For string ranges this represents the min/max length, for dimensions this represents the min/max pixel count -component_min, component_max: double; -/// < For string this represents the unicode range for chars, 0-127 limits to ASCII -is_range: -Integer; -/// < if set to 1 the struct encodes a range, if set to 0 a single value -end; -(* - // * List of AVOptionRange structs -*) -pAVOptionRanges = ^TAVOptionRanges; -ppAVOptionRanges = ^pAVOptionRanges; -TAVOptionRanges = { packed } record range: ppAVOptionRange; -nb_ranges: -Integer; -end; - -// -// #if FF_API_FIND_OPT -(* - // * 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 - // * - // * @deprecated use av_opt_find. -*) -// attribute_deprecated -// const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int mask, int flags); -// #endif -// -// #if FF_API_OLD_AVOPTIONS -(* - // * 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 this parameter is currently ignored - // * @return 0 if the value has been set, or an AVERROR code in case of - // * error: - // * AVERROR_OPTION_NOT_FOUND if no matching option exists - // * AVERROR(ERANGE) if the value is out of range - // * AVERROR(EINVAL) if the value is not valid - // * @deprecated use av_opt_set() -*) -// attribute_deprecated -// int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out); -// -// attribute_deprecated const AVOption *av_set_double(void *obj, const char *name, double n); -// attribute_deprecated const AVOption *av_set_q(void *obj, const char *name, AVRational n); -// attribute_deprecated const AVOption *av_set_int(void *obj, const char *name, int64_t n); -// -// double av_get_double(void *obj, const char *name, const AVOption **o_out); -// AVRational av_get_q(void *obj, const char *name, const AVOption **o_out); -// int64_t av_get_int(void *obj, const char *name, const AVOption **o_out); -// attribute_deprecated const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len); -// attribute_deprecated const AVOption *av_next_option(void *obj, const AVOption *last); -// #endif -// -(* - // * Show the obj options. - // * - // * @param req_flags requested flags for the options to show. Show only the - // * options for which it is opt->flags & req_flags. - // * @param rej_flags rejected flags for the options to show. Show only the - // * options for which it is !(opt->flags & req_flags). - // * @param av_log_obj log context to use for showing the options -*) -// int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); -// -(* - // * Set the values of all AVOption fields to their default values. - // * - // * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) -*) -// void av_opt_set_defaults(void *s); -// -// #if FF_API_OLD_AVOPTIONS -// attribute_deprecated -// void av_opt_set_defaults2(void *s, int mask, int flags); -// #endif -// -(* - // * Parse the key/value pairs list in opts. For each key/value pair - // * found, stores the value in the field in ctx that is named like the - // * key. ctx must be an AVClass context, storing is done using - // * AVOptions. - // * - // * @param opts options string to parse, may be NULL - // * @param key_val_sep a 0-terminated list of characters used to - // * separate key from value - // * @param pairs_sep a 0-terminated list of characters used to separate - // * two pairs from each other - // * @return the number of successfully set key/value pairs, or a negative - // * value corresponding to an AVERROR code in case of error: - // * AVERROR(EINVAL) if opts cannot be parsed, - // * the error code issued by av_set_string3() if a key/value pair - // * cannot be set -*) -// int av_set_options_string(void *ctx, const char *opts, -// const char *key_val_sep, const char *pairs_sep); -// -(* - // * Parse the key-value pairs list in opts. For each key=value pair found, - // * set the value of the corresponding option in ctx. - // * - // * @param ctx the AVClass object to set options on - // * @param opts the options string, key-value pairs separated by a - // * delimiter - // * @param shorthand a NULL-terminated array of options names for shorthand - // * notation: if the first field in opts has no key part, - // * the key is taken from the first element of shorthand; - // * then again for the second, etc., until either opts is - // * finished, shorthand is finished or a named option is - // * found; after that, all options must be named - // * @param key_val_sep a 0-terminated list of characters used to separate - // * key from value, for example '=' - // * @param pairs_sep a 0-terminated list of characters used to separate - // * two pairs from each other, for example ':' or ',' - // * @return the number of successfully set key=value pairs, or a negative - // * value corresponding to an AVERROR code in case of error: - // * AVERROR(EINVAL) if opts cannot be parsed, - // * the error code issued by av_set_string3() if a key/value pair - // * cannot be set - // * - // * Options names must use only the following characters: a-z A-Z 0-9 - . / _ - // * Separators must use characters distinct from option names and from each - // * other. -*) -// int av_opt_set_from_string(void *ctx, const char *opts, -// const char *const *shorthand, -// const char *key_val_sep, const char *pairs_sep); -(* - // * Free all string and binary options in obj. -*) -// void av_opt_free(void *obj); -// -/// ** -// * Check whether a particular flag is set in a flags field. -// * -// * @param field_name the name of the flag field option -// * @param flag_name the name of the flag to check -// * @return non-zero if the flag is set, zero if the flag isn't set, -// * isn't of the right type, or the flags field doesn't exist. -// */ -// int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); -// -/// ** -// * Set all the options from a given dictionary on an object. -// * -// * @param obj a struct whose first element is a pointer to AVClass -// * @param options options to process. This dictionary will be freed and replaced -// * by a new one containing all options not found in obj. -// * Of course this new dictionary needs to be freed by caller -// * with av_dict_free(). -// * -// * @return 0 on success, a negative AVERROR if some option was found in obj, -// * but could not be set. -// * -// * @see av_dict_copy() -// */ -// int av_opt_set_dict(void *obj, struct AVDictionary **options); -// -/// ** -// * Extract a key-value pair from the beginning of a string. -// * -// * @param ropts pointer to the options string, will be updated to -// * point to the rest of the string (one of the pairs_sep -// * or the final NUL) -// * @param key_val_sep a 0-terminated list of characters used to separate -// * key from value, for example '=' -// * @param pairs_sep a 0-terminated list of characters used to separate -// * two pairs from each other, for example ':' or ',' -// * @param flags flags; see the AV_OPT_FLAG_* values below -// * @param rkey parsed key; must be freed using av_free() -// * @param rval parsed value; must be freed using av_free() -// * -// * @return >=0 for success, or a negative value corresponding to an -// * AVERROR code in case of error; in particular: -// * AVERROR(EINVAL) if no key is present -// * -// */ -// int av_opt_get_key_value(const char **ropts, -// const char *key_val_sep, const char *pairs_sep, -// unsigned flags, -// char **rkey, char **rval); -// -// enum { -// -// /** -// * Accept to parse a value without a key; the key will then be returned -// * as NULL. -// */ -// AV_OPT_FLAG_IMPLICIT_KEY = 1, -// }; -// -/// ** -// * @defgroup opt_eval_funcs Evaluating option strings -// * @{ -// * This group of functions can be used to evaluate option strings -// * and get numbers out of them. They do the same thing as av_opt_set(), -// * except the result is written into the caller-supplied pointer. -// * -// * @param obj a struct whose first element is a pointer to AVClass. -// * @param o an option for which the string is to be evaluated. -// * @param val string to be evaluated. -// * @param *_out value of the string will be written here. -// * -// * @return 0 on success, a negative number on failure. -// */ -// int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); -// int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); -// int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); -// int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); -// int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); -// int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); - -const - AV_OPT_SEARCH_CHILDREN = $0001; (* *< Search in possible children of the given object first. *) - - (* - * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass - * instead of a required pointer to a struct containing AVClass. This is - * useful for searching for options without needing to allocate the corresponding - * object. - *) - // #define AV_OPT_SEARCH_FAKE_OBJ 0x0002 - // - /// ** - // * Look for an option in an object. Consider only options which - // * have all the specified flags set. - // * - // * @param[in] obj A pointer to a struct whose first element is a - // * pointer to an AVClass. - // * Alternatively a double pointer to an AVClass, if - // * AV_OPT_SEARCH_FAKE_OBJ search flag is set. - // * @param[in] name The name of the option to look for. - // * @param[in] unit When searching for named constants, name of the unit - // * it belongs to. - // * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). - // * @param search_flags A combination of AV_OPT_SEARCH_*. - // * - // * @return A pointer to the option found, or NULL if no option - // * was found. - // * - // * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable - // * directly with av_set_string3(). Use special calls which take an options - // * AVDictionary (e.g. avformat_open_input()) to set options found with this - // * flag. - // */ - // const AVOption *av_opt_find(void *obj, const char *name, const char *unit, - // int opt_flags, int search_flags); - // - /// ** - // * Look for an option in an object. Consider only options which - // * have all the specified flags set. - // * - // * @param[in] obj A pointer to a struct whose first element is a - // * pointer to an AVClass. - // * Alternatively a double pointer to an AVClass, if - // * AV_OPT_SEARCH_FAKE_OBJ search flag is set. - // * @param[in] name The name of the option to look for. - // * @param[in] unit When searching for named constants, name of the unit - // * it belongs to. - // * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). - // * @param search_flags A combination of AV_OPT_SEARCH_*. - // * @param[out] target_obj if non-NULL, an object to which the option belongs will be - // * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present - // * in search_flags. This parameter is ignored if search_flags contain - // * AV_OPT_SEARCH_FAKE_OBJ. - // * - // * @return A pointer to the option found, or NULL if no option - // * was found. - // */ - // const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, - // int opt_flags, int search_flags, void **target_obj); - // - /// ** - // * Iterate over all AVOptions belonging to obj. - // * - // * @param obj an AVOptions-enabled struct or a double pointer to an - // * AVClass describing it. - // * @param prev result of the previous call to av_opt_next() on this object - // * or NULL - // * @return next AVOption or NULL - // */ - // const AVOption *av_opt_next(void *obj, const AVOption *prev); - // - /// ** - // * Iterate over AVOptions-enabled children of obj. - // * - // * @param prev result of a previous call to this function or NULL - // * @return next AVOptions-enabled child or NULL - // */ - // void *av_opt_child_next(void *obj, void *prev); - // - /// ** - // * Iterate over potential AVOptions-enabled children of parent. - // * - // * @param prev result of a previous call to this function or NULL - // * @return AVClass corresponding to next potential child or NULL - // */ - // const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev); - // - /// ** - // * @defgroup opt_set_funcs Option setting functions - // * @{ - // * Those functions set the field of obj with the given name to value. - // * - // * @param[in] obj A struct whose first element is a pointer to an AVClass. - // * @param[in] name the name of the field to set - // * @param[in] val The value to set. In case of av_opt_set() if the field is not - // * of a string type, then the given string is parsed. - // * SI postfixes and some named scalars are supported. - // * If the field is of a numeric type, it has to be a numeric or named - // * scalar. Behavior with more than one scalar and +- infix operators - // * is undefined. - // * If the field is of a flags type, it has to be a sequence of numeric - // * scalars or named flags separated by '+' or '-'. Prefixing a flag - // * with '+' causes it to be set without affecting the other flags; - // * similarly, '-' unsets a flag. - // * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN - // * is passed here, then the option may be set on a child of obj. - // * - // * @return 0 if the value has been set, or an AVERROR code in case of - // * error: - // * AVERROR_OPTION_NOT_FOUND if no matching option exists - // * AVERROR(ERANGE) if the value is out of range - // * AVERROR(EINVAL) if the value is not valid - // */ - // int av_opt_set (void *obj, const char *name, const char *val, int search_flags); -function av_opt_set(obj: Pointer; const name: pAnsiChar; const val: pAnsiChar; search_flags: Integer): Integer; cdecl; -// int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); -// int av_opt_set_double(void *obj, const char *name, double val, int search_flags); -// int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); -// int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); - function av_opt_set_bin(obj: Pointer; const name: pAnsiChar; const val: PByte; size: Integer; search_flags: Integer) - : Integer; cdecl; - // int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); - // int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); - // int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); - // int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); - // int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); - // - /// ** - // * Set a binary option to an integer list. - // * - // * @param obj AVClass object to set options on - // * @param name name of the binary option - // * @param val pointer to an integer list (must have the correct type with - // * regard to the contents of the list) - // * @param term list terminator (usually 0 or -1) - // * @param flags search flags - // */ - // #define av_opt_set_int_list(obj, name, val, term, flags) \ - // (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ - // AVERROR(EINVAL) : \ - // av_opt_set_bin(obj, name, (const uint8_t *)(val), \ - // av_int_list_length(val, term) * sizeof(*(val)), flags)) - /// ** - // * @} - // */ - // - /// ** - // * @defgroup opt_get_funcs Option getting functions - // * @{ - // * Those functions get a value of the option with the given name from an object. - // * - // * @param[in] obj a struct whose first element is a pointer to an AVClass. - // * @param[in] name name of the option to get. - // * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN - // * is passed here, then the option may be found in a child of obj. - // * @param[out] out_val value of the option will be written here - // * @return >=0 on success, a negative error code otherwise - // */ - /// ** - // * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller - // */ - // int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); - // int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); - // int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val); - // int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); - // int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); - // int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); - // int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); - // int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); - // int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); - /// ** - // * @} - // */ - /// ** - // * Gets a pointer to the requested field in a struct. - // * This function allows accessing a struct even when its fields are moved or - // * renamed since the application making the access has been compiled, - // * - // * @returns a pointer to the field, it can be cast to the correct type and read - // * or written to. - // */ - // void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); - // - /// ** - // * Free an AVOptionRanges struct and set it to NULL. - // */ - // void av_opt_freep_ranges(AVOptionRanges **ranges); - // - /// ** - // * Get a list of allowed ranges for the given option. - // * - // * The returned list may depend on other fields in obj like for example profile. - // * - // * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored - // * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance - // * - // * The result must be freed with av_opt_freep_ranges. - // * - // * @return >= 0 on success, a negative errro code otherwise - // */ - // int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); - // - /// ** - // * Get a default list of allowed ranges for the given option. - // * - // * This list is constructed without using the AVClass.query_ranges() callback - // * and can be used as fallback from within the callback. - // * - // * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored - // * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance - // * - // * The result must be freed with av_opt_free_ranges. - // * - // * @return >= 0 on success, a negative errro code otherwise - // */ - // int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); - // - /// ** - // * @} - // */ - -implementation - -uses ffm.lib; - -function av_opt_set_bin; external avutil_dll; -function av_opt_set; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.parseutils.pas b/source/ffmpeg/ffm.parseutils.pas deleted file mode 100644 index f636ccb..0000000 --- a/source/ffmpeg/ffm.parseutils.pas +++ /dev/null @@ -1,202 +0,0 @@ -unit ffm.parseutils; - -{$i ffmpeg.inc} - -interface - -uses - ffm.rational; - -(* - * This file is part of ffm. - * - * 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 -*) - -(* - * @file - * misc parsing utilities -*) - -(* - * Parse str and store the parsed ratio in q. - * - * Note that a ratio with infinite (1/0) or negative value is - * considered valid, so you should check on the returned value if you - * want to exclude those values. - * - * The undefined value can be expressed using the "0:0" string. - * - * @param[in,out] q pointer to the AVRational which will contain the ratio - * @param[in] str the string to parse: it has to be a string in the format - * num:den, a float number or an expression - * @param[in] max the maximum allowed numerator and denominator - * @param[in] log_offset log level offset which is applied to the log - * level of log_ctx - * @param[in] log_ctx parent logging context - * @return >= 0 on success, a negative error code otherwise -*) -//int av_parse_ratio(AVRational * q, const char * str, int max, int log_offset, void * log_ctx); -function av_parse_ratio(p:pAVRational; const str:PAnsiString; max:Integer; log_offset:Integer; log_ctx:pointer):integer; cdecl; - -//#define av_parse_ratio_quiet(rate, str, max)\ -//av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) -function av_parse_ratio_quiet(p:pAVRational; const str:PAnsiString; max:Integer):Integer; inline; - -(* - * Parse str and put in width_ptr and height_ptr the detected values. - * - * @param[in,out] width_ptr pointer to the variable which will contain the detected - * width value - * @param[in,out] height_ptr pointer to the variable which will contain the detected - * height value - * @param[in] str the string to parse: it has to be a string in the format - * width x height or a valid video size abbreviation. - * @return >= 0 on success, a negative error code otherwise -*) -// int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); -function av_parse_video_size(Var width_ptr: Integer; Var height_ptr: Integer; const str: pAnsiChar): Integer; -cdecl; - -(* - * Parse str and store the detected values in *rate. - * - * @param[in,out] rate pointer to the AVRational which will contain the detected - * frame rate - * @param[in] str the string to parse: it has to be a string in the format - * rate_num / rate_den, a float number or a valid video rate abbreviation - * @return >= 0 on success, a negative error code otherwise -*) -//int av_parse_video_rate(AVRational * rate, const char * str); - -(* - * Put the RGBA values that correspond to color_string in rgba_color. - * - * @param color_string a string specifying a color. It can be the name of - * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, - * possibly followed by "@" and a string representing the alpha - * component. - * The alpha component may be a string composed by "0x" followed by an - * hexadecimal number or a decimal number between 0.0 and 1.0, which - * represents the opacity value (0x00/0.0 means completely transparent, - * 0xff/1.0 completely opaque). - * If the alpha component is not specified then 0xff is assumed. - * The string "random" will result in a random color. - * @param slen length of the initial part of color_string containing the - * color. It can be set to -1 if color_string is a null terminated string - * containing nothing else than the color. - * @return >= 0 in case of success, a negative value in case of - * failure (for example if color_string cannot be parsed). -*) -//int av_parse_color(uint8_t * rgba_color, const char * color_string, int slen, void * log_ctx); - -(* - * Get the name of a color from the internal table of hard-coded named - * colors. - * - * This function is meant to enumerate the color names recognized by - * av_parse_color(). - * - * @param color_idx index of the requested color, starting from 0 - * @param rgbp if not NULL, will point to a 3-elements array with the color value in RGB - * @return the color name string or NULL if color_idx is not in the array -*) -//const char * av_get_known_color_name(int color_idx, const uint8_t * * rgb); - -(* - * Parse timestr and return in *time a corresponding number of - * microseconds. - * - * @param timeval puts here the number of microseconds corresponding - * to the string in timestr. If the string represents a duration, it - * is the number of microseconds contained in the time interval. If - * the string is a date, is the number of microseconds since 1st of - * January, 1970 up to the time of the parsed date. If timestr cannot - * be successfully parsed, set *time to INT64_MIN. - - * @param timestr a string representing a date or a duration. - * - If a date the syntax is: - * @code - * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] - * now - * @endcode - * If the value is "now" it takes the current time. - * Time is local time 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. - * - If a duration the syntax is: - * @code - * [-][HH:]MM:SS[.m...] - * [-]S+[.m...] - * @endcode - * @param duration flag which tells how to interpret timestr, if not - * zero timestr is interpreted as a duration, otherwise as a date - * @return >= 0 in case of success, a negative value corresponding to an - * AVERROR code otherwise -*) -//int av_parse_time(int64_t * timeval, const char * timestr, int duration); - -(* - * Parse the input string p according to the format string fmt and - * store its results in the structure dt. - * This implementation supports only a subset of the formats supported - * by the standard strptime(). - * - * In particular it actually supports the parameters: - * - %H: the hour as a decimal number, using a 24-hour clock, in the - * range '00' through '23' - * - %J: hours as a decimal number, in the range '0' through INT_MAX - * - %M: the minute as a decimal number, using a 24-hour clock, in the - * range '00' through '59' - * - %S: the second as a decimal number, using a 24-hour clock, in the - * range '00' through '59' - * - %Y: the year as a decimal number, using the Gregorian calendar - * - %m: the month as a decimal number, in the range '1' through '12' - * - %d: the day of the month as a decimal number, in the range '1' - * through '31' - * - %%: a literal '%' - * - * @return a pointer to the first character not processed in this - * function call, or NULL in case the function fails to match all of - * the fmt string and therefore an error occurred -*) -//char * av_small_strptime(const char * p, const char * fmt, struct tm * dt); - -(* - * Attempt to find a specific tag in a URL. - * - * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. - * Return 1 if found. -*) -//int av_find_info_tag(char * arg, int arg_size, const char * tag1, const char * info); - -(* - * Convert the decomposed UTC time in tm to a time_t value. -*) -//time_t av_timegm(struct tm * tm); - -implementation - -uses ffm.lib, ffm.log; - -function av_parse_video_size; external avutil_dll; -function av_parse_ratio; external avutil_dll; -function av_parse_ratio_quiet; -begin - Result := av_parse_ratio(p,str,max,AV_LOG_MAX_OFFSET, nil); -end; - -end. diff --git a/source/ffmpeg/ffm.pixdesc.pas b/source/ffmpeg/ffm.pixdesc.pas deleted file mode 100644 index d74de41..0000000 --- a/source/ffmpeg/ffm.pixdesc.pas +++ /dev/null @@ -1,304 +0,0 @@ -(* - * pixel format descriptor - * Copyright (c) 2009 Michael Niedermayer - * - * This file is part of ffm. - * - * 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 -*) - -unit ffm.pixdesc; - -{$i ffmpeg.inc} - -interface - -uses - ffm.pixfmt; - -Type - - pAVComponentDescriptor = ^TAVComponentDescriptor; - - TAVComponentDescriptor = {packed} record - // uint16_t plane :2; ///< which of the 4 planes contains the component - (* - * Number of elements between 2 horizontally consecutive pixels minus 1. - * Elements are bits for bitstream formats, bytes otherwise. - *) - // uint16_t step_minus1 :3; - (* - * Number of elements before the component of the first pixel plus 1. - * Elements are bits for bitstream formats, bytes otherwise. - *) - // uint16_t offset_plus1 :3; - // uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value - // uint16_t depth_minus1 :4; ///< number of bits in the component minus 1 - data: uint16; - end; - - (* - * Descriptor that unambiguously describes how the bits of a pixel are - * stored in the up to 4 data planes of an image. It also stores the - * subsampling factors and number of components. - * - * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV - * and all the YUV variants) AVPixFmtDescriptor just stores how values - * are stored not what these values represent. - *) - pAVPixFmtDescriptor = ^TAVPixFmtDescriptor; - - TAVPixFmtDescriptor = {packed} record - name: pAnsiChar; - nb_components: uint8; - /// < The number of components each pixel has, (1-4) - (* - * Amount to shift the luma width right to find the chroma width. - * For YV12 this is 1 for example. - * chroma_width = -((-luma_width) >> log2_chroma_w) - * The note above is needed to ensure rounding up. - * This value only refers to the chroma components. - *) - log2_chroma_w: uint8; - /// < chroma_width = -((-luma_width )>>log2_chroma_w) - (* - * Amount to shift the luma height right to find the chroma height. - * For YV12 this is 1 for example. - * chroma_height= -((-luma_height) >> log2_chroma_h) - * The note above is needed to ensure rounding up. - * This value only refers to the chroma components. - *) - log2_chroma_h: uint8; - flags: uint8; - (* - * Parameters that describe how pixels are {packed}. - * If the format has 2 or 4 components, then alpha is last. - * If the format has 1 or 2 components, then luma is 0. - * If the format has 3 or 4 components, - * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; - * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. - *) - comp: array [0 .. 3] of TAVComponentDescriptor; - end; - -const - (* - * Pixel format is big-endian. - *) - AV_PIX_FMT_FLAG_BE = (1 shl 0); - (* - * Pixel format has a palette in data[1], values are indexes in this palette. - *) - AV_PIX_FMT_FLAG_PAL = (1 shl 1); - (* - * All values of a component are bit-wise {packed} end to end. - *) - AV_PIX_FMT_FLAG_BITSTREAM = (1 shl 2); - (* - * Pixel format is an HW accelerated format. - *) - AV_PIX_FMT_FLAG_HWACCEL = (1 shl 3); - (* - * At least one pixel component is not in the first data plane. - *) - AV_PIX_FMT_FLAG_PLANAR = (1 shl 4); - (* - * The pixel format contains RGB-like data (as opposed to YUV/grayscale). - *) - AV_PIX_FMT_FLAG_RGB = (1 shl 5); - (* - * The pixel format is "pseudo-paletted". This means that FFmpeg treats it as - * paletted internally, but the palette is generated by the decoder and is not - * stored in the file. - *) - AV_PIX_FMT_FLAG_PSEUDOPAL = (1 shl 6); - (* - * The pixel format has an alpha channel. - *) - AV_PIX_FMT_FLAG_ALPHA = (1 shl 7); - -{$IFDEF FF_API_PIX_FMT} - (* - * @deprecated use the AV_PIX_FMT_FLAG_* flags - *) - PIX_FMT_BE = AV_PIX_FMT_FLAG_BE; - PIX_FMT_PAL = AV_PIX_FMT_FLAG_PAL; - PIX_FMT_BITSTREAM = AV_PIX_FMT_FLAG_BITSTREAM; - PIX_FMT_HWACCEL = AV_PIX_FMT_FLAG_HWACCEL; - PIX_FMT_PLANAR = AV_PIX_FMT_FLAG_PLANAR; - PIX_FMT_RGB = AV_PIX_FMT_FLAG_RGB; - PIX_FMT_PSEUDOPAL = AV_PIX_FMT_FLAG_PSEUDOPAL; - PIX_FMT_ALPHA = AV_PIX_FMT_FLAG_ALPHA; -{$ENDIF} -{$IFDEF FF_API_PIX_FMT_DESC} - (* - * The array of all the pixel format descriptors. - *) -extern attribute_deprecated - -const -AVPixFmtDescriptor av_pix_fmt_descriptors[]; -{$ENDIF} -(* - * Read a line from an image, and write the values of the - * pixel format component c to dst. - * - * @param data the array containing the pointers to the planes of the image - * @param linesize the array containing the linesizes of the image - * @param desc the pixel format descriptor for the image - * @param x the horizontal coordinate of the first pixel to read - * @param y the vertical coordinate of the first pixel to read - * @param w the width of the line to read, that is the number of - * values to write to dst - * @param read_pal_component if not zero and the format is a paletted - * format writes the values corresponding to the palette - * component c in data[1] to dst, rather than the palette indexes in - * data[0]. The behavior is undefined if the format is not paletted. -*) -// void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4], -// const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component); - -(* - * Write the values from src to the pixel format component c of an - * image line. - * - * @param src array containing the values to write - * @param data the array containing the pointers to the planes of the - * image to write into. It is supposed to be zeroed. - * @param linesize the array containing the linesizes of the image - * @param desc the pixel format descriptor for the image - * @param x the horizontal coordinate of the first pixel to write - * @param y the vertical coordinate of the first pixel to write - * @param w the width of the line to write, that is the number of - * values to write to the image line -*) -// void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4], -// const AVPixFmtDescriptor *desc, int x, int y, int c, int w); - -(* - * Return the pixel format corresponding to 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 AV_PIX_FMT_NONE. -*) -// enum AVPixelFormat av_get_pix_fmt(const char *name); - -(* - * Return the short name for a pixel format, NULL in case pix_fmt is - * unknown. - * - * @see av_get_pix_fmt(), av_get_pix_fmt_string() -*) -// const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); -function av_get_pix_fmt_name(pix_fmt: TAVPixelFormat): pAnsiChar; cdecl; - -(* - * Print in buf the string corresponding to the pixel format with - * number pix_fmt, or a header if pix_fmt is negative. - * - * @param buf the buffer where to write the string - * @param buf_size the size of buf - * @param pix_fmt the number of the pixel format to print the - * corresponding info string, or a negative value to print the - * corresponding header. -*) -// char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt); - -(* - * Return the number of bits per pixel used by the pixel format - * described by pixdesc. Note that this is not the same as the number - * of bits per sample. - * - * The returned number of bits refers to the number of bits actually - * used for storing the pixel information, that is padding bits are - * not counted. -*) -// int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); - -(* - * Return the number of bits per pixel for the pixel format - * described by pixdesc, including any padding or unused bits. -*) -// int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); - -(* - * @return a pixel format descriptor for provided pixel format or NULL if - * this pixel format is unknown. -*) -// const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); - -(* - * Iterate over all pixel format descriptors known to libavutil. - * - * @param prev previous descriptor. NULL to get the first descriptor. - * - * @return next descriptor or NULL after the last descriptor -*) -// const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); - -(* - * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc - * is not a valid pointer to a pixel format descriptor. -*) -// enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); - -(* - * Utility function to access log2_chroma_w log2_chroma_h from - * the pixel format AVPixFmtDescriptor. - * - * See avcodec_get_chroma_sub_sample() for a function that asserts a - * valid pixel format instead of returning an error code. - * Its recommanded that you use avcodec_get_chroma_sub_sample unless - * you do check the return code! - * - * @param[in] pix_fmt the pixel format - * @param[out] h_shift store log2_chroma_w - * @param[out] v_shift store log2_chroma_h - * - * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format -*) -// int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, -// int *h_shift, int *v_shift); - -(* - * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a - * valid pixel format. -*) -// int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); - -// void ff_check_pixfmt_descriptors(void); - -(* - * Utility function to swap the endianness of a pixel format. - * - * @param[in] pix_fmt the pixel format - * - * @return pixel format with swapped endianness if it exists, - * otherwise AV_PIX_FMT_NONE -*) -// enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); - -implementation - -uses ffm.lib; - -function av_get_pix_fmt_name;external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.pixfmt.pas b/source/ffmpeg/ffm.pixfmt.pas deleted file mode 100644 index b0efa8a..0000000 --- a/source/ffmpeg/ffm.pixfmt.pas +++ /dev/null @@ -1,623 +0,0 @@ -unit ffm.pixfmt; - -{$i ffmpeg.inc} - -interface - -/// * -// * copyright (c) 2006 Michael Niedermayer -// * -// * This file is part of ffm. -// * -// * 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 -// */ - -Const - AVPALETTE_SIZE = 1024; - AVPALETTE_COUNT = 256; - - (* - * Pixel format. - * - * @note - * AV_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. - * - * @par - * When the pixel format is palettized RGB (AV_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 AV_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. - * - * @par - * 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. - *) -Type - - pAVPixelFormat = ^TAVPixelFormat; - - TAVPixelFormat = ( // - AV_PIX_FMT_NONE = -1, // - AV_PIX_FMT_YUV420P, - /// < planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) - AV_PIX_FMT_YUYV422, - /// < packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr - AV_PIX_FMT_RGB24, - /// < packed RGB 8:8:8, 24bpp, RGBRGB... - AV_PIX_FMT_BGR24, - /// < packed RGB 8:8:8, 24bpp, BGRBGR... - AV_PIX_FMT_YUV422P, - /// < planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) - AV_PIX_FMT_YUV444P, - /// < planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) - AV_PIX_FMT_YUV410P, - /// < planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) - AV_PIX_FMT_YUV411P, - /// < planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) - AV_PIX_FMT_GRAY8, - /// < Y , 8bpp - AV_PIX_FMT_MONOWHITE, - /// < Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb - AV_PIX_FMT_MONOBLACK, - /// < Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb - AV_PIX_FMT_PAL8, - /// < 8 bit with PIX_FMT_RGB32 palette - AV_PIX_FMT_YUVJ420P, - /// < planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range - AV_PIX_FMT_YUVJ422P, - /// < planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range - AV_PIX_FMT_YUVJ444P, - /// < planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range -{$IFDEF FF_API_XVMC} - AV_PIX_FMT_XVMC_MPEG2_MC, - /// < XVideo Motion Acceleration via common packet passing - AV_PIX_FMT_XVMC_MPEG2_IDCT, -{$ENDIF}// * FF_API_XVMC */ - AV_PIX_FMT_UYVY422, - /// < packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 - AV_PIX_FMT_UYYVYY411, - /// < packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 - AV_PIX_FMT_BGR8, - /// < packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) - AV_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 - AV_PIX_FMT_BGR4_BYTE, - /// < packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) - AV_PIX_FMT_RGB8, - /// < packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) - AV_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 - AV_PIX_FMT_RGB4_BYTE, - /// < packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) - AV_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) - AV_PIX_FMT_NV21, - /// < as above, but U and V bytes are swapped - - AV_PIX_FMT_ARGB, - /// < packed ARGB 8:8:8:8, 32bpp, ARGBARGB... - AV_PIX_FMT_RGBA, - /// < packed RGBA 8:8:8:8, 32bpp, RGBARGBA... - AV_PIX_FMT_ABGR, - /// < packed ABGR 8:8:8:8, 32bpp, ABGRABGR... - AV_PIX_FMT_BGRA, - /// < packed BGRA 8:8:8:8, 32bpp, BGRABGRA... - - AV_PIX_FMT_GRAY16BE, - /// < Y , 16bpp, big-endian - AV_PIX_FMT_GRAY16LE, - /// < Y , 16bpp, little-endian - AV_PIX_FMT_YUV440P, - /// < planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) - AV_PIX_FMT_YUVJ440P, - /// < planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range - AV_PIX_FMT_YUVA420P, - /// < planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) -{$IFDEF FF_API_VDPAU} - AV_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 - AV_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 - AV_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 - AV_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 - AV_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 -{$ENDIF} - AV_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 - AV_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 - - AV_PIX_FMT_RGB565BE, - /// < packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian - AV_PIX_FMT_RGB565LE, - /// < packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian - AV_PIX_FMT_RGB555BE, - /// < packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 - AV_PIX_FMT_RGB555LE, - /// < packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 - - AV_PIX_FMT_BGR565BE, - /// < packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian - AV_PIX_FMT_BGR565LE, - /// < packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian - AV_PIX_FMT_BGR555BE, - /// < packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 - AV_PIX_FMT_BGR555LE, - /// < packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 - - AV_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 - AV_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 - AV_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 - - AV_PIX_FMT_YUV420P16LE, - /// < planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - AV_PIX_FMT_YUV420P16BE, - /// < planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - AV_PIX_FMT_YUV422P16LE, - /// < planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_YUV422P16BE, - /// < planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - AV_PIX_FMT_YUV444P16LE, - /// < planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - AV_PIX_FMT_YUV444P16BE, - /// < planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -{$IFDEF FF_API_VDPAU} - AV_PIX_FMT_VDPAU_MPEG4, - /// < MPEG4 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 -{$ENDIF} - AV_PIX_FMT_DXVA2_VLD, - /// < HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer - - AV_PIX_FMT_RGB444LE, - /// < packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 - AV_PIX_FMT_RGB444BE, - /// < packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 - AV_PIX_FMT_BGR444LE, - /// < packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 - AV_PIX_FMT_BGR444BE, - /// < packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 - AV_PIX_FMT_GRAY8A, - /// < 8bit gray, 8bit alpha - AV_PIX_FMT_BGR48BE, - /// < packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian - AV_PIX_FMT_BGR48LE, - /// < packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian - - (* - * The following 12 formats have the disadvantage of needing 1 format for each bit depth. - * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. - * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. - *) - AV_PIX_FMT_YUV420P9BE, - /// < planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - AV_PIX_FMT_YUV420P9LE, - /// < planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - AV_PIX_FMT_YUV420P10BE, - /// < planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - AV_PIX_FMT_YUV420P10LE, - /// < planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - AV_PIX_FMT_YUV422P10BE, - /// < planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - AV_PIX_FMT_YUV422P10LE, - /// < planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_YUV444P9BE, - /// < planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - AV_PIX_FMT_YUV444P9LE, - /// < planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - AV_PIX_FMT_YUV444P10BE, - /// < planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - AV_PIX_FMT_YUV444P10LE, - /// < planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - AV_PIX_FMT_YUV422P9BE, - /// < planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - AV_PIX_FMT_YUV422P9LE, - /// < planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_VDA_VLD, - /// < hardware decoding through VDA - -{$IFDEF AV_PIX_FMT_ABI_GIT_MASTER} - AV_PIX_FMT_RGBA64BE, - /// < packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - AV_PIX_FMT_RGBA64LE, - /// < packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - AV_PIX_FMT_BGRA64BE, - /// < packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - AV_PIX_FMT_BGRA64LE, - /// < packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -{$ENDIF} - AV_PIX_FMT_GBRP, - /// < planar GBR 4:4:4 24bpp - AV_PIX_FMT_GBRP9BE, - /// < planar GBR 4:4:4 27bpp, big-endian - AV_PIX_FMT_GBRP9LE, - /// < planar GBR 4:4:4 27bpp, little-endian - AV_PIX_FMT_GBRP10BE, - /// < planar GBR 4:4:4 30bpp, big-endian - AV_PIX_FMT_GBRP10LE, - /// < planar GBR 4:4:4 30bpp, little-endian - AV_PIX_FMT_GBRP16BE, - /// < planar GBR 4:4:4 48bpp, big-endian - AV_PIX_FMT_GBRP16LE, - /// < planar GBR 4:4:4 48bpp, little-endian - - (* - * duplicated pixel formats for compatibility with libav. - * FFmpeg supports these formats since May 8 2012 and Jan 28 2012 (commits f9ca1ac7 and 143a5c55) - * Libav added them Oct 12 2012 with incompatible values (commit 6d5600e85) - *) - AV_PIX_FMT_YUVA422P_LIBAV, - /// < planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) - AV_PIX_FMT_YUVA444P_LIBAV, - /// < planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) - - AV_PIX_FMT_YUVA420P9BE, - /// < planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian - AV_PIX_FMT_YUVA420P9LE, - /// < planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian - AV_PIX_FMT_YUVA422P9BE, - /// < planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian - AV_PIX_FMT_YUVA422P9LE, - /// < planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian - AV_PIX_FMT_YUVA444P9BE, - /// < planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian - AV_PIX_FMT_YUVA444P9LE, - /// < planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian - AV_PIX_FMT_YUVA420P10BE, - /// < planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) - AV_PIX_FMT_YUVA420P10LE, - /// < planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) - AV_PIX_FMT_YUVA422P10BE, - /// < planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) - AV_PIX_FMT_YUVA422P10LE, - /// < planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) - AV_PIX_FMT_YUVA444P10BE, - /// < planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) - AV_PIX_FMT_YUVA444P10LE, - /// < planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) - AV_PIX_FMT_YUVA420P16BE, - /// < planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) - AV_PIX_FMT_YUVA420P16LE, - /// < planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) - AV_PIX_FMT_YUVA422P16BE, - /// < planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) - AV_PIX_FMT_YUVA422P16LE, - /// < planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) - AV_PIX_FMT_YUVA444P16BE, - /// < planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) - AV_PIX_FMT_YUVA444P16LE, - /// < planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) - - AV_PIX_FMT_VDPAU, - /// < HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface - - AV_PIX_FMT_XYZ12LE, - /// < packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 - AV_PIX_FMT_XYZ12BE, - /// < packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 - AV_PIX_FMT_NV16, - /// < interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) - AV_PIX_FMT_NV20LE, - /// < interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_NV20BE, - /// < interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - -{$IFNDEF AV_PIX_FMT_ABI_GIT_MASTER} - AV_PIX_FMT_RGBA64BE = $123, - /// < packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - AV_PIX_FMT_RGBA64LE, - /// < packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - AV_PIX_FMT_BGRA64BE, - /// < packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - AV_PIX_FMT_BGRA64LE, - /// < packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -{$ENDIF} - AV_PIX_FMT_0RGB = $123 + 4, - /// < packed RGB 8:8:8, 32bpp, 0RGB0RGB... - AV_PIX_FMT_RGB0, - /// < packed RGB 8:8:8, 32bpp, RGB0RGB0... - AV_PIX_FMT_0BGR, - /// < packed BGR 8:8:8, 32bpp, 0BGR0BGR... - AV_PIX_FMT_BGR0, - /// < packed BGR 8:8:8, 32bpp, BGR0BGR0... - AV_PIX_FMT_YUVA444P, - /// < planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) - AV_PIX_FMT_YUVA422P, - /// < planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) - - AV_PIX_FMT_YUV420P12BE, - /// < planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - AV_PIX_FMT_YUV420P12LE, - /// < planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - AV_PIX_FMT_YUV420P14BE, - /// < planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - AV_PIX_FMT_YUV420P14LE, - /// < planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - AV_PIX_FMT_YUV422P12BE, - /// < planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - AV_PIX_FMT_YUV422P12LE, - /// < planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_YUV422P14BE, - /// < planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - AV_PIX_FMT_YUV422P14LE, - /// < planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - AV_PIX_FMT_YUV444P12BE, - /// < planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - AV_PIX_FMT_YUV444P12LE, - /// < planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - AV_PIX_FMT_YUV444P14BE, - /// < planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - AV_PIX_FMT_YUV444P14LE, - /// < planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - AV_PIX_FMT_GBRP12BE, - /// < planar GBR 4:4:4 36bpp, big-endian - AV_PIX_FMT_GBRP12LE, - /// < planar GBR 4:4:4 36bpp, little-endian - AV_PIX_FMT_GBRP14BE, - /// < planar GBR 4:4:4 42bpp, big-endian - AV_PIX_FMT_GBRP14LE, - /// < planar GBR 4:4:4 42bpp, little-endian - AV_PIX_FMT_GBRAP, - /// < planar GBRA 4:4:4:4 32bpp - AV_PIX_FMT_GBRAP16BE, - /// < planar GBRA 4:4:4:4 64bpp, big-endian - AV_PIX_FMT_GBRAP16LE, - /// < planar GBRA 4:4:4:4 64bpp, little-endian - AV_PIX_FMT_YUVJ411P, - /// < planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of PIX_FMT_YUV411P and setting color_range - - AV_PIX_FMT_BAYER_BGGR8, - /// < bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ - AV_PIX_FMT_BAYER_RGGB8, - /// < bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ - AV_PIX_FMT_BAYER_GBRG8, - /// < bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ - AV_PIX_FMT_BAYER_GRBG8, - /// < bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ - AV_PIX_FMT_BAYER_BGGR16LE, - /// < bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ - AV_PIX_FMT_BAYER_BGGR16BE, - /// < bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ - AV_PIX_FMT_BAYER_RGGB16LE, - /// < bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ - AV_PIX_FMT_BAYER_RGGB16BE, - /// < bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ - AV_PIX_FMT_BAYER_GBRG16LE, - /// < bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ - AV_PIX_FMT_BAYER_GBRG16BE, - /// < bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ - AV_PIX_FMT_BAYER_GRBG16LE, - /// < bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ - AV_PIX_FMT_BAYER_GRBG16BE, - /// < bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ - - AV_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 - -{$IFDEF FF_API_PIX_FMT} - , -{$INCLUDE old_pix_fmts.inc} -{$ENDIF} - ); - -const -{$IFDEF AV_HAVE_INCOMPATIBLE_LIBAV_ABI} - AV_PIX_FMT_YUVA422P = AV_PIX_FMT_YUVA422P_LIBAV; - AV_PIX_FMT_YUVA444P = AV_PIX_FMT_YUVA444P_LIBAV; -{$ENDIF} - AV_PIX_FMT_Y400A = AV_PIX_FMT_GRAY8A; - AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP; - -{$IFDEF AV_HAVE_BIGENDIAN} - // #define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be - AV_PIX_FMT_RGB32 = AV_PIX_FMT_ARGB; - AV_PIX_FMT_RGB32_1 = AV_PIX_FMT_RGBA; - AV_PIX_FMT_BGR32 = AV_PIX_FMT_ABGR; - AV_PIX_FMT_BGR32_1 = AV_PIX_FMT_BGRA; - AV_PIX_FMT_0RGB32 = AV_PIX_FMT_0RGB; - AV_PIX_FMT_0BGR32 = AV_PIX_FMT_0BGR; - // - AV_PIX_FMT_GRAY16 = AV_PIX_FMT_GRAY16BE; - AV_PIX_FMT_RGB48 = AV_PIX_FMT_RGB48BE; - AV_PIX_FMT_RGB565 = AV_PIX_FMT_RGB565BE; - AV_PIX_FMT_RGB555 = AV_PIX_FMT_RGB555BE; - AV_PIX_FMT_RGB444 = AV_PIX_FMT_RGB444BE; - AV_PIX_FMT_BGR48 = AV_PIX_FMT_BGR48BE; - AV_PIX_FMT_BGR565 = AV_PIX_FMT_BGR565BE; - AV_PIX_FMT_BGR555 = AV_PIX_FMT_BGR555BE; - AV_PIX_FMT_BGR444 = AV_PIX_FMT_BGR444BE; - // - AV_PIX_FMT_YUV420P9 = AV_PIX_FMT_YUV420P9BE; - AV_PIX_FMT_YUV422P9 = AV_PIX_FMT_YUV422P9BE; - AV_PIX_FMT_YUV444P9 = AV_PIX_FMT_YUV444P9BE; - AV_PIX_FMT_YUV420P10 = AV_PIX_FMT_YUV420P10BE; - AV_PIX_FMT_YUV422P10 = AV_PIX_FMT_YUV422P10BE; - AV_PIX_FMT_YUV444P10 = AV_PIX_FMT_YUV444P10BE; - AV_PIX_FMT_YUV420P12 = AV_PIX_FMT_YUV420P12BE; - AV_PIX_FMT_YUV422P12 = AV_PIX_FMT_YUV422P12BE; - AV_PIX_FMT_YUV444P12 = AV_PIX_FMT_YUV444P12BE; - AV_PIX_FMT_YUV420P14 = AV_PIX_FMT_YUV420P14BE; - AV_PIX_FMT_YUV422P14 = AV_PIX_FMT_YUV422P14BE; - AV_PIX_FMT_YUV444P14 = AV_PIX_FMT_YUV444P14BE; - AV_PIX_FMT_YUV420P16 = AV_PIX_FMT_YUV420P16BE; - AV_PIX_FMT_YUV422P16 = AV_PIX_FMT_YUV422P16BE; - AV_PIX_FMT_YUV444P16 = AV_PIX_FMT_YUV444P16BE; - // - AV_PIX_FMT_RGBA64 = AV_PIX_FMT_RGBA64BE; - AV_PIX_FMT_BGRA64 = AV_PIX_FMT_BGRA64BE; - AV_PIX_FMT_GBRP9 = AV_PIX_FMT_GBRP9BE; - AV_PIX_FMT_GBRP10 = AV_PIX_FMT_GBRP10BE; - AV_PIX_FMT_GBRP12 = AV_PIX_FMT_GBRP12BE; - AV_PIX_FMT_GBRP14 = AV_PIX_FMT_GBRP14BE; - AV_PIX_FMT_GBRP16 = AV_PIX_FMT_GBRP16BE; - AV_PIX_FMT_GBRAP16 = AV_PIX_FMT_GBRAP16BE; - // - AV_PIX_FMT_BAYER_BGGR16 = AV_PIX_FMT_BAYER_BGGR16BE; - AV_PIX_FMT_BAYER_RGGB16 = AV_PIX_FMT_BAYER_RGGB16BE; - AV_PIX_FMT_BAYER_GBRG16 = AV_PIX_FMT_BAYER_GBRG16BE; - AV_PIX_FMT_BAYER_GRBG16 = AV_PIX_FMT_BAYER_GRBG16BE; - // - // - AV_PIX_FMT_YUVA420P9 = AV_PIX_FMT_YUVA420P9BE; - AV_PIX_FMT_YUVA422P9 = AV_PIX_FMT_YUVA422P9BE; - AV_PIX_FMT_YUVA444P9 = AV_PIX_FMT_YUVA444P9BE; - AV_PIX_FMT_YUVA420P10 = AV_PIX_FMT_YUVA420P10BE; - AV_PIX_FMT_YUVA422P10 = AV_PIX_FMT_YUVA422P10BE; - AV_PIX_FMT_YUVA444P10 = AV_PIX_FMT_YUVA444P10BE; - AV_PIX_FMT_YUVA420P16 = AV_PIX_FMT_YUVA420P16BE; - AV_PIX_FMT_YUVA422P16 = AV_PIX_FMT_YUVA422P16BE; - AV_PIX_FMT_YUVA444P16 = AV_PIX_FMT_YUVA444P16BE; - // - AV_PIX_FMT_XYZ12 = AV_PIX_FMT_XYZ12BE; - AV_PIX_FMT_NV20 = AV_PIX_FMT_NV20BE; -{$ELSE} - // #define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le - AV_PIX_FMT_RGB32 = AV_PIX_FMT_BGRA; - AV_PIX_FMT_RGB32_1 = AV_PIX_FMT_ABGR; - AV_PIX_FMT_BGR32 = AV_PIX_FMT_RGBA; - AV_PIX_FMT_BGR32_1 = AV_PIX_FMT_ARGB; - AV_PIX_FMT_0RGB32 = AV_PIX_FMT_BGR0; - AV_PIX_FMT_0BGR32 = AV_PIX_FMT_RGB0; - // - AV_PIX_FMT_GRAY16 = AV_PIX_FMT_GRAY16LE; - AV_PIX_FMT_RGB48 = AV_PIX_FMT_RGB48LE; - AV_PIX_FMT_RGB565 = AV_PIX_FMT_RGB565LE; - AV_PIX_FMT_RGB555 = AV_PIX_FMT_RGB555LE; - AV_PIX_FMT_RGB444 = AV_PIX_FMT_RGB444LE; - AV_PIX_FMT_BGR48 = AV_PIX_FMT_BGR48LE; - AV_PIX_FMT_BGR565 = AV_PIX_FMT_BGR565LE; - AV_PIX_FMT_BGR555 = AV_PIX_FMT_BGR555LE; - AV_PIX_FMT_BGR444 = AV_PIX_FMT_BGR444LE; - // - AV_PIX_FMT_YUV420P9 = AV_PIX_FMT_YUV420P9LE; - AV_PIX_FMT_YUV422P9 = AV_PIX_FMT_YUV422P9LE; - AV_PIX_FMT_YUV444P9 = AV_PIX_FMT_YUV444P9LE; - AV_PIX_FMT_YUV420P10 = AV_PIX_FMT_YUV420P10LE; - AV_PIX_FMT_YUV422P10 = AV_PIX_FMT_YUV422P10LE; - AV_PIX_FMT_YUV444P10 = AV_PIX_FMT_YUV444P10LE; - AV_PIX_FMT_YUV420P12 = AV_PIX_FMT_YUV420P12LE; - AV_PIX_FMT_YUV422P12 = AV_PIX_FMT_YUV422P12LE; - AV_PIX_FMT_YUV444P12 = AV_PIX_FMT_YUV444P12LE; - AV_PIX_FMT_YUV420P14 = AV_PIX_FMT_YUV420P14LE; - AV_PIX_FMT_YUV422P14 = AV_PIX_FMT_YUV422P14LE; - AV_PIX_FMT_YUV444P14 = AV_PIX_FMT_YUV444P14LE; - AV_PIX_FMT_YUV420P16 = AV_PIX_FMT_YUV420P16LE; - AV_PIX_FMT_YUV422P16 = AV_PIX_FMT_YUV422P16LE; - AV_PIX_FMT_YUV444P16 = AV_PIX_FMT_YUV444P16LE; - // - AV_PIX_FMT_RGBA64 = AV_PIX_FMT_RGBA64LE; - AV_PIX_FMT_BGRA64 = AV_PIX_FMT_BGRA64LE; - AV_PIX_FMT_GBRP9 = AV_PIX_FMT_GBRP9LE; - AV_PIX_FMT_GBRP10 = AV_PIX_FMT_GBRP10LE; - AV_PIX_FMT_GBRP12 = AV_PIX_FMT_GBRP12LE; - AV_PIX_FMT_GBRP14 = AV_PIX_FMT_GBRP14LE; - AV_PIX_FMT_GBRP16 = AV_PIX_FMT_GBRP16LE; - AV_PIX_FMT_GBRAP16 = AV_PIX_FMT_GBRAP16LE; - // - AV_PIX_FMT_BAYER_BGGR16 = AV_PIX_FMT_BAYER_BGGR16LE; - AV_PIX_FMT_BAYER_RGGB16 = AV_PIX_FMT_BAYER_RGGB16LE; - AV_PIX_FMT_BAYER_GBRG16 = AV_PIX_FMT_BAYER_GBRG16LE; - AV_PIX_FMT_BAYER_GRBG16 = AV_PIX_FMT_BAYER_GRBG16LE; - // - // - AV_PIX_FMT_YUVA420P9 = AV_PIX_FMT_YUVA420P9LE; - AV_PIX_FMT_YUVA422P9 = AV_PIX_FMT_YUVA422P9LE; - AV_PIX_FMT_YUVA444P9 = AV_PIX_FMT_YUVA444P9LE; - AV_PIX_FMT_YUVA420P10 = AV_PIX_FMT_YUVA420P10LE; - AV_PIX_FMT_YUVA422P10 = AV_PIX_FMT_YUVA422P10LE; - AV_PIX_FMT_YUVA444P10 = AV_PIX_FMT_YUVA444P10LE; - AV_PIX_FMT_YUVA420P16 = AV_PIX_FMT_YUVA420P16LE; - AV_PIX_FMT_YUVA422P16 = AV_PIX_FMT_YUVA422P16LE; - AV_PIX_FMT_YUVA444P16 = AV_PIX_FMT_YUVA444P16LE; - // - AV_PIX_FMT_XYZ12 = AV_PIX_FMT_XYZ12LE; - AV_PIX_FMT_NV20 = AV_PIX_FMT_NV20LE; -{$ENDIF} -{$IFDEF FF_API_PIX_FMT} - -Type - TPixelFormat = TAVPixelFormat; - -Const - // - PIX_FMT_Y400A = AV_PIX_FMT_Y400A; - PIX_FMT_GBR24P = AV_PIX_FMT_GBR24P; - // - // PIX_FMT_NE(be, le) AV_PIX_FMT_NE(be, le) - // - PIX_FMT_RGB32 = AV_PIX_FMT_RGB32; - PIX_FMT_RGB32_1 = AV_PIX_FMT_RGB32_1; - PIX_FMT_BGR32 = AV_PIX_FMT_BGR32; - PIX_FMT_BGR32_1 = AV_PIX_FMT_BGR32_1; - PIX_FMT_0RGB32 = AV_PIX_FMT_0RGB32; - PIX_FMT_0BGR32 = AV_PIX_FMT_0BGR32; - // - PIX_FMT_GRAY16 = AV_PIX_FMT_GRAY16; - PIX_FMT_RGB48 = AV_PIX_FMT_RGB48; - PIX_FMT_RGB565 = AV_PIX_FMT_RGB565; - PIX_FMT_RGB555 = AV_PIX_FMT_RGB555; - PIX_FMT_RGB444 = AV_PIX_FMT_RGB444; - PIX_FMT_BGR48 = AV_PIX_FMT_BGR48; - PIX_FMT_BGR565 = AV_PIX_FMT_BGR565; - PIX_FMT_BGR555 = AV_PIX_FMT_BGR555; - PIX_FMT_BGR444 = AV_PIX_FMT_BGR444; - // - PIX_FMT_YUV420P9 = AV_PIX_FMT_YUV420P9; - PIX_FMT_YUV422P9 = AV_PIX_FMT_YUV422P9; - PIX_FMT_YUV444P9 = AV_PIX_FMT_YUV444P9; - PIX_FMT_YUV420P10 = AV_PIX_FMT_YUV420P10; - PIX_FMT_YUV422P10 = AV_PIX_FMT_YUV422P10; - PIX_FMT_YUV444P10 = AV_PIX_FMT_YUV444P10; - PIX_FMT_YUV420P12 = AV_PIX_FMT_YUV420P12; - PIX_FMT_YUV422P12 = AV_PIX_FMT_YUV422P12; - PIX_FMT_YUV444P12 = AV_PIX_FMT_YUV444P12; - PIX_FMT_YUV420P14 = AV_PIX_FMT_YUV420P14; - PIX_FMT_YUV422P14 = AV_PIX_FMT_YUV422P14; - PIX_FMT_YUV444P14 = AV_PIX_FMT_YUV444P14; - PIX_FMT_YUV420P16 = AV_PIX_FMT_YUV420P16; - PIX_FMT_YUV422P16 = AV_PIX_FMT_YUV422P16; - PIX_FMT_YUV444P16 = AV_PIX_FMT_YUV444P16; - // - PIX_FMT_RGBA64 = AV_PIX_FMT_RGBA64; - PIX_FMT_BGRA64 = AV_PIX_FMT_BGRA64; - PIX_FMT_GBRP9 = AV_PIX_FMT_GBRP9; - PIX_FMT_GBRP10 = AV_PIX_FMT_GBRP10; - PIX_FMT_GBRP12 = AV_PIX_FMT_GBRP12; - PIX_FMT_GBRP14 = AV_PIX_FMT_GBRP14; - PIX_FMT_GBRP16 = AV_PIX_FMT_GBRP16; -{$ENDIF} - -implementation - -end. diff --git a/source/ffmpeg/ffm.rational.pas b/source/ffmpeg/ffm.rational.pas deleted file mode 100644 index ea15714..0000000 --- a/source/ffmpeg/ffm.rational.pas +++ /dev/null @@ -1,175 +0,0 @@ -unit ffm.rational; - -{$i ffmpeg.inc} - -interface - -/// * -// * rational numbers -// * Copyright (c) 2003 Michael Niedermayer -// * -// * This file is part of ffm. -// * -// * 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 -// */ -// -/// ** -// * @file -// * rational numbers -// * @author Michael Niedermayer -// */ -// -// #ifndef AVUTIL_RATIONAL_H -// #define AVUTIL_RATIONAL_H -// -// #include -// #include -// #include "attributes.h" -// -/// ** -// * @addtogroup lavu_math -// * @{ -// */ -type - (* - * rational number numerator/denominator - *) - pAVRational = ^TAVRational; - - TAVRational = { packed } record - num: Integer; - /// < numerator - den: Integer; - /// < denominator - end; - - /// ** - // * Compare two rationals. - // * @param a first rational - // * @param b second rational - // * @return 0 if a==b, 1 if a>b, -1 if a>63)|1; - // else if(b.den && a.den) return 0; - // else if(a.num && b.num) return (a.num>>31) - (b.num>>31); - // else return INT_MIN; - // } - // - /// ** - // * Convert rational to double. - // * @param a rational to convert - // * @return (double) a - // */ - // static inline double av_q2d(AVRational a){ - // return a.num / (double) a.den; - // } - // - /// ** - // * 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 - // */ - // int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); - // - /// ** - // * Multiply two rationals. - // * @param b first rational - // * @param c second rational - // * @return b*c - // */ - // AVRational av_mul_q(AVRational b, AVRational c) av_const; - // - /// ** - // * Divide one rational by another. - // * @param b first rational - // * @param c second rational - // * @return b/c - // */ - // AVRational av_div_q(AVRational b, AVRational c) av_const; - // - /// ** - // * Add two rationals. - // * @param b first rational - // * @param c second rational - // * @return b+c - // */ - // AVRational av_add_q(AVRational b, AVRational c) av_const; - // - /// ** - // * Subtract one rational from another. - // * @param b first rational - // * @param c second rational - // * @return b-c - // */ - // AVRational av_sub_q(AVRational b, AVRational c) av_const; - // - /// ** - // * Invert a rational. - // * @param q value - // * @return 1 / q - // */ - // static av_always_inline AVRational av_inv_q(AVRational q) - // { - // AVRational r = { q.den, q.num }; - // return r; - // } - // - /// ** - // * Convert a double precision floating point number to a rational. - // * inf is expressed as {1,0} or {-1,0} depending on the sign. - // * - // * @param d double to convert - // * @param max the maximum allowed numerator and denominator - // * @return (AVRational) d - // */ - // AVRational av_d2q(double d, int max) av_const; - // - /// ** - // * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer - // * than q1, 0 if they have the same distance. - // */ - // int av_nearer_q(AVRational q, AVRational q1, AVRational q2); - // - /// ** - // * 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 - // */ - // int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); - // - /// ** - // * @} - // */ - -function AVRational(const num, den: Integer): TAVRational; inline; - -implementation - -function AVRational(const num, den: Integer): TAVRational; -begin - Result.num := num; - Result.den := den; -end; - -end. diff --git a/source/ffmpeg/ffm.samplefmt.pas b/source/ffmpeg/ffm.samplefmt.pas deleted file mode 100644 index 52a04bd..0000000 --- a/source/ffmpeg/ffm.samplefmt.pas +++ /dev/null @@ -1,274 +0,0 @@ -(* - * This file is part of ffm. - * - * 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 -*) -unit ffm.samplefmt; - -{$i ffmpeg.inc} - -interface - -(* - * Audio Sample Formats - * - * @par - * The data described by the sample format is always in native-endian order. - * Sample values can be expressed by native C types, hence the lack of a signed - * 24-bit sample format even though it is a common raw audio data format. - * - * @par - * The floating-point formats are based on full volume being in the range - * [-1.0, 1.0]. Any values outside this range are beyond full volume level. - * - * @par - * The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg - * (such as AVFrame in libavcodec) is as follows: - * - * For planar sample formats, each audio channel is in a separate data plane, - * and linesize is the buffer size, in bytes, for a single plane. All data - * planes must be the same size. For {packed} sample formats, only the first data - * plane is used, and samples for each channel are interleaved. In this case, - * linesize is the buffer size, in bytes, for the 1 plane. -*) -Type - pAVSampleFormat = ^TAVSampleFormat; - TAVSampleFormat = ( // - AV_SAMPLE_FMT_NONE = -1, // - AV_SAMPLE_FMT_U8, - /// < unsigned 8 bits - AV_SAMPLE_FMT_S16, - /// < signed 16 bits - AV_SAMPLE_FMT_S32, - /// < signed 32 bits - AV_SAMPLE_FMT_FLT, - /// < float - AV_SAMPLE_FMT_DBL, - /// < double - AV_SAMPLE_FMT_U8P, - /// < unsigned 8 bits, planar - AV_SAMPLE_FMT_S16P, - /// < signed 16 bits, planar - AV_SAMPLE_FMT_S32P, - /// < signed 32 bits, planar - AV_SAMPLE_FMT_FLTP, - /// < float, planar - AV_SAMPLE_FMT_DBLP, - /// < double, planar - AV_SAMPLE_FMT_NB - /// < Number of sample formats. DO NOT USE if linking dynamically - ); - - (* - * Return the name of sample_fmt, or NULL if sample_fmt is not - * recognized. - *) - // const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); -function av_get_sample_fmt_name(sample_fmt: TAVSampleFormat): pAnsiChar; cdecl; - -(* - * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE - * on error. -*) -// enum AVSampleFormat av_get_sample_fmt(const char *name); - -(* - * Return the planar<->{packed} alternative form of the given sample format, or - * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the - * requested planar/{packed} format, the format returned is the same as the - * input. -*) -// enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); - -(* - * Get the {packed} alternative form of the given sample format. - * - * If the passed sample_fmt is already in {packed} format, the format returned is - * the same as the input. - * - * @return the {packed} alternative form of the given sample format or - AV_SAMPLE_FMT_NONE on error. -*) -// enum AVSampleFormat av_get_{packed}_sample_fmt(enum AVSampleFormat sample_fmt); - -(* - * Get the planar alternative form of the given sample format. - * - * If the passed sample_fmt is already in planar format, the format returned is - * the same as the input. - * - * @return the planar alternative form of the given sample format or - AV_SAMPLE_FMT_NONE on error. -*) -// enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); - -(* - * Generate a string corresponding to the sample format with - * sample_fmt, or a header if sample_fmt is negative. - * - * @param buf the buffer where to write the string - * @param buf_size the size of buf - * @param sample_fmt the number of the sample format to print the - * corresponding info string, or a negative value to print the - * corresponding header. - * @return the pointer to the filled buffer or NULL if sample_fmt is - * unknown or in case of other errors -*) -// char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); - -{$IFDEF FF_API_GET_BITS_PER_SAMPLE_FMT} -(* - * @deprecated Use av_get_bytes_per_sample() instead. -*) -// attribute_deprecated -// int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt); -{$ENDIF} -(* - * Return number of bytes per sample. - * - * @param sample_fmt the sample format - * @return number of bytes per sample or zero if unknown for the given - * sample format -*) -// int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); -function av_get_bytes_per_sample(sample_fmt: TAVSampleFormat): integer; cdecl; - -(* - * Check if the sample format is planar. - * - * @param sample_fmt the sample format to inspect - * @return 1 if the sample format is planar, 0 if it is interleaved -*) -// int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); - -(* - * Get the required buffer size for the given audio parameters. - * - * @param[out] linesize calculated linesize, may be NULL - * @param nb_channels the number of channels - * @param nb_samples the number of samples in a single channel - * @param sample_fmt the sample format - * @param align buffer size alignment (0 = default, 1 = no alignment) - * @return required buffer size, or negative error code on failure -*) -// int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align); -function av_samples_get_buffer_size(linesize: pInteger; nb_channels: integer; nb_samples: integer; - sample_fmt: TAVSampleFormat; align: integer): integer; cdecl; - -(* - * Fill plane data pointers and linesize for samples with sample - * format sample_fmt. - * - * The audio_data array is filled with the pointers to the samples data planes: - * for planar, set the start point of each channel's data within the buffer, - * for {packed}, set the start point of the entire buffer only. - * - * The value pointed to by linesize is set to the aligned size of each - * channel's data buffer for planar layout, or to the aligned size of the - * buffer for all channels for {packed} layout. - * - * The buffer in buf must be big enough to contain all the samples - * (use av_samples_get_buffer_size() to compute its minimum size), - * otherwise the audio_data pointers will point to invalid data. - * - * @see enum AVSampleFormat - * The documentation for AVSampleFormat describes the data layout. - * - * @param[out] audio_data array to be filled with the pointer for each channel - * @param[out] linesize calculated linesize, may be NULL - * @param buf the pointer to a buffer containing the samples - * @param nb_channels the number of channels - * @param nb_samples the number of samples in a single channel - * @param sample_fmt the sample format - * @param align buffer size alignment (0 = default, 1 = no alignment) - * @return >=0 on success or a negative error code on failure - * @todo return minimum size in bytes required for the buffer in case - * of success at the next bump -*) -// int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, -// const uint8_t *buf, -// int nb_channels, int nb_samples, -// enum AVSampleFormat sample_fmt, int align); - -(* - * Allocate a samples buffer for nb_samples samples, and fill data pointers and - * linesize accordingly. - * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) - * Allocated data will be initialized to silence. - * - * @see enum AVSampleFormat - * The documentation for AVSampleFormat describes the data layout. - * - * @param[out] audio_data array to be filled with the pointer for each channel - * @param[out] linesize aligned size for audio buffer(s), may be NULL - * @param nb_channels number of audio channels - * @param nb_samples number of samples per channel - * @param align buffer size alignment (0 = default, 1 = no alignment) - * @return >=0 on success or a negative error code on failure - * @todo return the size of the allocated buffer in case of success at the next bump - * @see av_samples_fill_arrays() - * @see av_samples_alloc_array_and_samples() -*) -// int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, -// int nb_samples, enum AVSampleFormat sample_fmt, int align); - -(* - * Allocate a data pointers array, samples buffer for nb_samples - * samples, and fill data pointers and linesize accordingly. - * - * This is the same as av_samples_alloc(), but also allocates the data - * pointers array. - * - * @see av_samples_alloc() -*) -// int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, -// int nb_samples, enum AVSampleFormat sample_fmt, int align); - -(* - * Copy samples from src to dst. - * - * @param dst destination array of pointers to data planes - * @param src source array of pointers to data planes - * @param dst_offset offset in samples at which the data will be written to dst - * @param src_offset offset in samples at which the data will be read from src - * @param nb_samples number of samples to be copied - * @param nb_channels number of audio channels - * @param sample_fmt audio sample format -*) -// int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, -// int src_offset, int nb_samples, int nb_channels, -// enum AVSampleFormat sample_fmt); - -(* - * Fill an audio buffer with silence. - * - * @param audio_data array of pointers to data planes - * @param offset offset in samples at which to start filling - * @param nb_samples number of samples to fill - * @param nb_channels number of audio channels - * @param sample_fmt audio sample format -*) -// int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, -// int nb_channels, enum AVSampleFormat sample_fmt); - -implementation - -uses ffm.lib; - -function av_get_bytes_per_sample; external avutil_dll; -function av_get_sample_fmt_name; external avutil_dll; -function av_samples_get_buffer_size; external avutil_dll; - -end. diff --git a/source/ffmpeg/ffm.swresample.pas b/source/ffmpeg/ffm.swresample.pas deleted file mode 100644 index 4ffb7be..0000000 --- a/source/ffmpeg/ffm.swresample.pas +++ /dev/null @@ -1,309 +0,0 @@ -(* - * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) - * - * This file is part of libswresample - * - * libswresample 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. - * - * libswresample 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 libswresample; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - *) -unit ffm.swresample; - -{$i ffmpeg.inc} - -interface -(* - * @defgroup lswr Libswresample - * @{ - * - * Libswresample (lswr) is a library that handles audio resampling, sample - * format conversion and mixing. - * - * Interaction with lswr is done through SwrContext, which is - * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters - * must be set with the @ref avoptions API. - * - * For example the following code will setup conversion from planar float sample - * format to interleaved signed 16-bit integer, downsampling from 48kHz to - * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing - * matrix): - * @code - * SwrContext *swr = swr_alloc(); - * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); - * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); - * av_opt_set_int(swr, "in_sample_rate", 48000, 0); - * av_opt_set_int(swr, "out_sample_rate", 44100, 0); - * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); - * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); - * @endcode - * - * Once all values have been set, it must be initialized with swr_init(). If - * you need to change the conversion parameters, you can change the parameters - * as described above, or by using swr_alloc_set_opts(), then call swr_init() - * again. - * - * The conversion itself is done by repeatedly calling swr_convert(). - * Note that the samples may get buffered in swr if you provide insufficient - * output space or if sample rate conversion is done, which requires "future" - * samples. Samples that do not require future input can be retrieved at any - * time by using swr_convert() (in_count can be set to 0). - * At the end of conversion the resampling buffer can be flushed by calling - * swr_convert() with NULL in and 0 in_count. - * - * The delay between input and output, can at any time be found by using - * swr_get_delay(). - * - * The following code demonstrates the conversion loop assuming the parameters - * from above and caller-defined functions get_input() and handle_output(): - * @code - * uint8_t **input; - * int in_samples; - * - * while (get_input(&input, &in_samples)) { - * uint8_t *output; - * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + - * in_samples, 44100, 48000, AV_ROUND_UP); - * av_samples_alloc(&output, NULL, 2, out_samples, - * AV_SAMPLE_FMT_S16, 0); - * out_samples = swr_convert(swr, &output, out_samples, - * input, in_samples); - * handle_output(output, out_samples); - * av_freep(&output); - * } - * @endcode - * - * When the conversion is finished, the conversion - * context and everything associated with it must be freed with swr_free(). - * There will be no memory leak if the data is not completely flushed before - * swr_free(). - *) - -//#if LIBSWRESAMPLE_VERSION_MAJOR < 1 -//#define SWR_CH_MAX 32 ///< Maximum number of channels -//#endif - -//#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate -//TODO use int resample ? -//long term TODO can we enable this dynamically? - -//enum SwrDitherType { -// SWR_DITHER_NONE = 0, -// SWR_DITHER_RECTANGULAR, -// SWR_DITHER_TRIANGULAR, -// SWR_DITHER_TRIANGULAR_HIGHPASS, -// -// SWR_DITHER_NS = 64, ///< not part of API/ABI -// SWR_DITHER_NS_LIPSHITZ, -// SWR_DITHER_NS_F_WEIGHTED, -// SWR_DITHER_NS_MODIFIED_E_WEIGHTED, -// SWR_DITHER_NS_IMPROVED_E_WEIGHTED, -// SWR_DITHER_NS_SHIBATA, -// SWR_DITHER_NS_LOW_SHIBATA, -// SWR_DITHER_NS_HIGH_SHIBATA, -// SWR_DITHER_NB, ///< not part of API/ABI -//}; -// -//(* Resampling Engines *) -//enum SwrEngine { -// SWR_ENGINE_SWR, (*< SW Resampler *) -// SWR_ENGINE_SOXR, (*< SoX Resampler *) -// SWR_ENGINE_NB, ///< not part of API/ABI -//}; -// -//(* Resampling Filter Types *) -//enum SwrFilterType { -// SWR_FILTER_TYPE_CUBIC, (*< Cubic *) -// SWR_FILTER_TYPE_BLACKMAN_NUTTALL, (*< Blackman Nuttall Windowed Sinc *) -// SWR_FILTER_TYPE_KAISER, (*< Kaiser Windowed Sinc *) -//}; -Type -//typedef struct SwrContext SwrContext; -pSwrContext = ^TSwrContext; -TSwrContext = record - -end; - -(* - * Get the AVClass for swrContext. It can be used in combination with - * AV_OPT_SEARCH_FAKE_OBJ for examining options. - * - * @see av_opt_find(). - *) -//const AVClass *swr_get_class(void); - -(* - * Allocate SwrContext. - * - * If you use this function you will need to set the parameters (manually or - * with swr_alloc_set_opts()) before calling swr_init(). - * - * @see swr_alloc_set_opts(), swr_init(), swr_free() - * @return NULL on error, allocated context otherwise - *) -//struct SwrContext *swr_alloc(void); - -(* - * Initialize context after user parameters have been set. - * - * @return AVERROR error code in case of failure. - *) -//int swr_init(struct SwrContext *s); - -(* - * Allocate SwrContext if needed and set/reset common parameters. - * - * This function does not require s to be allocated with swr_alloc(). On the - * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters - * on the allocated context. - * - * @param s Swr context, can be NULL - * @param out_ch_layout output channel layout (AV_CH_LAYOUT_* ) - * @param out_sample_fmt output sample format (AV_SAMPLE_FMT_* ). - * @param out_sample_rate output sample rate (frequency in Hz) - * @param in_ch_layout input channel layout (AV_CH_LAYOUT_* ) - * @param in_sample_fmt input sample format (AV_SAMPLE_FMT_* ). - * @param in_sample_rate input sample rate (frequency in Hz) - * @param log_offset logging level offset - * @param log_ctx parent logging context, can be NULL - * - * @see swr_init(), swr_free() - * @return NULL on error, allocated context otherwise - *) -//struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, -// int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, -// int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, -// int log_offset, void *log_ctx); - -(* - * Free the given SwrContext and set the pointer to NULL. - *) -//void swr_free(struct SwrContext **s); - -(* - * Convert audio. - * - * in and in_count can be set to 0 to flush the last few samples out at the - * end. - * - * If more input is provided than output space then the input will be buffered. - * You can avoid this buffering by providing more output space than input. - * Convertion will run directly without copying whenever possible. - * - * @param s allocated Swr context, with parameters set - * @param out output buffers, only the first one need be set in case of packed audio - * @param out_count amount of space available for output in samples per channel - * @param in input buffers, only the first one need to be set in case of packed audio - * @param in_count number of input samples available in one channel - * - * @return number of samples output per channel, negative value on error - *) -//int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, -// const uint8_t **in , int in_count); -function swr_convert(s:pSwrContext; Var out_:PByte; out_count:Integer; - const in_:pByte;in_count:Integer):Integer;cdecl; - -(* - * Convert the next timestamp from input to output - * timestamps are in 1/(in_sample_rate * out_sample_rate) units. - * - * @note There are 2 slightly differently behaving modes. - * First is when automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) - * in this case timestamps will be passed through with delays compensated - * Second is when automatic timestamp compensation is used, (min_compensation < FLT_MAX) - * in this case the output timestamps will match output sample numbers - * - * @param pts timestamp for the next input sample, INT64_MIN if unknown - * @return the output timestamp for the next output sample - *) -//int64_t swr_next_pts(struct SwrContext *s, int64_t pts); - -(* - * Activate resampling compensation. - *) -//int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); - -(* - * Set a customized input channel mapping. - * - * @param s allocated Swr context, not yet initialized - * @param channel_map customized input channel mapping (array of channel - * indexes, -1 for a muted channel) - * @return AVERROR error code in case of failure. - *) -//int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); - -(* - * Set a customized remix matrix. - * - * @param s allocated Swr context, not yet initialized - * @param matrix remix coefficients; matrix[i + stride * o] is - * the weight of input channel i in output channel o - * @param stride offset between lines of the matrix - * @return AVERROR error code in case of failure. - *) -//int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); - -(* - * Drops the specified number of output samples. - *) -//int swr_drop_output(struct SwrContext *s, int count); - -(* - * Injects the specified number of silence samples. - *) -//int swr_inject_silence(struct SwrContext *s, int count); - -(* - * Gets the delay the next input sample will experience relative to the next output sample. - * - * Swresample can buffer data if more input has been provided than available - * output space, also converting between sample rates needs a delay. - * This function returns the sum of all such delays. - * The exact delay is not necessarily an integer value in either input or - * output sample rate. Especially when downsampling by a large value, the - * output sample rate may be a poor choice to represent the delay, similarly - * for upsampling and the input sample rate. - * - * @param s swr context - * @param base timebase in which the returned delay will be - * if its set to 1 the returned delay is in seconds - * if its set to 1000 the returned delay is in milli seconds - * if its set to the input sample rate then the returned delay is in input samples - * if its set to the output sample rate then the returned delay is in output samples - * an exact rounding free delay can be found by using LCM(in_sample_rate, out_sample_rate) - * @returns the delay in 1/base units. - *) -//int64_t swr_get_delay(struct SwrContext *s, int64_t base); - -(* - * Return the LIBSWRESAMPLE_VERSION_INT constant. - *) -//unsigned swresample_version(void); - -(* - * Return the swr build-time configuration. - *) -//const char *swresample_configuration(void); - -(* - * Return the swr license. - *) -//const char *swresample_license(void); - -implementation - -uses ffm.lib; - -function swr_convert; external swscale_dll; - -end. diff --git a/source/ffmpeg/ffm.swscale.pas b/source/ffmpeg/ffm.swscale.pas deleted file mode 100644 index 45c2fb9..0000000 --- a/source/ffmpeg/ffm.swscale.pas +++ /dev/null @@ -1,413 +0,0 @@ -unit ffm.swscale; - -{$i ffmpeg.inc} - -interface - -uses - ffm.pixfmt, ffm.ctypes; - -(* - * Copyright (C) 2001-2011 Michael Niedermayer - * - * This file is part of ffm. - * - * 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 -*) - -(* - * @file - * @ingroup lsws - * external API header -*) - -(* - * @defgroup lsws Libswscale - * @{ -*) - -(* - * Return the LIBSWSCALE_VERSION_INT constant. -*) -// unsigned swscale_version(void); - -(* - * Return the libswscale build-time configuration. -*) -// const char *swscale_configuration(void); - -(* - * Return the libswscale license. -*) -// const char *swscale_license(void); - -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_ERROR_DIFFUSION = $800000; - -{$IFDEF FF_API_SWS_CPU_CAPS} - (* - * CPU caps are autodetected now, those flags - * are only provided for API compatibility. - *) - SWS_CPU_CAPS_MMX = $80000000; - SWS_CPU_CAPS_MMXEXT = $20000000; - SWS_CPU_CAPS_MMX2 = $20000000; - SWS_CPU_CAPS_3DNOW = $40000000; - SWS_CPU_CAPS_ALTIVEC = $10000000; - SWS_CPU_CAPS_BFIN = $01000000; - SWS_CPU_CAPS_SSE2 = $02000000; -{$ENDIF} - 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; - - (* - * Return 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. - *) - // const int *sws_getCoefficients(int colorspace); - -Type - // when used for filters they must have an odd number of elements - // coeffs cannot be shared between vectors - pSwsVector = ^TSwsVector; - - TSwsVector = {packed} record - coeff: pDouble; - /// < pointer to the list of coefficients - length: Integer; - /// < number of coefficients in the vector - end; - - // vectors can be shared - pSwsFilter = ^TSwsFilter; - - TSwsFilter = {packed} record - lumH: pSwsVector; - lumV: pSwsVector; - chrH: pSwsVector; - chrV: pSwsVector; - end; - - pSwsContext = ^TSwsContext; - - TSwsContext = {packed} record - - end; - - (* - * Return a positive value if pix_fmt is a supported input format, 0 - * otherwise. - *) - // int sws_isSupportedInput(enum AVPixelFormat pix_fmt); - - (* - * Return a positive value if pix_fmt is a supported output format, 0 - * otherwise. - *) - // int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); - - (* - * @param[in] pix_fmt the pixel format - * @return a positive value if an endianness conversion for pix_fmt is - * supported, 0 otherwise. - *) - // int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); - - (* - * Allocate an empty SwsContext. This must be filled and passed to - * sws_init_context(). For filling see AVOptions, options.c and - * sws_setColorspaceDetails(). - *) - // struct SwsContext *sws_alloc_context(void); - - (* - * Initialize the swscaler context sws_context. - * - * @return zero or positive value on success, a negative value on - * error - *) - // int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); - - (* - * Free the swscaler context swsContext. - * If swsContext is NULL, then does nothing. - *) - // void sws_freeContext(struct SwsContext *swsContext); -procedure sws_freeContext(swsContext: pSwsContext); cdecl; - -{$IFDEF FF_API_SWS_GETCONTEXT} -(* - * Allocate and return an 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 - * @note this function is to be removed after a saner alternative is - * written - * @deprecated Use sws_getCachedContext() instead. -*) -// struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, -// int dstW, int dstH, enum AVPixelFormat dstFormat, -// int flags, SwsFilter *srcFilter, -// SwsFilter *dstFilter, const double *param); -function sws_getContext(srcW: Integer; srcH: Integer; srcFormat: TAVPixelFormat; dstW: Integer; dstH: Integer; dstFormat: TAVPixelFormat; - flags: Integer; srcFilter: pSwsFilter; dstFilter: pSwsFilter; const param: pDouble): pSwsContext; cdecl; -{$ENDIF} -(* - * Scale the image slice in srcSlice and put 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 c 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 -*) -// int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], -// const int srcStride[], int srcSliceY, int srcSliceH, -// uint8_t *const dst[], const int dstStride[]); - -Type - TCintArray = array [0 .. 0] of integer; - PCintArray = ^TCintArray; - TPCuint8Array = array [0 .. 0] of pByte; - PPCuint8Array = ^TPCuint8Array; - -function sws_scale( // - c: pSwsContext; // struct SwsContext *c - const srcSlice: PPCuint8Array; // const uint8_t *const srcSlice[] - const srcStride: PCintArray; // const int srcStride[] - srcSliceY: integer; // int srcSliceY - srcSliceH: integer; // int srcSliceH - dst: PPCuint8Array; // uint8_t *const dst[] - const dstStride: PCintArray // const int dstStride[] - ): integer; cdecl; -{ -int sws_scale( - struct SwsContext *c, - const uint8_t *const srcSlice[], - const int srcStride[], - int srcSliceY, - int srcSliceH, - uint8_t *const dst[], - const int dstStride[]); -} - -(* - * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) - * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) - * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] - * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] - * @param brightness 16.16 fixed point brightness correction - * @param contrast 16.16 fixed point contrast correction - * @param saturation 16.16 fixed point saturation correction - * @return -1 if not supported -*) -// int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], -// int srcRange, const int table[4], int dstRange, -// int brightness, int contrast, int saturation); - -(* - * @return -1 if not supported -*) -// int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, -// int *srcRange, int **table, int *dstRange, -// int *brightness, int *contrast, int *saturation); - -(* - * Allocate and return an uninitialized vector with length coefficients. -*) -// SwsVector *sws_allocVec(int length); - -(* - * Return a normalized Gaussian curve used to filter stuff - * quality = 3 is high quality, lower is lower quality. -*) -// SwsVector *sws_getGaussianVec(double variance, double quality); - -(* - * Allocate and return a vector with length coefficients, all - * with the same value c. -*) -// SwsVector *sws_getConstVec(double c, int length); - -(* - * Allocate and return a vector with just one coefficient, with - * value 1.0. -*) -// SwsVector *sws_getIdentityVec(void); - -(* - * Scale all the coefficients of a by the scalar value. -*) -// void sws_scaleVec(SwsVector *a, double scalar); - -(* - * Scale all the coefficients of a so that their sum equals height. -*) -// void sws_normalizeVec(SwsVector *a, double height); -// void sws_convVec(SwsVector *a, SwsVector *b); -// void sws_addVec(SwsVector *a, SwsVector *b); -// void sws_subVec(SwsVector *a, SwsVector *b); -// void sws_shiftVec(SwsVector *a, int shift); - -(* - * Allocate and return a clone of the vector a, that is a vector - * with the same coefficients as a. -*) -// SwsVector *sws_cloneVec(SwsVector *a); - -(* - * Print with av_log() a textual representation of the vector a - * if log_level <= av_log_level. -*) -// void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); - -// void sws_freeVec(SwsVector *a); - -// SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, -// float lumaSharpen, float chromaSharpen, -// float chromaHShift, float chromaVShift, -// int verbose); -// void sws_freeFilter(SwsFilter *filter); - -(* - * Check if context can be reused, otherwise reallocate 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. -*) -// struct SwsContext *sws_getCachedContext(struct SwsContext *context, -// int srcW, int srcH, enum AVPixelFormat srcFormat, -// int dstW, int dstH, enum AVPixelFormat dstFormat, -// int flags, SwsFilter *srcFilter, -// SwsFilter *dstFilter, const double *param); - -function sws_getCachedContext(context:pSwsContext; - srcW:Integer; srcH:Integer; srcFormat:TAVPixelFormat; - dstW:Integer; dstH:Integer; dstFormat:TAVPixelFormat; - flags:Integer; srcFilter:pSwsFilter; - dstFilter:pSwsFilter; const param:pDouble):pSwsContext;cdecl; - -(* - * Convert an 8-bit 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 -*) -// void sws_convertPalette8Topacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); - -(* - * Convert an 8-bit 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 -*) -// void sws_convertPalette8Topacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); - -(* - * Get the AVClass for swsContext. It can be used in combination with - * AV_OPT_SEARCH_FAKE_OBJ for examining options. - * - * @see av_opt_find(). -*) -// const AVClass *sws_get_class(void); - -implementation - -uses ffm.lib; - -{$IFDEF FF_API_SWS_GETCONTEXT} -function sws_getContext; external swscale_dll; -{$ENDIF} -function sws_scale; external swscale_dll; -procedure sws_freeContext; external swscale_dll; -function sws_getCachedContext; external swscale_dll; - -end. diff --git a/source/ffmpeg/ffm.time.pas b/source/ffmpeg/ffm.time.pas deleted file mode 100644 index 7895713..0000000 --- a/source/ffmpeg/ffm.time.pas +++ /dev/null @@ -1,46 +0,0 @@ -(* - * Copyright (c) 2000-2003 Fabrice Bellard - * - * This file is part of ffm. - * - * 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 - *) -unit ffm.time; - -interface - -(** - * Get the current time in microseconds. - *) -function av_gettime():int64;cdecl; - -(** - * Sleep for a period of time. Although the duration is expressed in - * microseconds, the actual delay may be rounded to the precision of the - * system timer. - * - * @param usec Number of microseconds to sleep. - * @return zero on success or (negative) error code. - *) -function av_usleep(usec:cardinal):Integer;cdecl; - -implementation - -uses ffm.lib; - -function av_gettime;external avutil_dll; -function av_usleep;external avutil_dll; - -end. diff --git a/source/ffmpeg/ffmpeg.inc b/source/ffmpeg/ffmpeg.inc deleted file mode 100644 index e466baf..0000000 --- a/source/ffmpeg/ffmpeg.inc +++ /dev/null @@ -1,18 +0,0 @@ -// -{$POINTERMATH ON} -{$MINENUMSIZE 4} (* use 4-byte enums *) -{$WRITEABLECONST ON} -// -// swscale -{$DEFINE FF_API_SWS_GETCONTEXT} -// avfilter -{$DEFINE FF_API_AVFILTERBUFFER} -{$DEFINE FF_API_FOO_COUNT} -// libavcodec.avcodec -{$DEFINE FF_API_CODEC_ID} -{$DEFINE FF_API_XVMC} -{$DEFINE FF_API_DEBUG_MV} -{$DEFINE FF_API_THREAD_OPAQUE} -{$DEFINE FF_API_ERROR_RATE} -{$DEFINE FF_API_CODEC_PKT} -{$DEFINE FF_API_DESTRUCT_PACKET} diff --git a/source/ffmpeg/ffmpeg.old_codec_ids.inc b/source/ffmpeg/ffmpeg.old_codec_ids.inc deleted file mode 100644 index 417d4ce..0000000 --- a/source/ffmpeg/ffmpeg.old_codec_ids.inc +++ /dev/null @@ -1,391 +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 header exists to prevent new codec IDs from being accidentally added to - * the deprecated list. - * Do not include it directly. It will be removed on next major bump - * - * Do not add new items to this list. Use the AVCodecID enum instead. - *) - , - CODEC_ID_NONE = AV_CODEC_ID_NONE, - - (* video codecs *) - CODEC_ID_MPEG1VIDEO, - CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video 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_TSCC, - CODEC_ID_ULTI, - CODEC_ID_QDRAW, - CODEC_ID_VIXL, - CODEC_ID_QPEG, - 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_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_ESCAPE124, - CODEC_ID_DIRAC, - CODEC_ID_BFI, - CODEC_ID_CMV, - CODEC_ID_MOTIONPIXELS, - CODEC_ID_TGV, - CODEC_ID_TGQ, - CODEC_ID_TQI, - CODEC_ID_AURA, - CODEC_ID_AURA2, - CODEC_ID_V210X, - CODEC_ID_TMV, - CODEC_ID_V210, - CODEC_ID_DPX, - CODEC_ID_MAD, - CODEC_ID_FRWU, - CODEC_ID_FLASHSV2, - CODEC_ID_CDGRAPHICS, - CODEC_ID_R210, - CODEC_ID_ANM, - CODEC_ID_BINKVIDEO, - CODEC_ID_IFF_ILBM, - CODEC_ID_IFF_BYTERUN1, - CODEC_ID_KGV1, - CODEC_ID_YOP, - CODEC_ID_VP8, - CODEC_ID_PICTOR, - CODEC_ID_ANSI, - CODEC_ID_A64_MULTI, - CODEC_ID_A64_MULTI5, - CODEC_ID_R10K, - CODEC_ID_MXPEG, - CODEC_ID_LAGARITH, - CODEC_ID_PRORES, - CODEC_ID_JV, - CODEC_ID_DFA, - CODEC_ID_WMV3IMAGE, - CODEC_ID_VC1IMAGE, - CODEC_ID_UTVIDEO, - CODEC_ID_BMV_VIDEO, - CODEC_ID_VBLE, - CODEC_ID_DXTORY, - CODEC_ID_V410, - CODEC_ID_XWD, - CODEC_ID_CDXL, - CODEC_ID_XBM, - CODEC_ID_ZEROCODEC, - CODEC_ID_MSS1, - CODEC_ID_MSA1, - CODEC_ID_TSCC2, - CODEC_ID_MTS2, - CODEC_ID_CLLC, - CODEC_ID_Y41P = $59343150,//MKBETAG('Y','4','1','P'), - CODEC_ID_ESCAPE130 = $45313330,//MKBETAG('E','1','3','0'), - CODEC_ID_EXR = $30455852,//MKBETAG('0','E','X','R'), - CODEC_ID_AVRP = $41565250,//MKBETAG('A','V','R','P'), - - CODEC_ID_G2M = $3047324D,//MKBETAG( 0 ,'G','2','M'), - CODEC_ID_AVUI = $41565549,//MKBETAG('A','V','U','I'), - CODEC_ID_AYUV = $41595556,//MKBETAG('A','Y','U','V'), - CODEC_ID_V308 = $56333038,//MKBETAG('V','3','0','8'), - CODEC_ID_V408 = $56343038,//MKBETAG('V','4','0','8'), - CODEC_ID_YUV4 = $59555634,//MKBETAG('Y','U','V','4'), - CODEC_ID_SANM = $53414E4D,//MKBETAG('S','A','N','M'), - CODEC_ID_PAF_VIDEO = $50414656,//MKBETAG('P','A','F','V'), - CODEC_ID_SNOW = AV_CODEC_ID_SNOW, - - (* various PCM "codecs" *) - CODEC_ID_FIRST_AUDIO = $10000, ///< A dummy id pointing at the start of audio 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, - CODEC_ID_PCM_BLURAY, - CODEC_ID_PCM_LXF, - CODEC_ID_S302M, - CODEC_ID_PCM_S8_PLANAR, - - (* various ADPCM codecs *) - CODEC_ID_ADPCM_IMA_QT = $11000, - CODEC_ID_ADPCM_IMA_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, - CODEC_ID_ADPCM_G722, - CODEC_ID_ADPCM_IMA_APC, - CODEC_ID_VIMA = $56494D41,//MKBETAG('V','I','M','A'), - - (* 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, - 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_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, - CODEC_ID_TWINVQ, - CODEC_ID_TRUEHD, - CODEC_ID_MP4ALS, - CODEC_ID_ATRAC1, - CODEC_ID_BINKAUDIO_RDFT, - CODEC_ID_BINKAUDIO_DCT, - CODEC_ID_AAC_LATM, - CODEC_ID_QDMC, - CODEC_ID_CELT, - CODEC_ID_G723_1, - CODEC_ID_G729, - CODEC_ID_8SVX_EXP, - CODEC_ID_8SVX_FIB, - CODEC_ID_BMV_AUDIO, - CODEC_ID_RALF, - CODEC_ID_IAC, - CODEC_ID_ILBC, - CODEC_ID_FFWAVESYNTH = $46465753,//MKBETAG('F','F','W','S'), - CODEC_ID_SONIC = $534F4E43,//MKBETAG('S','O','N','C'), - CODEC_ID_SONIC_LS = $534F4E4C,//MKBETAG('S','O','N','L'), - CODEC_ID_PAF_AUDIO = $50414641,//MKBETAG('P','A','F','A'), - CODEC_ID_OPUS = $4F505553,//MKBETAG('O','P','U','S'), - - (* subtitle codecs *) - CODEC_ID_FIRST_SUBTITLE = $17000, ///< A dummy ID pointing at the start of 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, - CODEC_ID_HDMV_PGS_SUBTITLE, - CODEC_ID_DVB_TELETEXT, - CODEC_ID_SRT, - CODEC_ID_MICRODVD = $6D445644,//MKBETAG('m','D','V','D'), - CODEC_ID_EIA_608 = $63363038,//MKBETAG('c','6','0','8'), - CODEC_ID_JACOSUB = $4A535542,//MKBETAG('J','S','U','B'), - CODEC_ID_SAMI = $53414D49,//MKBETAG('S','A','M','I'), - CODEC_ID_REALTEXT = $52545854,//MKBETAG('R','T','X','T'), - CODEC_ID_SUBVIEWER = $53756256,//MKBETAG('S','u','b','V'), - - (* other specific kind of codecs (generally used for attachments) *) - CODEC_ID_FIRST_UNKNOWN = $18000, ///< A dummy ID pointing at the start of various fake codecs. - CODEC_ID_TTF = $18000, - CODEC_ID_BINTEXT = $42545854,//MKBETAG('B','T','X','T'), - CODEC_ID_XBIN = $5842494E,//MKBETAG('X','B','I','N'), - CODEC_ID_IDF = $30494446,//MKBETAG( 0 ,'I','D','F'), - CODEC_ID_OTF = $304F5446,//MKBETAG( 0 ,'O','T','F'), - - 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_MPEG4SYSTEMS = $20001, (**< _FAKE_ codec to indicate a MPEG-4 Systems - * stream (only used by libavformat) *) - CODEC_ID_FFMETADATA = $21000 ///< Dummy codec for streams containing only metadata information. - diff --git a/source/ffmpeg/ffmpeg.old_pix_fmts.inc b/source/ffmpeg/ffmpeg.old_pix_fmts.inc deleted file mode 100644 index cf20607..0000000 --- a/source/ffmpeg/ffmpeg.old_pix_fmts.inc +++ /dev/null @@ -1,173 +0,0 @@ -(* - * copyright (c) 2006-2012 Michael Niedermayer - * - * 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 header exists to prevent new pixel formats from being accidentally added - * to the deprecated list. - * Do not include it directly. It will be removed on next major bump - * - * Do not add new items to this list. Use the AVPixelFormat enum instead. - *) - PIX_FMT_NONE = AV_PIX_FMT_NONE, - 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) - 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) - 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), deprecated in favor of PIX_FMT_YUV420P and setting color_range - PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range - PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range -{$IFDEF FF_API_XVMC} - PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing - PIX_FMT_XVMC_MPEG2_IDCT, -{$endif} //* FF_API_XVMC */ - 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 - 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 - - 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... - - 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), deprecated in favor of PIX_FMT_YUV440P and setting color_range - PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) -{$ifdef FF_API_VDPAU} - 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 -{$endif} - 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 - - 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 - - PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -{$ifdef FF_API_VDPAU} - PIX_FMT_VDPAU_MPEG4, ///< MPEG4 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 -{$endif} - PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer - - PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 - PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 - PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 - PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 - PIX_FMT_GRAY8A, ///< 8bit gray, 8bit alpha - PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian - PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian - - //the following 10 formats have the disadvantage of needing 1 format for each bit depth, thus - //If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored separately - //is better - PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_VDA_VLD, ///< hardware decoding through VDA - -{$ifdef AV_PIX_FMT_ABI_GIT_MASTER} - PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -{$endif} - PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp - PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian - PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian - PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian - PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian - PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian - PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian - -{$ifndef AV_PIX_FMT_ABI_GIT_MASTER} - PIX_FMT_RGBA64BE=$123, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -{$endif} - PIX_FMT_0RGB=$123+4, ///< packed RGB 8:8:8, 32bpp, 0RGB0RGB... - PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGB0RGB0... - PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, 0BGR0BGR... - PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGR0BGR0... - PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) - PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) - - PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big endian - PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little endian - PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big endian - PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little endian - - 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 diff --git a/source/ocv.fmxutils.pas b/source/ocv.fmxutils.pas index e1a90dc..a9ecc2b 100644 --- a/source/ocv.fmxutils.pas +++ b/source/ocv.fmxutils.pas @@ -1,5 +1,32 @@ +(* + **************************************************************** + Delphi-OpenCV Demo + Copyright (C) 2013 Project Delphi-OpenCV + **************************************************************** + Contributor: + Laentir Valetov + email:laex@bk.ru + **************************************************************** + You may retrieve the latest version of this file at the GitHub, + located at git://github.com/Laex/Delphi-OpenCV.git + **************************************************************** + The contents of this file are used with permission, subject to + the Mozilla Public License Version 1.1 (the "License"); you may + not use this file except in compliance with the License. You may + obtain a copy of the License at + http://www.mozilla.org/MPL/MPL-1_1Final.html + + Software distributed under the License is distributed on an + "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + **************************************************************** +*) + unit ocv.fmxutils; +{$I OpenCV.inc} + interface Uses @@ -15,9 +42,10 @@ procedure IPLImageToFMXBitmap(const IpImage: pIplImage; const FMXBitmap: TBitmap implementation +{$IFDEF DELPHIXE5_UP} + Uses FMX.Types; -{$IFDEF DELPHIXE5_UP} procedure IPLImageToFMXBitmap(const IpImage: pIplImage; const FMXBitmap: TBitmap); inline; Var BitmapData: TBitmapData;