From 3cf861a7c3d843275ae64d9ba599de96cd468c28 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 10 Sep 2019 03:01:16 +0200 Subject: [PATCH] Creating ffmpeg c++ link. --- Kyoo.Transcoder/Kyoo.Transcoder.vcxproj | 32 +- .../Kyoo.Transcoder.vcxproj.filters | 36 +- Kyoo.Transcoder/Stream.h | 28 - Kyoo.Transcoder/Transcoder.cpp | 12 - .../ffmpeg/include/libavcodec/ac3_parser.h | 36 + .../ffmpeg/include/libavcodec/adts_parser.h | 37 + .../ffmpeg/include/libavcodec/avcodec.h | 6228 +++++++++++++++++ .../ffmpeg/include/libavcodec/avdct.h | 84 + .../ffmpeg/include/libavcodec/avfft.h | 118 + .../ffmpeg/include/libavcodec/d3d11va.h | 112 + .../ffmpeg/include/libavcodec/dirac.h | 131 + .../ffmpeg/include/libavcodec/dv_profile.h | 83 + .../ffmpeg/include/libavcodec/dxva2.h | 93 + .../ffmpeg/include/libavcodec/jni.h | 46 + .../ffmpeg/include/libavcodec/mediacodec.h | 101 + .../ffmpeg/include/libavcodec/qsv.h | 107 + .../ffmpeg/include/libavcodec/vaapi.h | 86 + .../ffmpeg/include/libavcodec/vdpau.h | 176 + .../ffmpeg/include/libavcodec/version.h | 140 + .../ffmpeg/include/libavcodec/videotoolbox.h | 127 + .../ffmpeg/include/libavcodec/vorbis_parser.h | 74 + .../ffmpeg/include/libavcodec/xvmc.h | 170 + .../ffmpeg/include/libavdevice/avdevice.h | 514 ++ .../ffmpeg/include/libavdevice/version.h | 50 + .../ffmpeg/include/libavfilter/avfilter.h | 1168 ++++ .../ffmpeg/include/libavfilter/buffersink.h | 165 + .../ffmpeg/include/libavfilter/buffersrc.h | 209 + .../ffmpeg/include/libavfilter/version.h | 66 + .../ffmpeg/include/libavformat/avformat.h | 3092 ++++++++ .../ffmpeg/include/libavformat/avio.h | 881 +++ .../ffmpeg/include/libavformat/version.h | 114 + .../ffmpeg/include/libavutil/adler32.h | 60 + .../ffmpeg/include/libavutil/aes.h | 65 + .../ffmpeg/include/libavutil/aes_ctr.h | 88 + .../ffmpeg/include/libavutil/attributes.h | 167 + .../ffmpeg/include/libavutil/audio_fifo.h | 187 + .../ffmpeg/include/libavutil/avassert.h | 75 + .../ffmpeg/include/libavutil/avconfig.h | 6 + .../ffmpeg/include/libavutil/avstring.h | 413 ++ .../ffmpeg/include/libavutil/avutil.h | 365 + .../ffmpeg/include/libavutil/base64.h | 72 + .../ffmpeg/include/libavutil/blowfish.h | 82 + .../ffmpeg/include/libavutil/bprint.h | 219 + .../ffmpeg/include/libavutil/bswap.h | 109 + .../ffmpeg/include/libavutil/buffer.h | 291 + .../ffmpeg/include/libavutil/camellia.h | 70 + .../ffmpeg/include/libavutil/cast5.h | 80 + .../ffmpeg/include/libavutil/channel_layout.h | 232 + .../ffmpeg/include/libavutil/common.h | 560 ++ .../ffmpeg/include/libavutil/cpu.h | 130 + .../ffmpeg/include/libavutil/crc.h | 100 + .../ffmpeg/include/libavutil/des.h | 77 + .../ffmpeg/include/libavutil/dict.h | 200 + .../ffmpeg/include/libavutil/display.h | 114 + .../ffmpeg/include/libavutil/downmix_info.h | 115 + .../include/libavutil/encryption_info.h | 205 + .../ffmpeg/include/libavutil/error.h | 126 + .../ffmpeg/include/libavutil/eval.h | 113 + .../ffmpeg/include/libavutil/ffversion.h | 5 + .../ffmpeg/include/libavutil/fifo.h | 179 + .../ffmpeg/include/libavutil/file.h | 71 + .../ffmpeg/include/libavutil/frame.h | 971 +++ .../ffmpeg/include/libavutil/hash.h | 269 + .../include/libavutil/hdr_dynamic_metadata.h | 343 + .../ffmpeg/include/libavutil/hmac.h | 100 + .../ffmpeg/include/libavutil/hwcontext.h | 584 ++ .../ffmpeg/include/libavutil/hwcontext_cuda.h | 52 + .../include/libavutil/hwcontext_d3d11va.h | 169 + .../ffmpeg/include/libavutil/hwcontext_drm.h | 169 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../include/libavutil/hwcontext_mediacodec.h | 36 + .../ffmpeg/include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg/include/libavutil/imgutils.h | 277 + .../ffmpeg/include/libavutil/intfloat.h | 77 + .../ffmpeg/include/libavutil/intreadwrite.h | 644 ++ .../ffmpeg/include/libavutil/lfg.h | 71 + .../ffmpeg/include/libavutil/log.h | 362 + .../ffmpeg/include/libavutil/lzo.h | 66 + .../ffmpeg/include/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../ffmpeg/include/libavutil/mathematics.h | 242 + .../ffmpeg/include/libavutil/md5.h | 98 + .../ffmpeg/include/libavutil/mem.h | 700 ++ .../ffmpeg/include/libavutil/motion_vector.h | 57 + .../ffmpeg/include/libavutil/murmur3.h | 120 + .../ffmpeg/include/libavutil/opt.h | 865 +++ .../ffmpeg/include/libavutil/parseutils.h | 193 + .../ffmpeg/include/libavutil/pixdesc.h | 440 ++ .../ffmpeg/include/libavutil/pixelutils.h | 52 + .../ffmpeg/include/libavutil/pixfmt.h | 552 ++ .../ffmpeg/include/libavutil/random_seed.h | 43 + .../ffmpeg/include/libavutil/rational.h | 214 + .../ffmpeg/include/libavutil/rc4.h | 66 + .../ffmpeg/include/libavutil/replaygain.h | 50 + .../ffmpeg/include/libavutil/ripemd.h | 87 + .../ffmpeg/include/libavutil/samplefmt.h | 272 + .../ffmpeg/include/libavutil/sha.h | 95 + .../ffmpeg/include/libavutil/sha512.h | 97 + .../ffmpeg/include/libavutil/spherical.h | 232 + .../ffmpeg/include/libavutil/stereo3d.h | 233 + .../ffmpeg/include/libavutil/tea.h | 71 + .../ffmpeg/include/libavutil/threadmessage.h | 115 + .../ffmpeg/include/libavutil/time.h | 56 + .../ffmpeg/include/libavutil/timecode.h | 140 + .../ffmpeg/include/libavutil/timestamp.h | 78 + .../ffmpeg/include/libavutil/tree.h | 138 + .../ffmpeg/include/libavutil/twofish.h | 70 + Kyoo.Transcoder/ffmpeg/include/libavutil/tx.h | 93 + .../ffmpeg/include/libavutil/version.h | 139 + .../ffmpeg/include/libavutil/xtea.h | 94 + .../ffmpeg/include/libpostproc/postprocess.h | 107 + .../ffmpeg/include/libpostproc/version.h | 45 + .../ffmpeg/include/libswresample/swresample.h | 579 ++ .../ffmpeg/include/libswresample/version.h | 45 + .../ffmpeg/include/libswscale/swscale.h | 336 + .../ffmpeg/include/libswscale/version.h | 53 + Kyoo.Transcoder/ffmpeg/lib/avcodec-58.def | 238 + Kyoo.Transcoder/ffmpeg/lib/avcodec.lib | Bin 0 -> 185506 bytes Kyoo.Transcoder/ffmpeg/lib/avdevice-58.def | 19 + Kyoo.Transcoder/ffmpeg/lib/avdevice.lib | Bin 0 -> 15874 bytes Kyoo.Transcoder/ffmpeg/lib/avfilter-7.def | 70 + Kyoo.Transcoder/ffmpeg/lib/avfilter.lib | Bin 0 -> 55814 bytes Kyoo.Transcoder/ffmpeg/lib/avformat-58.def | 176 + Kyoo.Transcoder/ffmpeg/lib/avformat.lib | Bin 0 -> 135770 bytes Kyoo.Transcoder/ffmpeg/lib/avutil-56.def | 536 ++ Kyoo.Transcoder/ffmpeg/lib/avutil.lib | Bin 0 -> 407528 bytes Kyoo.Transcoder/ffmpeg/lib/libavcodec.dll.a | Bin 0 -> 857596 bytes Kyoo.Transcoder/ffmpeg/lib/libavdevice.dll.a | Bin 0 -> 444664 bytes Kyoo.Transcoder/ffmpeg/lib/libavfilter.dll.a | Bin 0 -> 46428 bytes Kyoo.Transcoder/ffmpeg/lib/libavformat.dll.a | Bin 0 -> 138272 bytes Kyoo.Transcoder/ffmpeg/lib/libavutil.dll.a | Bin 0 -> 340548 bytes Kyoo.Transcoder/ffmpeg/lib/libpostproc.dll.a | Bin 0 -> 7130 bytes .../ffmpeg/lib/libswresample.dll.a | Bin 0 -> 15196 bytes Kyoo.Transcoder/ffmpeg/lib/libswscale.dll.a | Bin 0 -> 22232 bytes Kyoo.Transcoder/ffmpeg/lib/postproc-55.def | 11 + Kyoo.Transcoder/ffmpeg/lib/postproc.lib | Bin 0 -> 9078 bytes Kyoo.Transcoder/ffmpeg/lib/swresample-3.def | 24 + Kyoo.Transcoder/ffmpeg/lib/swresample.lib | Bin 0 -> 18842 bytes Kyoo.Transcoder/ffmpeg/lib/swscale-5.def | 35 + Kyoo.Transcoder/ffmpeg/lib/swscale.lib | Bin 0 -> 27204 bytes Kyoo.Transcoder/src/Stream.h | 18 + Kyoo.Transcoder/src/Transcoder.cpp | 47 + Kyoo.Transcoder/{ => src}/Transcoder.h | 2 +- Kyoo.Transcoder/{ => src}/dllmain.cpp | 0 Kyoo.Transcoder/{ => src}/framework.h | 0 Kyoo.Transcoder/{ => src}/pch.cpp | 0 Kyoo.Transcoder/{ => src}/pch.h | 0 .../src/app/player/player.component.html | 2 +- Kyoo/Controllers/SubtitleController.cs | 14 +- .../LibraryManager/LibraryManager.cs | 2 +- Kyoo/InternalAPI/Transcoder/ITranscoder.cs | 5 +- Kyoo/InternalAPI/Transcoder/Transcoder.cs | 12 +- Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs | 4 +- ffmpeg-build.txt | 16 + 157 files changed, 31618 insertions(+), 83 deletions(-) delete mode 100644 Kyoo.Transcoder/Stream.h delete mode 100644 Kyoo.Transcoder/Transcoder.cpp create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/ac3_parser.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/adts_parser.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/avcodec.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/avdct.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/avfft.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/d3d11va.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/dirac.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/dv_profile.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/dxva2.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/jni.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/mediacodec.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/qsv.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/vaapi.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/vdpau.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/videotoolbox.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/vorbis_parser.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavcodec/xvmc.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavdevice/avdevice.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavdevice/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavfilter/avfilter.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersink.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersrc.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavfilter/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavformat/avformat.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavformat/avio.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavformat/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/adler32.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/aes.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/aes_ctr.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/attributes.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/audio_fifo.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/avassert.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/avconfig.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/avstring.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/avutil.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/base64.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/blowfish.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/bprint.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/bswap.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/buffer.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/camellia.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/cast5.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/channel_layout.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/common.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/cpu.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/crc.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/des.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/dict.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/display.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/downmix_info.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/encryption_info.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/error.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/eval.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/ffversion.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/fifo.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/file.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/frame.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hash.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hdr_dynamic_metadata.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hmac.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_cuda.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_d3d11va.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_drm.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_dxva2.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_mediacodec.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_qsv.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vaapi.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vdpau.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_videotoolbox.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/imgutils.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/intfloat.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/intreadwrite.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/lfg.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/log.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/lzo.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/macros.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/mastering_display_metadata.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/mathematics.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/md5.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/mem.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/motion_vector.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/murmur3.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/opt.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/parseutils.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/pixdesc.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/pixelutils.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/pixfmt.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/random_seed.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/rational.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/rc4.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/replaygain.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/ripemd.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/samplefmt.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/sha.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/sha512.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/spherical.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/stereo3d.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/tea.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/threadmessage.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/time.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/timecode.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/timestamp.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/tree.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/twofish.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/tx.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libavutil/xtea.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libpostproc/postprocess.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libpostproc/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libswresample/swresample.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libswresample/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libswscale/swscale.h create mode 100644 Kyoo.Transcoder/ffmpeg/include/libswscale/version.h create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avcodec-58.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avcodec.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avdevice-58.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avdevice.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avfilter-7.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avfilter.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avformat-58.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avformat.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avutil-56.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/avutil.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libavcodec.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libavdevice.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libavfilter.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libavformat.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libavutil.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libpostproc.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libswresample.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/libswscale.dll.a create mode 100644 Kyoo.Transcoder/ffmpeg/lib/postproc-55.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/postproc.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/swresample-3.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/swresample.lib create mode 100644 Kyoo.Transcoder/ffmpeg/lib/swscale-5.def create mode 100644 Kyoo.Transcoder/ffmpeg/lib/swscale.lib create mode 100644 Kyoo.Transcoder/src/Stream.h create mode 100644 Kyoo.Transcoder/src/Transcoder.cpp rename Kyoo.Transcoder/{ => src}/Transcoder.h (77%) rename Kyoo.Transcoder/{ => src}/dllmain.cpp (100%) rename Kyoo.Transcoder/{ => src}/framework.h (100%) rename Kyoo.Transcoder/{ => src}/pch.cpp (100%) rename Kyoo.Transcoder/{ => src}/pch.h (100%) create mode 100644 ffmpeg-build.txt diff --git a/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj b/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj index 65a992ca..a4162a91 100644 --- a/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj +++ b/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj @@ -72,17 +72,25 @@ true + $(ProjectDir)\ffmpeg\include;$(IncludePath) + $(ProjectDir)\ffmpeg\lib;$(LibraryPath) true $(SolutionDir)$(Configuration)\ + $(ProjectDir)\ffmpeg\include;$(IncludePath) + $(ProjectDir)\ffmpeg\lib;$(LibraryPath) false + $(ProjectDir)\ffmpeg\include;$(IncludePath) + $(ProjectDir)\ffmpeg\lib;$(LibraryPath) false $(SolutionDir)$(Configuration)\ + $(ProjectDir)\ffmpeg\include;$(IncludePath) + $(ProjectDir)\ffmpeg\lib;$(LibraryPath) @@ -98,6 +106,8 @@ Windows true false + $(ProjectDir)\ffmpeg\lib + $(ProjectDir)ffmpeg\lib\*.lib;%(AdditionalDependencies) @@ -109,11 +119,14 @@ _DEBUG;KYOOTRANSCODER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);TRANSCODER_EXPORTS=1 true pch.h + %(AdditionalIncludeDirectories) Windows true false + $(ProjectDir)\ffmpeg\lib + $(ProjectDir)ffmpeg\lib\*.lib;%(AdditionalDependencies) @@ -134,6 +147,8 @@ true true false + $(ProjectDir)\ffmpeg\lib + $(ProjectDir)ffmpeg\lib\*.lib;%(AdditionalDependencies) @@ -147,6 +162,7 @@ NDEBUG;KYOOTRANSCODER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);TRANSCODER_EXPORTS=1 true pch.h + %(AdditionalIncludeDirectories) Windows @@ -154,23 +170,25 @@ true true false + $(ProjectDir)\ffmpeg\lib + $(ProjectDir)ffmpeg\lib\*.lib;%(AdditionalDependencies) - - - - + + + + - - + + Create Create Create Create - + diff --git a/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj.filters b/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj.filters index 3be349ea..6b6cf920 100644 --- a/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj.filters +++ b/Kyoo.Transcoder/Kyoo.Transcoder.vcxproj.filters @@ -5,41 +5,37 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - {a553acdb-cb65-47bc-8809-c5374fe91cae} + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + - - Header Files + + Source Files - - Header Files + + Compiler Files - - Header Files + + Compiler Files - + Models - + Source Files - - Source Files + + Compiler Files - - Source Files + + Compiler Files \ No newline at end of file diff --git a/Kyoo.Transcoder/Stream.h b/Kyoo.Transcoder/Stream.h deleted file mode 100644 index 0a69763f..00000000 --- a/Kyoo.Transcoder/Stream.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#ifdef TRANSCODER_EXPORTS -#define API __declspec(dllexport) -#else -#define API __declspec(dllimport) -#endif - -#include - -extern "C" API struct Video -{ - std::string title; - Audio* audios; - Subtitle* subtitles; - long duration; -}; - -extern "C" API struct Audio -{ - std::string title; - std::string languageCode; -}; - -extern "C" API struct Subtitle -{ - std::string title; - std::string languageCode; -}; \ No newline at end of file diff --git a/Kyoo.Transcoder/Transcoder.cpp b/Kyoo.Transcoder/Transcoder.cpp deleted file mode 100644 index 3affad80..00000000 --- a/Kyoo.Transcoder/Transcoder.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "pch.h" -#include "Transcoder.h" - -int Init() -{ - return 42; -} - -Video ScanVideo(std::string path) -{ - -} \ No newline at end of file diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/ac3_parser.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/ac3_parser.h new file mode 100644 index 00000000..ff8cc4cf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/ac3_parser.h @@ -0,0 +1,36 @@ +/* + * AC-3 parser prototypes + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 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 + */ + +#ifndef AVCODEC_AC3_PARSER_H +#define AVCODEC_AC3_PARSER_H + +#include +#include + +/** + * Extract the bitstream ID and the frame size from AC-3 data. + */ +int av_ac3_parse_header(const uint8_t *buf, size_t size, + uint8_t *bitstream_id, uint16_t *frame_size); + + +#endif /* AVCODEC_AC3_PARSER_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/adts_parser.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/adts_parser.h new file mode 100644 index 00000000..f85becd1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/adts_parser.h @@ -0,0 +1,37 @@ +/* + * 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 + */ + +#ifndef AVCODEC_ADTS_PARSER_H +#define AVCODEC_ADTS_PARSER_H + +#include +#include + +#define AV_AAC_ADTS_HEADER_SIZE 7 + +/** + * Extract the number of samples and frames from AAC data. + * @param[in] buf pointer to AAC data buffer + * @param[out] samples Pointer to where number of samples is written + * @param[out] frames Pointer to where number of frames is written + * @return Returns 0 on success, error code on failure. + */ +int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, + uint8_t *frames); + +#endif /* AVCODEC_ADTS_PARSER_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/avcodec.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avcodec.h new file mode 100644 index 00000000..d234271c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avcodec.h @@ -0,0 +1,6228 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/cpu.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/hwcontext.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "version.h" + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @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 an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding + 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, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + 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, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + AV_CODEC_ID_AVS2, + + AV_CODEC_ID_Y41P = 0x8000, + AV_CODEC_ID_AVRP, + AV_CODEC_ID_012V, + AV_CODEC_ID_AVUI, + AV_CODEC_ID_AYUV, + AV_CODEC_ID_TARGA_Y216, + AV_CODEC_ID_V308, + AV_CODEC_ID_V408, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + AV_CODEC_ID_IMM4, + AV_CODEC_ID_PROSUMER, + AV_CODEC_ID_MWSC, + AV_CODEC_ID_WCMV, + AV_CODEC_ID_RASC, + AV_CODEC_ID_HYMT, + AV_CODEC_ID_ARBC, + AV_CODEC_ID_AGM, + AV_CODEC_ID_LSCR, + AV_CODEC_ID_VP4, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + 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, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + AV_CODEC_ID_PCM_VIDC, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + 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_ADPCM_VIMA, + + AV_CODEC_ID_ADPCM_AFC = 0x11800, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + AV_CODEC_ID_ADPCM_AGM, + + /* AMR */ + AV_CODEC_ID_AMR_NB = 0x12000, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + + AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, + + /* audio codecs */ + AV_CODEC_ID_MP2 = 0x15000, + 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, + 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, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + AV_CODEC_ID_CODEC2, + + AV_CODEC_ID_FFWAVESYNTH = 0x15800, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + AV_CODEC_ID_APTX, + AV_CODEC_ID_APTX_HD, + AV_CODEC_ID_SBC, + AV_CODEC_ID_ATRAC9, + AV_CODEC_ID_HCOM, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + 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 = 0x17800, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + AV_CODEC_ID_TTML, + AV_CODEC_ID_ARIB_CAPTION, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_BINTEXT = 0x18800, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket +}; + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * 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. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio 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) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * 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) + +/** + * @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. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 64 + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* 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_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + 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 + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +/* 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). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Don't output frames whose parameters differ from first + * decoded frame in stream. + */ +#define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +/** + * Use internal 2pass ratecontrol in first pass mode. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Input bitstream might be truncated at a random location + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG_TRUNCATED (1 << 16) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * timecode is in drop frame format. DEPRECATED!!!! + */ +#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * 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. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +#define AV_CODEC_CAP_TRUNCATED (1 << 3) +/** + * 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. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +/** + * 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 carrying 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. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) +/** + * Codec is intra only. + */ +#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 +/** + * Codec is lossless. + */ +#define AV_CODEC_CAP_LOSSLESS 0x80000000 + +/** + * Codec is backed by a hardware implementation. Typically used to + * identify a non-hwaccel hardware decoder. For information about hwaccels, use + * avcodec_get_hw_config() instead. + */ +#define AV_CODEC_CAP_HARDWARE (1 << 18) + +/** + * Codec is potentially backed by a hardware implementation, but not + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the + * implementation provides some sort of internal fallback. + */ +#define AV_CODEC_CAP_HYBRID (1 << 19) + +/** + * This codec takes the reordered_opaque field from input AVFrames + * and returns it in the corresponding field in AVCodecContext after + * encoding. + */ +#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20) + +/** + * 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; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int max_bitrate; +#else + int64_t max_bitrate; +#endif + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int min_bitrate; +#else + int64_t min_bitrate; +#endif + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int avg_bitrate; +#else + int64_t avg_bitrate; +#endif + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +/** + * 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. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + 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, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * 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, + + /** + * 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, + + /** + * 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. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID as uint8_t, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * This side data is encryption initialization data. + * The format is not part of ABI, use av_encryption_init_info_* methods to + * access. + */ + AV_PKT_DATA_ENCRYPTION_INIT_INFO, + + /** + * This side data contains encryption info for how to decrypt the packet. + * The format is not part of ABI, use av_encryption_info_* methods to access. + */ + AV_PKT_DATA_ENCRYPTION_INFO, + + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** + * The number of side data types. + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + int size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * 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. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * 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 field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * 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. + */ + int64_t pts; + /** + * 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. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated Same as the duration field, but as int64_t. This was required + * for Matroska subtitles, whose duration values could overflow when the + * duration field was still an int. + */ + attribute_deprecated + int64_t convergence_duration; +#endif +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; +/** + * @} + */ + +struct AVCodecInternal; + +enum AVFieldOrder { + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT, //< Bottom coded first, top displayed first +}; + +/** + * main external API structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; + enum AVCodecID codec_id; /* 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. + */ + unsigned int codec_tag; + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * 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 + */ + int bit_rate_tolerance; + + /** + * 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 + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_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. + * Must be allocated with the av_malloc() family of functions. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * 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. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: the use of this field for decoding is deprecated. + * Use framerate instead. + */ + AVRational time_base; + + /** + * 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. + */ + int ticks_per_frame; + + /** + * 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 field is unused (see initial_padding). + * + * 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. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_decode_video2 due frame + * reordering. + * + * - 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 while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - 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 while parsing the data. + */ + int coded_width, coded_height; + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * 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. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + + /** + * 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); + + /** + * 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. + * @note The callback may be called again immediately if initialization for + * the selected (hardware-accelerated) pixel format failed. + * @warning Behavior is undefined if the callback returns a value not + * in the fmt list of formats. + * @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); + + /** + * 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 + */ + int max_b_frames; + + /** + * 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 + */ + float b_quant_factor; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_frame_strategy; +#endif + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * 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. + */ + int has_b_frames; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int mpeg_quant; +#endif + + /** + * 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 + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 +#endif + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * 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. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int pre_me; +#endif + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *inter_matrix; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int scenechange_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int noise_reduction; +#endif + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + +#if FF_API_PRIVATE_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int me_penalty_compensation; +#endif + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int brd_scale; +#endif + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int chromaoffset; +#endif + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_sensitivity; +#endif + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< 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 AV_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 + */ + int frame_size; + + /** + * 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. + */ + int frame_number; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by user, may be overwritten by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * 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 extended_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 AV_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. + * + * 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. + * + * Some decoders do not support linesizes changing between frames. + * + * 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); + + /** + * 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. + * + * This is always automatically enabled if avcodec_receive_frame() is used. + * + * - encoding: unused + * - decoding: set by the caller before avcodec_open2(). + */ + attribute_deprecated + int refcounted_frames; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#if FF_API_CODER_TYPE +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int coder_type; +#endif /* FF_API_CODER_TYPE */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int context_model; +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_factor; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_exp; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int min_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int max_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int64_t timecode_frame_start; +#endif + +#if FF_API_RTP_CALLBACK + /** + * @deprecated unused + */ + /* 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. */ + attribute_deprecated + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int rtp_payload_size; /* 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. */ +#endif + +#if FF_API_STAT_BITS + /* statistics, used for 2-pass encoding */ + attribute_deprecated + int mv_bits; + attribute_deprecated + int header_bits; + attribute_deprecated + int i_tex_bits; + attribute_deprecated + int p_tex_bits; + attribute_deprecated + int i_count; + attribute_deprecated + int p_count; + attribute_deprecated + int skip_count; + attribute_deprecated + int misc_bits; + + /** @deprecated this field is unused */ + attribute_deprecated + int frame_bits; +#endif + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - 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) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#if FF_API_DEBUG_MV +/** + * @deprecated this option does nothing + */ +#define FF_DEBUG_MV 32 +#endif +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#if FF_API_DEBUG_MV +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#endif +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + +#if FF_API_DEBUG_MV + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames +#endif + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int err_recognition; + +/** + * 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. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error + + + /** + * opaque 64-bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * - encoding: Set by libavcodec to the reordered_opaque of the input + * frame corresponding to the last returned packet. Only + * supported by encoders with the + * AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability. + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + const struct AVHWAccel *hwaccel; + + /** + * 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 + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_XVID 14 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + +#if FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + +#if FF_API_CODED_FRAME + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: unused + * + * @deprecated use the quality factor packet side data instead + */ + attribute_deprecated AVFrame *coded_frame; +#endif + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * 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. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * 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. + */ + int thread_safe_callbacks; + + /** + * 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); + + /** + * 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); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + +#define FF_PROFILE_AV1_MAIN 0 +#define FF_PROFILE_AV1_HIGH 1 +#define FF_PROFILE_AV1_PROFESSIONAL 2 + +#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define FF_PROFILE_SBC_MSBC 1 + +#define FF_PROFILE_PRORES_PROXY 0 +#define FF_PROFILE_PRORES_LT 1 +#define FF_PROFILE_PRORES_STANDARD 2 +#define FF_PROFILE_PRORES_HQ 3 +#define FF_PROFILE_PRORES_4444 4 +#define FF_PROFILE_PRORES_XQ 5 + +#define FF_PROFILE_ARIB_PROFILE_A 0 +#define FF_PROFILE_ARIB_PROFILE_C 1 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * 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()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + +#if FF_API_VBV_DELAY + /** + * 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. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data + */ + attribute_deprecated + uint64_t vbv_delay; +#endif + +#if FF_API_SIDEDATA_ONLY_PKT + /** + * Encoding only and set by default. Allow encoders to output packets + * that do not contain any encoded data, only side data. + * + * Some encoders need to output such packets, e.g. to update some stream + * parameters at the end of encoding. + * + * @deprecated this field disables the default behaviour and + * it is kept only for compatibility. + */ + attribute_deprecated + int side_data_only_packets; +#endif + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + +#if !FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * 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 + */ + int sub_charenc_mode; +#define 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) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define 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 +#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 + + /** + * 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). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + +#if !FF_API_DEBUG_MV + /** + * debug motion vectors + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#endif + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; + + /* + * Video decoding only. Sets the number of extra hardware frames which + * the decoder will allocate for use by the caller. This must be set + * before avcodec_open2() is called. + * + * Some hardware decoders require all frames that they will use for + * output to be defined in advance before decoding starts. For such + * decoders, the hardware frame pool must therefore be of a fixed size. + * The extra frames set here are on top of any number that the decoder + * needs internally in order to operate normally (for example, frames + * used as reference pictures). + */ + int extra_hw_frames; + + /** + * The percentage of damaged samples to discard a frame. + * + * - decoding: set by user + * - encoding: unused + */ + int discard_damaged_percentage; +} AVCodecContext; + +#if FF_API_CODEC_GET_SET +/** + * Accessors for some AVCodecContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); + +attribute_deprecated +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); + +attribute_deprecated +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); + +#if FF_API_LOWRES +attribute_deprecated +int av_codec_get_lowres(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_lowres(AVCodecContext *avctx, int val); +#endif + +attribute_deprecated +int av_codec_get_seek_preroll(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); + +attribute_deprecated +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); +#endif + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +enum { + /** + * The codec supports this format via the hw_device_ctx interface. + * + * When selecting this format, AVCodecContext.hw_device_ctx should + * have been set to a device of the specified type before calling + * avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, + /** + * The codec supports this format via the hw_frames_ctx interface. + * + * When selecting this format for a decoder, + * AVCodecContext.hw_frames_ctx should be set to a suitable frames + * context inside the get_format() callback. The frames context + * must have been created on a device of the specified type. + */ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, + /** + * The codec supports this format by some internal method. + * + * This format can be selected without any additional configuration - + * no device or frames context is required. + */ + AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, + /** + * The codec supports this format by some ad-hoc method. + * + * Additional settings and/or function calls are required. See the + * codec-specific documentation for details. (Methods requiring + * this sort of configuration are deprecated and others should be + * used in preference.) + */ + AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, +}; + +typedef struct AVCodecHWConfig { + /** + * A hardware pixel format which the codec can use. + */ + enum AVPixelFormat pix_fmt; + /** + * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible + * setup methods which can be used with this configuration. + */ + int methods; + /** + * The device type associated with the configuration. + * + * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and + * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. + */ + enum AVHWDeviceType device_type; +} AVCodecHWConfig; + +typedef struct AVCodecDefault AVCodecDefault; + +struct AVSubtitle; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * 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. + */ + const char *name; + /** + * 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. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + + /** + * Group name of the codec implementation. + * This is a short symbolic name of the wrapper backing this codec. A + * wrapper uses some kind of external implementation for the codec, such + * as an external library, or a codec implementation provided by the OS or + * the hardware. + * If this field is NULL, this is a builtin, libavcodec native codec. + * If non-NULL, this will be the suffix in AVCodec.name in most cases + * (usually AVCodec.name will be of the form "_"). + */ + const char *wrapper_name; + + /***************************************************************** + * 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. + ***************************************************************** + */ + int priv_data_size; + struct AVCodec *next; + /** + * @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 *); + /** + * 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); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const AVCodecDefault *defaults; + + /** + * Initialize codec static data, called from avcodec_register(). + * + * This is not intended for time consuming operations as it is + * run for every codec regardless of that codec being used. + */ + void (*init_static_data)(struct AVCodec *codec); + + int (*init)(AVCodecContext *); + int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, + const struct AVSubtitle *sub); + /** + * 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); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + int (*close)(AVCodecContext *); + /** + * Encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + /** + * Internal codec capabilities. + * See FF_CODEC_CAP_* in internal.h + */ + int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; + + /** + * Array of pointers to hardware configurations supported by the codec, + * or NULL if no hardware supported. The array is terminated by a NULL + * pointer. + * + * The user can only access this field via avcodec_get_hw_config(). + */ + const struct AVCodecHWConfigInternal **hw_configs; +} AVCodec; + +#if FF_API_CODEC_GET_SET +attribute_deprecated +int av_codec_get_max_lowres(const AVCodec *codec); +#endif + +struct MpegEncContext; + +/** + * Retrieve supported hardware configurations for a codec. + * + * Values of index from zero to some maximum return the indexed configuration + * descriptor; all other values return NULL. If the codec does not support + * any hardware configurations then it will always return NULL. + */ +const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); + +/** + * @defgroup lavc_hwaccel AVHWAccel + * + * @note Nothing in this structure should be accessed by the user. At some + * point in future it will not be externally visible at all. + * + * @{ + */ +typedef struct AVHWAccel { + /** + * 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). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * 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. + ***************************************************************** + */ + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * 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 + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for parameter data (SPS/PPS/VPS etc). + * + * Useful for hardware decoders which keep persistent state about the + * video parameters, and need to receive any changes to update that state. + * + * @param avctx the codec context + * @param type the nal unit type + * @param buf the nal unit data buffer + * @param buf_size the size of the nal unit in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * The only exception is XvMC, that works on MB level. + * + * @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 + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * 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 + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of per-frame hardware accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int frame_priv_data_size; + + /** + * Called for every Macroblock in a slice. + * + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). + * Instead of decoding to raw picture, MB parameters are + * stored in an array provided by the video driver. + * + * @param s the mpeg context + */ + void (*decode_mb)(struct MpegEncContext *s); + + /** + * Initialize the hwaccel private data. + * + * This will be called from ff_get_format(), after hwaccel and + * hwaccel_context are set and the hwaccel private data in AVCodecInternal + * is allocated. + */ + int (*init)(AVCodecContext *avctx); + + /** + * Uninitialize the hwaccel private data. + * + * This will be called from get_format() or avcodec_close(), after hwaccel + * and hwaccel_context are already uninitialized. + */ + int (*uninit)(AVCodecContext *avctx); + + /** + * Size of the private data to allocate in + * AVCodecInternal.hwaccel_priv_data. + */ + int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; + + /** + * Fill the given hw_frames context with current codec parameters. Called + * from get_format. Refer to avcodec_get_hw_frames_parameters() for + * details. + * + * This CAN be called before AVHWAccel.init is called, and you must assume + * that avctx->hwaccel_priv_data is invalid. + */ + int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); +} AVHWAccel; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @defgroup lavc_picture AVPicture + * + * Functions for working with AVPicture + * @{ + */ + +/** + * Picture data structure. + * + * Up to four components can be stored into it, the last component is + * alpha. + * @deprecated use AVFrame or imgutils functions instead + */ +typedef struct AVPicture { + attribute_deprecated + uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes + attribute_deprecated + int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line +} AVPicture; + +/** + * @} + */ +#endif + +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 0x00000001 + +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 + +#if FF_API_AVPICTURE + /** + * @deprecated unused + */ + attribute_deprecated + AVPicture pict; +#endif + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + 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; + +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + +/** + * Iterate over all registered codecs. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec or NULL when the iteration is + * finished + */ +const AVCodec *av_codec_iterate(void **opaque); + +#if FF_API_NEXT +/** + * 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. + */ +attribute_deprecated +AVCodec *av_codec_next(const AVCodec *c); +#endif + +/** + * 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); + +#if FF_API_NEXT +/** + * 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() + */ +attribute_deprecated +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 + */ +attribute_deprecated +void avcodec_register_all(void); +#endif + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @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. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +#if FF_API_GET_CONTEXT_DEFAULTS +/** + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. + */ +int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif + +/** + * 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); + +#if FF_API_COPY_CONTEXT +/** + * 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 + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. + */ +attribute_deprecated +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * 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! + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @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 + * 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); + +/** + * 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() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_packet + * @{ + */ + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +/** + * 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); + +/** + * 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); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * 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); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * and buf 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 + AV_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); + +#if FF_API_AVPACKET_OLD_API +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + * + * @deprecated Use av_packet_ref or av_packet_make_refcounted + */ +attribute_deprecated +int av_dup_packet(AVPacket *pkt); +/** + * Copy packet, including contents + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_copy_packet(AVPacket *dst, const AVPacket *src); + +/** + * Copy packet side data + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props + */ +attribute_deprecated +int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); + +/** + * Free a packet. + * + * @deprecated Use av_packet_unref + * + * @param pkt packet to free + */ +attribute_deprecated +void av_free_packet(AVPacket *pkt); +#endif +/** + * 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); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * 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); + +/** + * 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(const AVPacket *pkt, enum AVPacketSideDataType type, + int *size); + +#if FF_API_MERGE_SD_API +attribute_deprecated +int av_packet_merge_side_data(AVPacket *pkt); + +attribute_deprecated +int av_packet_split_side_data(AVPacket *pkt); +#endif + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * Pack a dictionary for use in side_data. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); + + +/** + * 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); + +/** + * 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, const AVPacket *src); + +/** + * 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); + +/** + * 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); + +/** + * 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); + +/** + * Ensure the data described by a given packet is reference counted. + * + * @note This function does not ensure that the reference will be writable. + * Use av_packet_make_writable instead for that purpose. + * + * @see av_packet_ref + * @see av_packet_make_writable + * + * @param pkt packet whose data should be made reference counted. + * + * @return 0 on success, a negative AVERROR on error. On failure, the + * packet is unchanged. + */ +int av_packet_make_refcounted(AVPacket *pkt); + +/** + * Create a writable reference for the data described by a given packet, + * avoiding data copy if possible. + * + * @param pkt Packet whose data should be made writable. + * + * @return 0 on success, a negative AVERROR on failure. On failure, the + * packet is unchanged. + */ +int av_packet_make_writable(AVPacket *pkt); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * 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); + +/** + * 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); + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +/** + * 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 AV_CODEC_CAP_DR1 has been opened. + */ +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 AV_CODEC_CAP_DR1 has been opened. + */ +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); + +/** + * 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 AV_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 AV_CODEC_CAP_DELAY, then no samples will be returned. + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @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 AV_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. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, + int *got_frame_ptr, const AVPacket *avpkt); + +/** + * 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 AV_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 AV_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. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @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. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const AVPacket *avpkt); + +/** + * 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 AV_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 AV_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 AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The Preallocated 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); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_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 Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available in this state - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters + * with respect to first decoded frame. Applicable + * when flag AV_CODEC_FLAG_DROPCHANGED is set. + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_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. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available in the current state - user + * must try to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + +/** + * Create and return a AVHWFramesContext with values adequate for hardware + * decoding. This is meant to get called from the get_format callback, and is + * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. + * This API is for decoding with certain hardware acceleration modes/APIs only. + * + * The returned AVHWFramesContext is not initialized. The caller must do this + * with av_hwframe_ctx_init(). + * + * Calling this function is not a requirement, but makes it simpler to avoid + * codec or hardware API specific details when manually allocating frames. + * + * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, + * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes + * it unnecessary to call this function or having to care about + * AVHWFramesContext initialization at all. + * + * There are a number of requirements for calling this function: + * + * - It must be called from get_format with the same avctx parameter that was + * passed to get_format. Calling it outside of get_format is not allowed, and + * can trigger undefined behavior. + * - The function is not always supported (see description of return values). + * Even if this function returns successfully, hwaccel initialization could + * fail later. (The degree to which implementations check whether the stream + * is actually supported varies. Some do this check only after the user's + * get_format callback returns.) + * - The hw_pix_fmt must be one of the choices suggested by get_format. If the + * user decides to use a AVHWFramesContext prepared with this API function, + * the user must return the same hw_pix_fmt from get_format. + * - The device_ref passed to this function must support the given hw_pix_fmt. + * - After calling this API function, it is the user's responsibility to + * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), + * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done + * before returning from get_format (this is implied by the normal + * AVCodecContext.hw_frames_ctx API rules). + * - The AVHWFramesContext parameters may change every time time get_format is + * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So + * you are inherently required to go through this process again on every + * get_format call. + * - It is perfectly possible to call this function without actually using + * the resulting AVHWFramesContext. One use-case might be trying to reuse a + * previously initialized AVHWFramesContext, and calling this API function + * only to test whether the required frame parameters have changed. + * - Fields that use dynamically allocated values of any kind must not be set + * by the user unless setting them is explicitly allowed by the documentation. + * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, + * the new free callback must call the potentially set previous free callback. + * This API call may set any dynamically allocated fields, including the free + * callback. + * + * The function will set at least the following fields on AVHWFramesContext + * (potentially more, depending on hwaccel API): + * + * - All fields set by av_hwframe_ctx_alloc(). + * - Set the format field to hw_pix_fmt. + * - Set the sw_format field to the most suited and most versatile format. (An + * implication is that this will prefer generic formats over opaque formats + * with arbitrary restrictions, if possible.) + * - Set the width/height fields to the coded frame size, rounded up to the + * API-specific minimum alignment. + * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size + * field to the number of maximum reference surfaces possible with the codec, + * plus 1 surface for the user to work (meaning the user can safely reference + * at most 1 decoded surface at a time), plus additional buffering introduced + * by frame threading. If the hwaccel does not require pre-allocation, the + * field is left to 0, and the decoder will allocate new surfaces on demand + * during decoding. + * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying + * hardware API. + * + * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but + * with basic frame parameters set. + * + * The function is stateless, and does not change the AVCodecContext or the + * device_ref AVHWDeviceContext. + * + * @param avctx The context which is currently calling get_format, and which + * implicitly contains all state needed for filling the returned + * AVHWFramesContext properly. + * @param device_ref A reference to the AVHWDeviceContext describing the device + * which will be used by the hardware decoder. + * @param hw_pix_fmt The hwaccel format you are going to return from get_format. + * @param out_frames_ref On success, set to a reference to an _uninitialized_ + * AVHWFramesContext, created from the given device_ref. + * Fields will be set to values required for decoding. + * Not changed if an error is returned. + * @return zero on success, a negative value on error. The following error codes + * have special semantics: + * AVERROR(ENOENT): the decoder does not support this functionality. Setup + * is always manual, or it is a decoder which does not + * support setting AVCodecContext.hw_frames_ctx at all, + * or it is a software format. + * AVERROR(EINVAL): it is known that hardware decoding is not supported for + * this configuration, or the device_ref is not supported + * for the hwaccel referenced by hw_pix_fmt. + */ +int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, + AVBufferRef *device_ref, + enum AVPixelFormat hw_pix_fmt, + AVBufferRef **out_frames_ref); + + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + 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 +}; + +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* 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. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * 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. + */ + int key_frame; + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated unused + */ + attribute_deprecated + int64_t convergence_duration; +#endif + + // 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. + */ + int dts_sync_point; + + /** + * 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. + */ + int dts_ref_dts_delta; + + /** + * 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. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * 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. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * 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. + */ + enum AVPictureStructure picture_structure; + + /** + * 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. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +/** + * Iterate over all registered codec parsers. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec parser or NULL when the iteration is + * finished + */ +const AVCodecParser *av_parser_iterate(void **opaque); + +attribute_deprecated +AVCodecParser *av_parser_next(const AVCodecParser *c); + +attribute_deprecated +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 buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + 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); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +/** + * 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); + +/** + * 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); + +/** + * 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_packet_unref(). + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * If AV_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 + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +/** + * 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_packet_unref(). + * @param[in] frame AVFrame containing the raw video data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_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 + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @addtogroup lavc_picture + * @{ + */ + +/** + * @deprecated unused + */ +attribute_deprecated +int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +void avpicture_free(AVPicture *picture); + +/** + * @deprecated use av_image_fill_arrays() instead. + */ +attribute_deprecated +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated use av_image_copy_to_buffer() instead. + */ +attribute_deprecated +int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, + int width, int height, + unsigned char *dest, int dest_size); + +/** + * @deprecated use av_image_get_buffer_size() instead. + */ +attribute_deprecated +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated av_image_copy() instead. + */ +attribute_deprecated +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int top_band, int left_band); + +/** + * @deprecated unused + */ +attribute_deprecated +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); + +/** + * @} + */ +#endif + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +#if FF_API_GETCHROMA +/** + * @deprecated Use av_pix_fmt_get_chroma_sub_sample + */ + +attribute_deprecated +void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif + +/** + * 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); + +/** + * @deprecated see av_get_pix_fmt_loss() + */ +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); + +/** + * @deprecated see av_find_best_pix_fmt_of_2() + */ +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 +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); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +#if FF_API_TAG_STRING +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf buffer to place codec tag in + * @param buf_size size in bytes of buf + * @param codec_tag codec tag to assign + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). + */ +attribute_deprecated +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif + +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); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, 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); + +/** + * 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); + +/** + * 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); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +#if FF_API_OLD_BSF +typedef struct AVBitStreamFilterContext { + void *priv_data; + const struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; + /** + * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). + * Not for access by library users. + */ + char *args; +} AVBitStreamFilterContext; +#endif + +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream 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 libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * 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. + ***************************************************************** + */ + + int priv_data_size; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); + void (*flush)(AVBSFContext *ctx); +} AVBitStreamFilter; + +#if FF_API_OLD_BSF +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +void av_register_bitstream_filter(AVBitStreamFilter *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_get_by_name(), av_bsf_alloc(), and av_bsf_init() + * from the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_send_packet() and av_bsf_receive_packet() from the + * new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +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); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_free() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_iterate(void **opaque); +#if FF_API_NEXT +attribute_deprecated +const AVBitStreamFilter *av_bsf_next(void **opaque); +#endif + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Reset the internal bitstream filter state / flush internal buffers. + */ +void av_bsf_flush(AVBSFContext *ctx); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_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_USER_VISIBLE_AVHWACCEL +/** + * Register the hardware accelerator hwaccel. + * + * @deprecated This function doesn't do anything. + */ +attribute_deprecated +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. + * + * @deprecated AVHWaccel structures contain no user-serviceable parts, so + * this function should not be used. + */ +attribute_deprecated +AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); +#endif + +#if FF_API_LOCKMGR +/** + * Lock operation used by lockmgr + * + * @deprecated Deprecated together with av_lockmgr_register(). + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. The "mutex" argument to the function points + * to a (void *) where the lockmgr should store/get a pointer to a user + * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the + * value left by the last call for all other ops. If the lock manager is + * unable to perform the op then it should leave the mutex in the same + * state as when it was called and return a non-zero value. However, + * when called with AV_LOCK_DESTROY the mutex will always be assumed to + * have been successfully destroyed. If av_lockmgr_register succeeds + * it will return a non-negative value, if it fails it will return a + * negative value and destroy all mutex and unregister all callbacks. + * av_lockmgr_register is not thread-safe, it must be called from a + * single thread before any calls which make use of locking are used. + * + * @param cb User defined callback. av_lockmgr_register invokes calls + * to this callback and the previously registered callback. + * The callback will be used to create more than one mutex + * each of which must be backed by its own underlying locking + * mechanism (i.e. do not use a single static object to + * implement your lock manager). If cb is set to NULL the + * lockmgr will be unregistered. + * + * @deprecated This function does nothing, and always returns 0. Be sure to + * build with thread support to get basic thread safety. + */ +attribute_deprecated +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); +#endif + +/** + * 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); + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/avdct.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avdct.h new file mode 100644 index 00000000..272422e4 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avdct.h @@ -0,0 +1,84 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/avfft.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avfft.h new file mode 100644 index 00000000..0c0f9b8d --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/d3d11va.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/d3d11va.h new file mode 100644 index 00000000..6816b6c1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * 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 + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/dirac.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dirac.h new file mode 100644 index 00000000..e6d9d346 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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 + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/dv_profile.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dv_profile.h new file mode 100644 index 00000000..9380a66f --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dv_profile.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "avcodec.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/dxva2.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dxva2.h new file mode 100644 index 00000000..22c93992 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/jni.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/jni.h new file mode 100644 index 00000000..dd99e926 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/mediacodec.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/mediacodec.h new file mode 100644 index 00000000..4c8545df --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/mediacodec.h @@ -0,0 +1,101 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +/** + * Release a MediaCodec buffer and render it at the given time to the surface + * that is associated with the decoder. The timestamp must be within one second + * of the current java/lang/System#nanoTime() (which is implemented using + * CLOCK_MONOTONIC on Android). See the Android MediaCodec documentation + * of android/media/MediaCodec#releaseOutputBuffer(int,long) for more details. + * + * @param buffer the buffer to render + * @param time timestamp in nanoseconds of when to render the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/qsv.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/qsv.h new file mode 100644 index 00000000..b77158ec --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/qsv.h @@ -0,0 +1,107 @@ +/* + * Intel MediaSDK QSV public API + * + * 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 + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/vaapi.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vaapi.h new file mode 100644 index 00000000..2cf7da58 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vaapi.h @@ -0,0 +1,86 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vaapi + * Public libavcodec VA API header. + */ + +#include +#include "libavutil/attributes.h" +#include "version.h" + +#if FF_API_STRUCT_VAAPI_CONTEXT + +/** + * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding + * @ingroup lavc_codec_hwaccel + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. + */ +struct attribute_deprecated vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; +}; + +/* @} */ + +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/vdpau.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vdpau.h new file mode 100644 index 00000000..4d999433 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vdpau.h @@ -0,0 +1,176 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" +#include "version.h" + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +#if FF_API_VDPAU_PROFILE +/** + * Get a decoder profile that should be used for initializing a VDPAU decoder. + * Should be called from the AVCodecContext.get_format() callback. + * + * @deprecated Use av_vdpau_bind_context() instead. + * + * @param avctx the codec context being used for decoding the stream + * @param profile a pointer into which the result will be written on success. + * The contents of profile are undefined if this function returns + * an error. + * + * @return 0 on success (non-negative), a negative AVERROR on failure. + */ +attribute_deprecated +int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); +#endif + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/version.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/version.h new file mode 100644 index 00000000..e70ebc0c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/version.h @@ -0,0 +1,140 @@ +/* + * 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 + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#define LIBAVCODEC_VERSION_MAJOR 58 +#define LIBAVCODEC_VERSION_MINOR 55 +#define LIBAVCODEC_VERSION_MICRO 101 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#ifndef FF_API_LOWRES +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DEBUG_MV +#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCTX_TIMEBASE +#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODED_FRAME +#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_SIDEDATA_ONLY_PKT +#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VDPAU_PROFILE +#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CONVERGENCE_DURATION +#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPICTURE +#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPACKET_OLD_API +#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STAT_BITS +#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODEC_GET_SET +#define FF_API_CODEC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_USER_VISIBLE_AVHWACCEL +#define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LOCKMGR +#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_UNSANITIZED_BITRATES +#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + + +#endif /* AVCODEC_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/videotoolbox.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/videotoolbox.h new file mode 100644 index 00000000..af2db0d5 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/videotoolbox.h @@ -0,0 +1,127 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + * Created and freed the caller. + */ + VTDecompressionSessionRef session; + + /** + * The output callback that must be passed to the session. + * Set by av_videottoolbox_default_init() + */ + VTDecompressionOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +/** + * Allocate and initialize a Videotoolbox context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create + * the decoder object (using the output callback provided by libavcodec) that + * will be used for Videotoolbox-accelerated decoding. + * + * When decoding with Videotoolbox is finished, the caller must destroy the decoder + * object and free the Videotoolbox context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVideotoolboxContext *av_videotoolbox_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vtctx the Videotoolbox context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); + +/** + * This function must be called to free the Videotoolbox context initialized with + * av_videotoolbox_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_videotoolbox_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/vorbis_parser.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vorbis_parser.h new file mode 100644 index 00000000..789932ac --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * 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 + */ + +/** + * @file + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavcodec/xvmc.h b/Kyoo.Transcoder/ffmpeg/include/libavcodec/xvmc.h new file mode 100644 index 00000000..465ee78d --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavcodec/xvmc.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#include + +#include "libavutil/attributes.h" +#include "version.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavdevice/avdevice.h b/Kyoo.Transcoder/ffmpeg/include/libavdevice/avdevice.h new file mode 100644 index 00000000..ee946248 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavdevice/avdevice.h @@ -0,0 +1,514 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version.h" + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Following API allows user to probe device capabilities (supported codecs, + * pixel formats, sample formats, resolutions, channel counts, etc). + * It is build on top op AVOption API. + * Queried capabilities make it possible to set up converters of video or audio + * parameters that fit to the device. + * + * List of capabilities that can be queried: + * - Capabilities valid for both audio and video devices: + * - codec: supported audio/video codecs. + * type: AV_OPT_TYPE_INT (AVCodecID value) + * - Capabilities valid for audio devices: + * - sample_format: supported sample formats. + * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * - sample_rate: supported sample rates. + * type: AV_OPT_TYPE_INT + * - channels: supported number of channels. + * type: AV_OPT_TYPE_INT + * - channel_layout: supported channel layouts. + * type: AV_OPT_TYPE_INT64 + * - Capabilities valid for video devices: + * - pixel_format: supported pixel formats. + * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * - window_size: supported window sizes (describes size of the window size presented to the user). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - frame_size: supported frame sizes (describes size of provided video frames). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - fps: supported fps values + * type: AV_OPT_TYPE_RATIONAL + * + * Value of the capability may be set by user using av_opt_set() function + * and AVDeviceCapabilitiesQuery object. Following queries will + * limit results to the values matching already set capabilities. + * For example, setting a codec may impact number of formats or fps values + * returned during next query. Setting invalid value may limit results to zero. + * + * Example of the usage basing on opengl output device: + * + * @code + * AVFormatContext *oc = NULL; + * AVDeviceCapabilitiesQuery *caps = NULL; + * AVOptionRanges *ranges; + * int ret; + * + * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) + * goto fail; + * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) + * goto fail; + * + * //query codecs + * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick codec here and set it + * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); + * + * //query format + * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick format here and set it + * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); + * + * //query and set more capabilities + * + * fail: + * //clean up code + * avdevice_capabilities_free(&query, oc); + * avformat_free_context(oc); + * @endcode + */ + +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + +/** + * Initialize capabilities probing API based on AVOption API. + * + * avdevice_capabilities_free() must be called when query capabilities API is + * not used anymore. + * + * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * @param s Context of the device. + * @param device_options An AVDictionary filled with device-private options. + * On return this parameter will be destroyed and replaced with a dict + * containing options that were not found. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * + * @return >= 0 on success, negative otherwise. + */ +int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, + AVDictionary **device_options); + +/** + * Free resources created by avdevice_capabilities_create() + * + * @param caps Device capabilities data to be freed. + * @param s Context of the device. + */ +void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param devices device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavdevice/version.h b/Kyoo.Transcoder/ffmpeg/include/libavdevice/version.h new file mode 100644 index 00000000..e3a583d2 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavdevice/version.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#define LIBAVDEVICE_VERSION_MAJOR 58 +#define LIBAVDEVICE_VERSION_MINOR 9 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavfilter/avfilter.h b/Kyoo.Transcoder/ffmpeg/include/libavfilter/avfilter.h new file mode 100644 index 00000000..9d70e711 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavfilter/avfilter.h @@ -0,0 +1,1168 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version.h" + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; + +/** + * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. + * AVFilter.inputs/outputs). + */ +int avfilter_pad_count(const AVFilterPad *pads); + +/** + * 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); + +/** + * 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); + +/** + * 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. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 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. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 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. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 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. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * 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. + */ + const AVFilterPad *inputs; + /** + * 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. + */ + const AVFilterPad *outputs; + + /** + * 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. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * 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 pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * 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); + + /** + * 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); + + /** + * 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); + + /** + * 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 *); + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Used by the filter registration system. Must not be touched by any other + * code. + */ + struct AVFilter *next; + + /** + * 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); + + /** + * 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); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< 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 initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; + + /** + * Sets the number of extra hardware frames which the filter will + * allocate on its output links for use in following filters or by + * the caller. + * + * Some hardware filters require all frames that they will use for + * output to be defined in advance before filtering starts. For such + * filters, any hardware frame pools used for output must therefore be + * of fixed size. The extra frames set here are on top of any number + * that the filter needs internally in order to operate normally. + * + * This field must be set before the graph containing this filter is + * configured. + */ + int extra_hw_frames; +}; + +/** + * 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. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ + uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + int sample_rate; ///< samples per second + + int format; ///< 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. + */ + AVRational time_base; + + /***************************************************************** + * 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. + * + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * Lists of channel layouts and sample rates used for automatic + * negotiation. + */ + AVFilterFormats *in_samplerates; + AVFilterFormats *out_samplerates; + struct AVFilterChannelLayouts *in_channel_layouts; + struct AVFilterChannelLayouts *out_channel_layouts; + + /** + * 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. + */ + int request_samples; + + /** 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; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically 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. + * If the source frame rate is unknown or variable, set this to 1/0. + * 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. + */ + AVRational frame_rate; + + /** + * Buffer partially filled with samples to achieve a fixed/minimum size. + */ + AVFrame *partial_buf; + + /** + * Size of the partial buffer to allocate. + * Must be between min_samples and max_samples. + */ + int partial_buf_size; + + /** + * 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. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of channels. + */ + int channels; + + /** + * Link processing flags. + */ + unsigned flags; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * 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); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +#if FF_API_FILTER_GET_SET +/** + * Get the number of channels of a link. + * @deprecated Use av_buffersink_get_channels() + */ +attribute_deprecated +int avfilter_link_get_channels(AVFilterLink *link); +#endif + +/** + * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. + */ +attribute_deprecated +void avfilter_link_set_closed(AVFilterLink *link, int closed); + +/** + * 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); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define 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); + +/** + * Iterate over all registered filters. + * + * @param opaque a pointer where libavfilter will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered filter or NULL when the iteration is + * finished + */ +const AVFilter *av_filter_iterate(void **opaque); + +#if FF_API_NEXT +/** Initialize the filter system. Register all builtin filters. */ +attribute_deprecated +void avfilter_register_all(void); + +/** + * 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 + */ +attribute_deprecated +int avfilter_register(AVFilter *filter); + +/** + * 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. + */ +attribute_deprecated +const AVFilter *avfilter_next(const AVFilter *prev); +#endif + +/** + * 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. + */ +const AVFilter *avfilter_get_by_name(const char *name); + + +/** + * 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); + +/** + * 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); + +/** + * 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); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * 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); + +/** + * 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); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#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. + */ + int thread_type; + + /** + * 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. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * 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. + */ + void *opaque; + + /** + * 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. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< 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. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * 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 on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +/** + * 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); + +/** + * 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); + +enum { + 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); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * 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. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * 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); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * 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 graph 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); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @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); + +/** + * 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); + +/** + * 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); + +/** + * 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 alphanumeric 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); + + +/** + * 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); + +/** + * 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); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersink.h b/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersink.h new file mode 100644 index 00000000..3c846bb5 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersink.h @@ -0,0 +1,165 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + */ + +/** + * 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); + +/** + * 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 + +/** + * Struct to use for initializing a buffersink context. + */ +typedef struct AVBufferSinkParams { + const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE +} AVBufferSinkParams; + +/** + * Create an AVBufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVBufferSinkParams *av_buffersink_params_alloc(void); + +/** + * Struct to use for initializing an abuffersink context. + */ +typedef struct AVABufferSinkParams { + 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); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const 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 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * 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. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_frame(). + * + * @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); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersrc.h b/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersrc.h new file mode 100644 index 00000000..08fbd18a --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavfilter/buffersrc.h @@ -0,0 +1,209 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * 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, + +}; + +/** + * 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); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per second. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx 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. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx 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. + */ +av_warn_unused_result +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 controlled + * 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 + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavfilter/version.h b/Kyoo.Transcoder/ffmpeg/include/libavfilter/version.h new file mode 100644 index 00000000..58a0221f --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavfilter/version.h @@ -0,0 +1,66 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#define LIBAVFILTER_VERSION_MAJOR 7 +#define LIBAVFILTER_VERSION_MINOR 58 +#define LIBAVFILTER_VERSION_MICRO 101 + + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_OLD_FILTER_OPTS_ERROR +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_FILTER_GET_SET +#define FF_API_FILTER_GET_SET (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFILTER_VERSION_MAJOR < 8) +#endif + +#endif /* AVFILTER_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavformat/avformat.h b/Kyoo.Transcoder/ffmpeg/include/libavformat/avformat.h new file mode 100644 index 00000000..6eb329f1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavformat/avformat.h @@ -0,0 +1,3092 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * 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). + * 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 + * input/output formats using the av_demuxer_iterate / av_muxer_iterate() 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 + * It is possible to configure lavf 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. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @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, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file: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_send_packet() 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_packet_make_refcounted() will ensure that + * the data is reference counted, copying the data if necessary. + * In both cases, the packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version.h" + +struct AVFormatContext; + +struct AVDeviceInfoList; +struct AVDeviceCapabilitiesQuery; + +/** + * @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". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - 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 s associated IO context + * @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 s associated IO context + * @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); + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define 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. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< 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 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * 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. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< 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. + ***************************************************************** + */ + /** + * The ff_const59 define is not part of the public API and will + * be removed without further warning. + */ +#if FF_API_AVIOFORMAT +#define ff_const59 +#else +#define ff_const59 const +#endif + ff_const59 struct AVOutputFormat *next; + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + + int (*write_header)(struct AVFormatContext *); + /** + * 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); + int (*write_trailer)(struct AVFormatContext *); + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + /** + * 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); + + void (*get_output_timestamp)(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + + /** + * Write an uncoded AVFrame. + * + * See av_write_uncoded_frame() for details. + * + * The library will free *frame afterwards, but the muxer can prevent it + * by setting the pointer to NULL. + */ + int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, + AVFrame **frame, unsigned flags); + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * AVStream parameters that need to be set before packets are sent. + * This method must not write output. + * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * + * Any allocations made here must be freed in deinit(). + */ + int (*init)(struct AVFormatContext *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * 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. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * 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. + ***************************************************************** + */ + ff_const59 struct AVInputFormat *next; + + /** + * Raw demuxers store their codec ID here. + */ + int raw_codec_id; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * 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)(const AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'avformat_new_stream' should be + * called to create new streams. + */ + int (*read_header)(struct AVFormatContext *); + + /** + * 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); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + + /** + * 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); + + /** + * 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); + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + /** + * 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); + + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +} AVInputFormat; +/** + * @} + */ + +enum AVStreamParseType { + 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, /**< 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 */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * 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 + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + 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). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * 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 0x0040 +#define AV_DISPOSITION_HEARING_IMPAIRED 0x0080 /**< stream for hearing impaired audiences */ +#define AV_DISPOSITION_VISUAL_IMPAIRED 0x0100 /**< stream for visual impaired audiences */ +#define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) 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 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 + +typedef struct AVStreamInternal AVStreamInternal; + +/** + * To specify text track kind (different from subtitles default). + */ +#define AV_DISPOSITION_CAPTIONS 0x10000 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000 +#define AV_DISPOSITION_METADATA 0x40000 +#define AV_DISPOSITION_DEPENDENT 0x80000 ///< dependent audio stream (mix_type=0 in mpegts) +#define AV_DISPOSITION_STILL_IMAGE 0x100000 ///< still images in video stream (still_picture_flag=1 in mpegts) + +/** + * 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*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; +#if FF_API_LAVF_AVCTX + /** + * @deprecated use the codecpar struct instead + */ + attribute_deprecated + AVCodecContext *codec; +#endif + void *priv_data; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * 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. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + int disposition; /**< AV_DISPOSITION_* bit field */ + + enum AVDiscard discard; ///< 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. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * 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 + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags for the user to detect events happening on the stream. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVSTREAM_EVENT_FLAG_*. + */ + int event_flags; +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * 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. + */ + AVRational r_frame_rate; + +#if FF_API_LAVF_FFSERVER + /** + * String containing pairs of key and values describing recommended encoder configuration. + * Pairs are separated by ','. + * Keys are separated from values by '='. + * + * @deprecated unused + */ + attribute_deprecated + char *recommended_encoder_configuration; +#endif + + /** + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; + + /***************************************************************** + * 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. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. + ***************************************************************** + */ + +#define MAX_STD_TIMEBASES (30*12+30+3+6) + /** + * Stream information used internally by avformat_find_stream_info() + */ + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + int64_t rfps_duration_sum; + double (*duration_error)[2][MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + int64_t codec_info_duration_fields; + int frame_delay_evidence; + + /** + * 0 -> decoder has not been searched for yet. + * >0 -> decoder found + * <0 -> decoder with codec_id == -found_decoder has not been found + */ + int found_decoder; + + int64_t last_duration; + + /** + * Those are used for average framerate estimation. + */ + int64_t fps_first_dts; + int fps_first_dts_idx; + int64_t fps_last_dts; + int fps_last_dts_idx; + + } *info; + + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + + // 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. + */ + int64_t first_dts; + int64_t cur_dts; + int64_t last_IP_pts; + int last_IP_duration; + + /** + * Number of packets to buffer for codec probing + */ + int probe_packets; + + /** + * Number of frames that have been demuxed during avformat_find_stream_info() + */ + int codec_info_nb_frames; + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + /** + * last packet in packet_buffer for this stream when muxing. + */ + struct AVPacketList *last_in_packet_buffer; + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + /** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + */ + int stream_identifier; + + /** + * Details of the MPEG-TS program which created this stream. + */ + int program_num; + int pmt_version; + int pmt_stream_idx; + + int64_t interleaver_chunk_size; + int64_t interleaver_chunk_duration; + + /** + * 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 + */ + int request_probe; + /** + * Indicates that everything up to the next keyframe + * should be discarded. + */ + int skip_to_keyframe; + + /** + * Number of samples to skip at the start of the frame decoded from the next packet. + */ + int skip_samples; + + /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** + * If not 0, the first audio sample that should be discarded from the stream. + * This is broken by design (needs global sample count), but can't be + * avoided for broken by design formats such as mp3 with ad-hoc gapless + * audio support. + */ + int64_t first_discard_sample; + + /** + * The sample after last sample that is intended to be discarded after + * first_discard_sample. Works on frame boundaries only. Used to prevent + * early EOF if the gapless info is broken (considered concatenated mp3s). + */ + int64_t last_discard_sample; + + /** + * 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. + */ + int nb_decoded_frames; + + /** + * Timestamp offset added to timestamps before muxing + * NOT PART OF PUBLIC API + */ + int64_t mux_ts_offset; + + /** + * Internal data to check for wrapping of the time stamp + */ + int64_t pts_wrap_reference; + + /** + * 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. + */ + int pts_wrap_behavior; + + /** + * Internal data to prevent doing update_initial_durations() twice + */ + int update_initial_durations_done; + + /** + * Internal data to generate dts from pts + */ + int64_t pts_reorder_error[MAX_REORDER_DELAY+1]; + uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1]; + + /** + * Internal data to analyze DTS and detect faulty mpeg streams + */ + int64_t last_dts_for_order_check; + uint8_t dts_ordered; + uint8_t dts_misordered; + + /** + * Internal data to inject global side data + */ + int inject_global_side_data; + + /** + * display aspect ratio (0 if unknown) + * - encoding: unused + * - decoding: Set by libavformat to calculate sample_aspect_ratio internally + */ + AVRational display_aspect_ratio; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; +} AVStream; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVStream fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_stream_get_r_frame_rate(const AVStream *s); +attribute_deprecated +void av_stream_set_r_frame_rate(AVStream *s, AVRational r); +#if FF_API_LAVF_FFSERVER +attribute_deprecated +char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +attribute_deprecated +void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); +#endif +#endif + +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + +/** + * Returns the pts of the last muxed packet + its duration + * + * the retuned value is undefined when used with a demuxer. + */ +int64_t av_stream_get_end_pts(const AVStream *st); + +#define AV_PROGRAM_RUNNING 1 + +/** + * 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*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + int pmt_version; + + /***************************************************************** + * 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. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + 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) +}; + +typedef struct AVFormatInternal AVFormatInternal; + +/** + * 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. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + ff_const59 struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + ff_const59 struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * 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. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: 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(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + +#if FF_API_FORMAT_FILENAME + /** + * input or output filename + * + * - demuxing: set by avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * @deprecated Use url instead. + */ + attribute_deprecated + char filename[1024]; +#endif + + /** + * input or output URL. Unlike the old filename field, this field has no + * length restriction. + * + * - demuxing: set by avformat_open_input(), initialized to an empty + * string if url parameter was NULL in avformat_open_input(). + * - muxing: may be set by the caller before calling avformat_write_header() + * (or avformat_init_output() if that is called first) to a string + * which is freeable by av_free(). Set to an empty string if it + * was NULL in avformat_init_output(). + * + * Freed by libavformat in avformat_free_context(). + */ + char *url; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< 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 +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#if FF_API_LAVF_MP4A_LATM +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer + + /** + * Maximum size of the data read from input for determining + * the input container format. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags for the user to detect events happening on the file. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVFMT_EVENT_FLAG_*. + */ + int event_flags; +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * Avoid negative timestamps during muxing. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * 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 + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * 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 + */ + int probe_score; + + /** + * number of bytes to read maximally to identify format. + * - encoding: unused + * - decoding: set by user + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; + + /** + * 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; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + +#if FF_API_OLD_OPEN_CALLBACKS + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then some simple checks are used together with avio_open2(). + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. + */ + attribute_deprecated + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /** + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; + + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; +} AVFormatContext; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int av_format_get_probe_score(const AVFormatContext *s); +attribute_deprecated +AVCodec * av_format_get_video_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_data_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +int av_format_get_metadata_header_padding(const AVFormatContext *s); +attribute_deprecated +void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +attribute_deprecated +void * av_format_get_opaque(const AVFormatContext *s); +attribute_deprecated +void av_format_set_opaque(AVFormatContext *s, void *opaque); +attribute_deprecated +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +attribute_deprecated +void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif +#endif + +/** + * This function will cause global side data to be injected in the next packet + * of each stream as well as after any subsequent seek. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * 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); + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * 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); + +#if FF_API_NEXT +/** + * 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() + */ +attribute_deprecated +void av_register_all(void); + +attribute_deprecated +void av_register_input_format(AVInputFormat *format); +attribute_deprecated +void av_register_output_format(AVOutputFormat *format); +#endif + +/** + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. + * + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. + */ +int avformat_network_deinit(void); + +#if FF_API_NEXT +/** + * 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. + */ +attribute_deprecated +AVInputFormat *av_iformat_next(const 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. + */ +attribute_deprecated +AVOutputFormat *av_oformat_next(const AVOutputFormat *f); +#endif + +/** + * Iterate over all registered muxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered muxer or NULL when the iteration is + * finished + */ +const AVOutputFormat *av_muxer_iterate(void **opaque); + +/** + * Iterate over all registered demuxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered demuxer or NULL when the iteration is + * finished + */ +const AVInputFormat *av_demuxer_iterate(void **opaque); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * 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 s media file handle + * @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); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); +/** + * Get side information from stream. + * + * @param stream stream + * @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_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * 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, ff_const59 AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +ff_const59 AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @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. + */ +ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 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. + */ +ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 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 url the url 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, ff_const59 AVInputFormat **fmt, + const char *url, 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, ff_const59 AVInputFormat **fmt, + const char *url, 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 url URL 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 *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); + +attribute_deprecated +int av_demuxer_open(AVFormatContext *ic); + +/** + * 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); + +/** + * 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); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * 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); + +/** + * 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_packet_unref 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); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @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 s media file handle + * @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); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * 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); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#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 + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * 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 AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @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 AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter 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. + *
+ * 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". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved in the order of + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. + * The caller must not access the data through this reference after + * this function returns. If the packet is not reference-counted, + * libavformat will make a copy. + *
+ * This parameter 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". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. Libavformat will always + * take care of freeing the packet, even if this function fails. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, then av_interleaved_write_frame() must be used. + * + * See av_interleaved_write_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * 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); + +/** + * 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 + */ +ff_const59 AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(ff_const59 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, const AVPacket *pkt, int dump_payload, const 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, const AVPacket *pkt, int dump_payload, + const 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 + * @param tag codec tag to match to a codec ID + */ +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 + * @param id codec ID to match to a 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 st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @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); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * 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 + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +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 filename file name to check against the given extensions + * @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 ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @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(const 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); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_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); + +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped + * @param bsfc a NULL-terminated list of filters to apply + * @return >=0 on success; + * AVERROR code on failure + */ +attribute_deprecated +int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, + AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavformat/avio.h b/Kyoo.Transcoder/ffmpeg/include/libavformat/avio.h new file mode 100644 index 00000000..9141642e --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavformat/avio.h @@ -0,0 +1,881 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#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" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * 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. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +typedef struct AVIODirContext { + struct URLContext *url_context; +} AVIODirContext; + +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * 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() + */ +typedef struct AVIOContext { + /** + * 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. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< 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. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + 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); + int64_t pos; /**< position in the file of the current buffer */ + int eof_reached; /**< true if was unable to read due to error or eof */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; /**< 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); + /** + * 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); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; + + /** + * 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. + */ + int direct; + + /** + * Bytes read statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t bytes_read; + + /** + * seek statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int seek_count; + + /** + * writeout statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int writeout_count; + + /** + * Original buffer size + * used internally after probing and ensure seekback to reset the buffer size + * This field is internal to libavformat and access from outside is not allowed. + */ + int orig_buffer_size; + + /** + * Threshold to favor readahead over seek. + * This is current internal only, do not use from outside. + */ + int short_seek_threshold; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * 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); + +/** + * Move or rename a resource. + * + * @note url_src and url_dst should share the same protocol and authority. + * + * @param url_src url to resource to be moved + * @param url_dst new url to resource if the operation succeeded + * @return >=0 on success or negative on error. + */ +int avpriv_io_move(const char *url_src, const char *url_dst); + +/** + * Delete a resource. + * + * @param url resource to be deleted. + * @return >=0 on success or negative on error. + */ +int avpriv_io_delete(const char *url); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @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. + * For stream protocols, must never return 0 but rather + * a proper AVERROR code. + * @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)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +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. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing 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 + +/** + * Passing this flag as 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); + +/** + * Similar to feof() but also returns nonzero on read errors. + * @return non zero if and only if at end of file or a read error happened when reading. + */ +int avio_feof(AVIOContext *s); + +/** + * Writes a formatted string to the context. + * @return number of bytes written, < 0 on error. + */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Write a NULL terminated array of strings to the context. + * Usually you don't need to use this function directly but its macro wrapper, + * avio_print. + */ +void avio_print_string_array(AVIOContext *s, const char *strings[]); + +/** + * Write strings (const char *) to the context. + * This is a convenience macro around avio_print_string_array and it + * automatically creates the string array from the variable argument list. + * For simple string concatenations this function is more performant than using + * avio_printf since it does not need a temporary buffer. + */ +#define avio_print(s, ...) \ + avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL}) + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +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); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(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. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|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. + */ +#define 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. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * 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 url resource to access + * @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); + +/** + * 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 url resource to access + * @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); + +/** + * 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 AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding 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_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_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 h IO context from which to call the read_pause function pointer + * @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 h IO context from which to call the seek function pointers + * @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); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavformat/version.h b/Kyoo.Transcoder/ffmpeg/include/libavformat/version.h new file mode 100644 index 00000000..af0db1e9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavformat/version.h @@ -0,0 +1,114 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here +#define LIBAVFORMAT_VERSION_MAJOR 58 +#define LIBAVFORMAT_VERSION_MINOR 31 +#define LIBAVFORMAT_VERSION_MICRO 104 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_USE_LOCALTIME +#define FF_API_HLS_USE_LOCALTIME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_GET_SET +#define FF_API_FORMAT_GET_SET (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_AVIO_EOF_0 +#define FF_API_OLD_AVIO_EOF_0 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_FFSERVER +#define FF_API_LAVF_FFSERVER (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_FILENAME +#define FF_API_FORMAT_FILENAME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_RTSP_OPTIONS +#define FF_API_OLD_RTSP_OPTIONS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DASH_MIN_SEG_DURATION +#define FF_API_DASH_MIN_SEG_DURATION (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_MP4A_LATM +#define FF_API_LAVF_MP4A_LATM (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVIOFORMAT +#define FF_API_AVIOFORMAT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif + + +#ifndef FF_API_R_FRAME_RATE +#define FF_API_R_FRAME_RATE 1 +#endif +#endif /* AVFORMAT_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/adler32.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/adler32.h new file mode 100644 index 00000000..a1f035b7 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/adler32.h @@ -0,0 +1,60 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + */ + +/** + * @file + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/aes.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/aes.h new file mode 100644 index 00000000..09efbda1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/aes.h @@ -0,0 +1,65 @@ +/* + * copyright (c) 2007 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 + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * @param count number of 16 byte blocks + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/aes_ctr.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/aes_ctr.h new file mode 100644 index 00000000..e4aae126 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/aes_ctr.h @@ -0,0 +1,88 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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 + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the 8-byte iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Forcefully change the "full" 16-byte iv, including the counter + */ +void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/attributes.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/attributes.h new file mode 100644 index 00000000..ced108aa --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/attributes.h @@ -0,0 +1,167 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/audio_fifo.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/audio_fifo.h new file mode 100644 index 00000000..d8a9194a --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/audio_fifo.h @@ -0,0 +1,187 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * 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 + */ + +/** + * @file + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "avutil.h" +#include "fifo.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/avassert.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/avassert.h new file mode 100644 index 00000000..9abeadea --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 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 + */ + +/** + * @file + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point operations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/avconfig.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/avconfig.h new file mode 100644 index 00000000..c289fbb5 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffmpeg configure */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/avstring.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/avstring.h new file mode 100644 index 00000000..37dd4e2d --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/avstring.h @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Convert a number to an av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * See libc sscanf manual for more information. + * Locale-independent sscanf implementation. + */ +int av_sscanf(const char *string, const char *format, ...); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/avutil.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/avutil.h new file mode 100644 index 00000000..4d633156 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/avutil.h @@ -0,0 +1,365 @@ +/* + * copyright (c) 2006 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @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 libsws "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. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(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 + */ + +enum AVMediaType { + 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 + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/blowfish.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/blowfish.h new file mode 100644 index 00000000..9e289a40 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/bprint.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/bprint.h new file mode 100644 index 00000000..c09b1ac1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/bprint.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * 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 + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local "char buf[512]". + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, buf->len can be greater than buf->size and records the + * total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The size_max field determines several possible behaviours: + * + * size_max = -1 (= UINT_MAX) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * + * size_max = 0 prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using size_init = size_max = len + 1). + * + * size_max = 1 is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +#define AV_BPRINT_SIZE_AUTOMATIC 1 +#define AV_BPRINT_SIZE_COUNT_ONLY 0 + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * 0 means do not write anything, just count the length; + * 1 is replaced by the maximum value for automatic storage; + * any large value means that the internal buffer will be + * reallocated as needed up to that limit; -1 is converted to + * UINT_MAX, the largest limit possible. + * Check also AV_BPRINT_SIZE_* macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#endif /* AVUTIL_BPRINT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/bswap.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/bswap.h new file mode 100644 index 00000000..91cb7953 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/bswap.h @@ -0,0 +1,109 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/buffer.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/buffer.h new file mode 100644 index 00000000..73b6bd0b --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/buffer.h @@ -0,0 +1,291 @@ +/* + * 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 + */ + +/** + * @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). + */ +typedef struct AVBuffer AVBuffer; + +/** + * 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. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * 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. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + int size; +} AVBufferRef; + +/** + * 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)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + +/** + * 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. + */ +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); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/camellia.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/camellia.h new file mode 100644 index 00000000..e674c9b9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/cast5.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/cast5.h new file mode 100644 index 00000000..ad5b347e --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/channel_layout.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/channel_layout.h new file mode 100644 index 00000000..50bb8f03 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/channel_layout.h @@ -0,0 +1,232 @@ +/* + * 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 + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include + +/** + * @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. + * + * @{ + */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. +#define AV_CH_WIDE_LEFT 0x0000000080000000ULL +#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL +#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL +#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL +#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL + +/** 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. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL + +/** + * @} + * @defgroup channel_mask_c Audio channel layouts + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +enum AVMatrixEncoding { + 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 '|': + * - 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, 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 "0x" (see the + * AV_CH_* macros). + * + * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" + */ +uint64_t av_get_channel_layout(const char *name); + +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + +/** + * 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); + +/** + * 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); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/common.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/common.h new file mode 100644 index 00000000..8db02911 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/common.h @@ -0,0 +1,560 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" +#include "version.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +/* misc math functions */ + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a double value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + ERROR\ + while (val & top) {\ + int tmp= (GET_BYTE) - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32 av_sat_dsub32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/cpu.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/cpu.h new file mode 100644 index 00000000..8bb9eb60 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/cpu.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2000, 2001, 2002 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#include "attributes.h" + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 +#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Set a mask on flags returned by av_get_cpu_flags(). + * This function is mainly useful for testing. + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible + */ +attribute_deprecated void av_set_cpu_flags_mask(int mask); + +/** + * Parse CPU flags from a string. + * + * The returned flags contain the specified flags as well as related unspecified flags. + * + * This function exists only for compatibility with libav. + * Please use av_parse_cpu_caps() when possible. + * @return a combination of AV_CPU_* flags, negative on error. + */ +attribute_deprecated +int av_parse_cpu_flags(const char *s); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/crc.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/crc.h new file mode 100644 index 00000000..47e22b4c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/crc.h @@ -0,0 +1,100 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ + AV_CRC_24_IEEE, + AV_CRC_8_EBU, + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/des.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/des.h new file mode 100644 index 00000000..4cf11f5b --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/des.h @@ -0,0 +1,77 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/dict.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/dict.h new file mode 100644 index 00000000..118f1f00 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/dict.h @@ -0,0 +1,200 @@ +/* + * 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 + */ + +/** + * @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. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +#include "version.h" + +/** + * @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 + AVDictionaryEntry *t = NULL; + + 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); + + while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { + <....> // iterate over all entries in d + } + av_dict_free(&d); + @endcode + */ + +#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ +#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, + ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * To iterate through all the dictionary entries, you can set the matching key + * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key matching key + * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved + * @return found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * 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. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * + * @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 either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key 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); + +/** + * Convenience wrapper for av_dict_set that converts the value to a string + * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created 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 + * @return 0 on success, negative AVERROR code on failure. If dst was allocated + * by this function, callers should free the associated memory. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @param[in] m dictionary + * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/display.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/display.h new file mode 100644 index 00000000..515adad7 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/display.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * 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 + */ + +/** + * @file + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include +#include "common.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure counterclockwise + * rotation by the specified angle (in degrees). + * + * @param matrix an allocated transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param matrix an allocated transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/downmix_info.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/downmix_info.h new file mode 100644 index 00000000..221cf5bf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * 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 + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/encryption_info.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/encryption_info.h new file mode 100644 index 00000000..8fe7ebfe --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/encryption_info.h @@ -0,0 +1,205 @@ +/** + * 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 + */ + +#ifndef AVUTIL_ENCRYPTION_INFO_H +#define AVUTIL_ENCRYPTION_INFO_H + +#include +#include + +typedef struct AVSubsampleEncryptionInfo { + /** The number of bytes that are clear. */ + unsigned int bytes_of_clear_data; + + /** + * The number of bytes that are protected. If using pattern encryption, + * the pattern applies to only the protected bytes; if not using pattern + * encryption, all these bytes are encrypted. + */ + unsigned int bytes_of_protected_data; +} AVSubsampleEncryptionInfo; + +/** + * This describes encryption info for a packet. This contains frame-specific + * info for how to decrypt the packet before passing it to the decoder. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInfo { + /** The fourcc encryption scheme, in big-endian byte order. */ + uint32_t scheme; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are encrypted. + */ + uint32_t crypt_byte_block; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are clear. + */ + uint32_t skip_byte_block; + + /** + * The ID of the key used to encrypt the packet. This should always be + * 16 bytes long, but may be changed in the future. + */ + uint8_t *key_id; + uint32_t key_id_size; + + /** + * The initialization vector. This may have been zero-filled to be the + * correct block size. This should always be 16 bytes long, but may be + * changed in the future. + */ + uint8_t *iv; + uint32_t iv_size; + + /** + * An array of subsample encryption info specifying how parts of the sample + * are encrypted. If there are no subsamples, then the whole sample is + * encrypted. + */ + AVSubsampleEncryptionInfo *subsamples; + uint32_t subsample_count; +} AVEncryptionInfo; + +/** + * This describes info used to initialize an encryption key system. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInitInfo { + /** + * A unique identifier for the key system this is for, can be NULL if it + * is not known. This should always be 16 bytes, but may change in the + * future. + */ + uint8_t* system_id; + uint32_t system_id_size; + + /** + * An array of key IDs this initialization data is for. All IDs are the + * same length. Can be NULL if there are no known key IDs. + */ + uint8_t** key_ids; + /** The number of key IDs. */ + uint32_t num_key_ids; + /** + * The number of bytes in each key ID. This should always be 16, but may + * change in the future. + */ + uint32_t key_id_size; + + /** + * Key-system specific initialization data. This data is copied directly + * from the file and the format depends on the specific key system. This + * can be NULL if there is no initialization data; in that case, there + * will be at least one key ID. + */ + uint8_t* data; + uint32_t data_size; + + /** + * An optional pointer to the next initialization info in the list. + */ + struct AVEncryptionInitInfo *next; +} AVEncryptionInitInfo; + +/** + * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given + * number of subsamples. This will allocate pointers for the key ID, IV, + * and subsample entries, set the size members, and zero-initialize the rest. + * + * @param subsample_count The number of subsamples. + * @param key_id_size The number of bytes in the key ID, should be 16. + * @param iv_size The number of bytes in the IV, should be 16. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size); + +/** + * Allocates an AVEncryptionInfo structure with a copy of the given data. + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info); + +/** + * Frees the given encryption info object. This MUST NOT be used to free the + * side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_info_free(AVEncryptionInfo *info); + +/** + * Creates a copy of the AVEncryptionInfo that is contained in the given side + * data. The resulting object should be passed to av_encryption_info_free() + * when done. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * info. The resulting pointer should be either freed using av_free or given + * to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_info_add_side_data( + const AVEncryptionInfo *info, size_t *side_data_size); + + +/** + * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the + * given sizes. This will allocate pointers and set all the fields. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_alloc( + uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size); + +/** + * Frees the given encryption init info object. This MUST NOT be used to free + * the side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_init_info_free(AVEncryptionInitInfo* info); + +/** + * Creates a copy of the AVEncryptionInitInfo that is contained in the given + * side data. The resulting object should be passed to + * av_encryption_init_info_free() when done. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_get_side_data( + const uint8_t* side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * init info. The resulting pointer should be either freed using av_free or + * given to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_init_info_add_side_data( + const AVEncryptionInitInfo *info, size_t *side_data_size); + +#endif /* AVUTIL_ENCRYPTION_INFO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/error.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/error.h new file mode 100644 index 00000000..71df4da3 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/error.h @@ -0,0 +1,126 @@ +/* + * 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 + */ + +/** + * @file + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< 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. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define 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); + +/** + * 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; +} + +/** + * 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) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/eval.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/eval.h new file mode 100644 index 00000000..dacd22b9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/eval.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002 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 + */ + +/** + * @file + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/ffversion.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/ffversion.h new file mode 100644 index 00000000..d1c3a03d --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "N-94664-g0821bc4eee" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/fifo.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/fifo.h new file mode 100644 index 00000000..dc7bc6f0 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/fifo.h @@ -0,0 +1,179 @@ +/* + * 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 + */ + +/** + * @file + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include "avutil.h" +#include "attributes.h" + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Initialize an AVFifoBuffer. + * @param nmemb number of elements + * @param size size of the single element + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); + +/** + * Free an AVFifoBuffer. + * @param f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Free an AVFifoBuffer and reset pointer to NULL. + * @param f AVFifoBuffer to free + */ +void av_fifo_freep(AVFifoBuffer **f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(const AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(const AVFifoBuffer *f); + +/** + * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param offset offset from current read position + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param f AVFifoBuffer to write to + * @param src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Enlarge an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * The new fifo size may be larger than the requested size. + * + * @param f AVFifoBuffer to resize + * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +/** + * Return a pointer to the data stored in a FIFO buffer at a certain offset. + * The FIFO buffer is not modified. + * + * @param f AVFifoBuffer to peek at, f must be non-NULL + * @param offs an offset in bytes, its absolute value must be less + * than the used buffer size or the returned pointer will + * point outside to the buffer data. + * The used buffer size can be checked with av_fifo_size(). + */ +static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr = f->buffer + (ptr - f->end); + else if (ptr < f->buffer) + ptr = f->end - (f->buffer - ptr); + return ptr; +} + +#endif /* AVUTIL_FIFO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/file.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/file.h new file mode 100644 index 00000000..3ef4a602 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/file.h @@ -0,0 +1,71 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include + +#include "avutil.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * Unlike mmap this function succeeds with zero sized files, in this + * case *bufptr will be set to NULL and *size will be set to 0. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +/** + * Wrapper to work around the lack of mkstemp() on mingw. + * Also, tries to create file in /tmp first, if possible. + * *prefix can be a character constant; *filename will be allocated internally. + * @return file descriptor of opened file (or negative value corresponding to an + * AVERROR code on error) + * and opened file name in **filename. + * @note On very old libcs it is necessary to set a secure umask before + * calling this, av_tempfile() can't call umask itself as it is used in + * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms + */ +int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); + +#endif /* AVUTIL_FILE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/frame.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/frame.h new file mode 100644 index 00000000..5d3231e7 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/frame.h @@ -0,0 +1,971 @@ +/* + * 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 + */ + +/** + * @file + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_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_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, + +#if FF_API_FRAME_QP + /** + * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA. + * The contents of this side data are undocumented and internal; use + * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a + * meaningful way instead. + */ + AV_FRAME_DATA_QP_TABLE_PROPERTIES, + + /** + * Raw QP table data. Its format is described by + * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and + * av_frame_get_qp_table() to access this instead. + */ + AV_FRAME_DATA_QP_TABLE_DATA, +#endif + + /** + * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.c. + */ + AV_FRAME_DATA_S12M_TIMECODE, + + /** + * HDR dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRPlus type and contains information for color + * volume transform - application 4 of SMPTE 2094-40:2016 standard. + */ + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, + + /** + * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of + * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size. + */ + AV_FRAME_DATA_REGIONS_OF_INTEREST, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + int size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * Structure describing a single Region Of Interest. + * + * When multiple regions are defined in a single side-data block, they + * should be ordered from most to least important - some encoders are only + * capable of supporting a limited number of distinct regions, so will have + * to truncate the list. + * + * When overlapping regions are defined, the first region containing a given + * area of the frame applies. + */ +typedef struct AVRegionOfInterest { + /** + * Must be set to the size of this data structure (that is, + * sizeof(AVRegionOfInterest)). + */ + uint32_t self_size; + /** + * Distance in pixels from the top edge of the frame to the top and + * bottom edges and from the left edge of the frame to the left and + * right edges of the rectangle defining this region of interest. + * + * The constraints on a region are encoder dependent, so the region + * actually affected may be slightly larger for alignment or other + * reasons. + */ + int top; + int bottom; + int left; + int right; + /** + * Quantisation offset. + * + * Must be in the range -1 to +1. A value of zero indicates no quality + * change. A negative value asks for better quality (less quantisation), + * while a positive value asks for worse quality (greater quantisation). + * + * The range is calibrated so that the extreme values indicate the + * largest possible offset - if the rest of the frame is encoded with the + * worst possible quality, an offset of -1 indicates that this region + * should be encoded with the best possible quality anyway. Intermediate + * values are then interpolated in some codec-dependent way. + * + * For example, in 10-bit H.264 the quantisation parameter varies between + * -12 and 51. A typical qoffset value of -1/10 therefore indicates that + * this region should be encoded with a QP around one-tenth of the full + * range better than the rest of the frame. So, if most of the frame + * were to be encoded with a QP of around 30, this region would get a QP + * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). + * An extreme value of -1 would indicate that this region should be + * encoded with the best possible quality regardless of the treatment of + * the rest of the frame - that is, should be encoded at a QP of -12. + */ + AVRational qoffset; +} AVRegionOfInterest; + +/** + * 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. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * 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. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * 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 multiples 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. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * 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. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + +#if FF_API_PKT_PTS + /** + * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead + */ + attribute_deprecated + int64_t pkt_pts; +#endif + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * picture number in bitstream order + */ + int coded_picture_number; + /** + * picture number in display order + */ + int display_picture_number; + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + +#if FF_API_ERROR_FRAME + /** + * @deprecated unused + */ + attribute_deprecated + uint64_t error[AV_NUM_DATA_POINTERS]; +#endif + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + + /** + * reordered opaque 64 bits (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 + */ + int64_t reordered_opaque; + + /** + * Sample rate of the audio data. + */ + int sample_rate; + + /** + * Channel layout of the audio data. + */ + uint64_t channel_layout; + + /** + * AVBuffer references backing the data for this frame. If all elements of + * this array are NULL, then this frame is not reference counted. This array + * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must + * also be non-NULL for all j < i. + * + * 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. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * 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(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + + /** + * duration of the corresponding packet, expressed in + * AVStream->time_base units, 0 if unknown. + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_duration; + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * 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. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 +#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 +#define FF_DECODE_ERROR_DECODE_SLICES 8 + + /** + * number of audio channels, only used for audio. + * - encoding: unused + * - decoding: Read by user. + */ + int channels; + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + +#if FF_API_FRAME_QP + /** + * QP table + */ + attribute_deprecated + int8_t *qscale_table; + /** + * QP store stride + */ + attribute_deprecated + int qstride; + + attribute_deprecated + int qscale_type; + + attribute_deprecated + AVBufferRef *qp_table_buf; +#endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ + + /** + * AVBufferRef for internal use by a single libav* library. + * Must not be used to transfer data between libraries. + * Has to be NULL when ownership of the frame leaves the respective library. + * + * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. + * + * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. + * av_frame_copy_props() calls create a new reference with av_buffer_ref() + * for the target frame's private_ref field. + */ + AVBufferRef *private_ref; +} AVFrame; + +#if FF_API_FRAME_GET_SET +/** + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +attribute_deprecated +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_duration (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_channel_layout (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +attribute_deprecated +int av_frame_get_channels (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channels (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_sample_rate (const AVFrame *frame); +attribute_deprecated +void av_frame_set_sample_rate (AVFrame *frame, int val); +attribute_deprecated +AVDictionary *av_frame_get_metadata (const AVFrame *frame); +attribute_deprecated +void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +attribute_deprecated +int av_frame_get_decode_error_flags (const AVFrame *frame); +attribute_deprecated +void av_frame_set_decode_error_flags (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_pkt_size(const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_size(AVFrame *frame, int val); +#if FF_API_FRAME_QP +attribute_deprecated +int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +attribute_deprecated +int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); +#endif +attribute_deprecated +enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +attribute_deprecated +void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +attribute_deprecated +enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +attribute_deprecated +void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); +#endif + +/** + * 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); + +/** + * 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); + +/** + * Set up a new reference to the data described by the source 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. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @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); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +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. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @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 the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * 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); + +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type the type of the added side data + * @param buf an AVBufferRef to add as side data. The ownership of + * the reference is transferred to the frame. + * + * @return newly added side data on success, NULL on error. On failure + * the frame is unchanged and the AVBufferRef remains owned by + * the caller. + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + +/** + * @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); + +/** + * If side data of the supplied type exists in the frame, free it and remove it + * from the frame. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hash.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hash.h new file mode 100644 index 00000000..7693e6bf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hash.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + */ + +/** + * @file + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +#if FF_API_CRYPTO_SIZE_T +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); +#else +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hdr_dynamic_metadata.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hdr_dynamic_metadata.h new file mode 100644 index 00000000..2d72de56 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hdr_dynamic_metadata.h @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Mohammad Izadi + * + * 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 + */ + +#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H +#define AVUTIL_HDR_DYNAMIC_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Option for overlapping elliptical pixel selectors in an image. + */ +enum AVHDRPlusOverlapProcessOption { + AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, + AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, +}; + +/** + * Represents the percentile at a specific percentage in + * a distribution. + */ +typedef struct AVHDRPlusPercentile { + /** + * The percentage value corresponding to a specific percentile linearized + * RGB value in the processing window in the scene. The value shall be in + * the range of 0 to100, inclusive. + */ + uint8_t percentage; + + /** + * The linearized maxRGB value at a specific percentile in the processing + * window in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.00001. + */ + AVRational percentile; +} AVHDRPlusPercentile; + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * SMPTE 2094-40. + */ +typedef struct AVHDRPlusColorTransformParams { + /** + * The relative x coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_x; + + /** + * The relative y coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_y; + + /** + * The relative x coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_x; + + /** + * The relative y coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_y; + + /** + * The x coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (width of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_x; + + /** + * The y coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (height of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_y; + + /** + * The clockwise rotation angle in degree of arc with respect to the + * positive direction of the x-axis of the concentric internal and external + * ellipses of the elliptical pixel selector in the processing window. The + * value shall be in the range of 0 to 180, inclusive and in multiples of 1. + */ + uint8_t rotation_angle; + + /** + * The semi-major axis value of the internal ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_internal_ellipse; + + /** + * The semi-major axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value + * shall not be less than semimajor_axis_internal_ellipse of the current + * processing window. The value shall be in the range of 1 to 65535, + * inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_external_ellipse; + + /** + * The semi-minor axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semiminor_axis_external_ellipse; + + /** + * Overlap process option indicates one of the two methods of combining + * rendered pixels in the processing window in an image with at least one + * elliptical pixel selector. For overlapping elliptical pixel selectors + * in an image, overlap_process_option shall have the same value. + */ + enum AVHDRPlusOverlapProcessOption overlap_process_option; + + /** + * The maximum of the color components of linearized RGB values in the + * processing window in the scene. The values should be in the range of 0 to + * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and + * maxscl[ 2 ] are corresponding to R, G, B color components respectively. + */ + AVRational maxscl[3]; + + /** + * The average of linearized maxRGB values in the processing window in the + * scene. The value should be in the range of 0 to 1, inclusive and in + * multiples of 0.00001. + */ + AVRational average_maxrgb; + + /** + * The number of linearized maxRGB values at given percentiles in the + * processing window in the scene. The maximum value shall be 15. + */ + uint8_t num_distribution_maxrgb_percentiles; + + /** + * The linearized maxRGB values at given percentiles in the + * processing window in the scene. + */ + AVHDRPlusPercentile distribution_maxrgb[15]; + + /** + * The fraction of selected pixels in the image that contains the brightest + * pixel in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.001. + */ + AVRational fraction_bright_pixels; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + uint8_t tone_mapping_flag; + + /** + * The x coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_x; + + /** + * The y coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_y; + + /** + * The number of the intermediate anchor parameters of the tone mapping + * function in the processing window. The maximum value shall be 15. + */ + uint8_t num_bezier_curve_anchors; + + /** + * The intermediate anchor parameters of the tone mapping function in the + * processing window in the scene. The values should be in the range of 0 + * to 1, inclusive and in multiples of 1/1023. + */ + AVRational bezier_curve_anchors[15]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. Other values are reserved for future use. + */ + uint8_t color_saturation_mapping_flag; + + /** + * The color saturation gain in the processing window in the scene. The + * value shall be in the range of 0 to 63/8, inclusive and in multiples of + * 1/8. The default value shall be 1. + */ + AVRational color_saturation_weight; +} AVHDRPlusColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * application 4 of SMPTE 2094-40:2016 standard. + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_plus_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRPlus { + /** + * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. + */ + uint8_t itu_t_t35_country_code; + + /** + * Application version in the application defining document in ST-2094 + * suite. The value shall be set to 0. + */ + uint8_t application_version; + + /** + * The number of processing windows. The value shall be in the range + * of 1 to 3, inclusive. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRPlusColorTransformParams params[3]; + + /** + * The nominal maximum display luminance of the targeted system display, + * in units of 0.0001 candelas per square metre. The value shall be in + * the range of 0 to 10000, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag shall be equal to 0 in bit streams conforming to this version + * of this Specification. The value 1 is reserved for future use. + */ + uint8_t targeted_system_display_actual_peak_luminance_flag; + + /** + * The number of rows in the targeted system_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_targeted_system_display_actual_peak_luminance; + + /** + * The number of columns in the + * targeted_system_display_actual_peak_luminance array. The value shall be + * in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_targeted_system_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the targeted system display. The + * values should be in the range of 0 to 1, inclusive and in multiples of + * 1/15. + */ + AVRational targeted_system_display_actual_peak_luminance[25][25]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. The value 1 is reserved for future use. + */ + uint8_t mastering_display_actual_peak_luminance_flag; + + /** + * The number of rows in the mastering_display_actual_peak_luminance array. + * The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_mastering_display_actual_peak_luminance; + + /** + * The number of columns in the mastering_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_mastering_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the mastering display used for + * mastering the image essence. The values should be in the range of 0 to 1, + * inclusive and in multiples of 1/15. + */ + AVRational mastering_display_actual_peak_luminance[25][25]; +} AVDynamicHDRPlus; + +/** + * Allocate an AVDynamicHDRPlus structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRPlus filled with default values or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRPlus and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRPlus structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hmac.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hmac.h new file mode 100644 index 00000000..412e9507 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hmac.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 Martin Storsjo + * + * 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 + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +#include "version.h" +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext.h new file mode 100644 index 00000000..f5a4b623 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext.h @@ -0,0 +1,584 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, + AV_HWDEVICE_TYPE_OPENCL, + AV_HWDEVICE_TYPE_MEDIACODEC, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_cuda.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_cuda.h new file mode 100644 index 00000000..81a0552c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + CUstream stream; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_d3d11va.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_d3d11va.h new file mode 100644 index 00000000..9f91e9b1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_drm.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_drm.h new file mode 100644 index 00000000..42709f21 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_drm.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + * + * If the format modifier is unknown then this should be set to + * DRM_FORMAT_MOD_INVALID. + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_dxva2.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 00000000..e1b79bc0 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_mediacodec.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_mediacodec.h new file mode 100644 index 00000000..101a9806 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_mediacodec.h @@ -0,0 +1,36 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H +#define AVUTIL_HWCONTEXT_MEDIACODEC_H + +/** + * MediaCodec details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVMediaCodecDeviceContext { + /** + * android/view/Surface handle, to be filled by the user. + * + * This is the default surface used by decoders on this device. + */ + void *surface; +} AVMediaCodecDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_qsv.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_qsv.h new file mode 100644 index 00000000..b98d611c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vaapi.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 00000000..0b2e071c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vdpau.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 00000000..1b7ea1e4 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_videotoolbox.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 00000000..380918d9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/imgutils.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/imgutils.h new file mode 100644 index 00000000..5b790ecf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/imgutils.h @@ -0,0 +1,277 @@ +/* + * 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 + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include "avutil.h" +#include "pixdesc.h" +#include "rational.h" + +/** + * 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); + +/** + * 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); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t 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_linesize 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 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 assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +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_linesize 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); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @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_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/intfloat.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/intfloat.h new file mode 100644 index 00000000..fe3d7ec4 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/intreadwrite.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/intreadwrite.h new file mode 100644 index 00000000..4c8413a5 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/intreadwrite.h @@ -0,0 +1,644 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p)) +# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v)) +#else +# define AV_RLA(s, p) AV_RN##s##A(p) +# define AV_WLA(s, p, v) AV_WN##s##A(p, v) +#endif + +#ifndef AV_RL64A +# define AV_RL64A(p) AV_RLA(64, p) +#endif +#ifndef AV_WL64A +# define AV_WL64A(p, v) AV_WLA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/lfg.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/lfg.h new file mode 100644 index 00000000..03f779ad --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/lfg.h @@ -0,0 +1,71 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/log.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/log.h new file mode 100644 index 00000000..d9554e60 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/log.h @@ -0,0 +1,362 @@ +/* + * copyright (c) 2006 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" +#include "attributes.h" +#include "version.h" + +typedef enum { + 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_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +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.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * 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. + */ + int parent_log_context_offset; + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * 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); + + /** + * 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) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define 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. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define 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'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * 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 or NULL if general log. + * @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); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * 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)); + +/** + * 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 vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, 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); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted 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); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * 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 + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/lzo.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/lzo.h new file mode 100644 index 00000000..c0340399 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/macros.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/macros.h new file mode 100644 index 00000000..2007ee56 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/macros.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +/** + * @file + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/mastering_display_metadata.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/mastering_display_metadata.h new file mode 100644 index 00000000..c23b07c3 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016 Neil Birkbeck + * + * 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 + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/mathematics.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/mathematics.h new file mode 100644 index 00000000..54901800 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/mathematics.h @@ -0,0 +1,242 @@ +/* + * copyright (c) 2005-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 + */ + +/** + * @file + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + 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. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/md5.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/md5.h new file mode 100644 index 00000000..ca72ccbf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/md5.h @@ -0,0 +1,98 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/mem.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/mem.h new file mode 100644 index 00000000..5fb1a02d --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/mem.h @@ -0,0 +1,700 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "error.h" +#include "avutil.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. + * @{ + */ + +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_ALIGNED(n,t,v) + * Declare an aligned variable appropriate for use in inline assembly code. + * + * @code{.c} + * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __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_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_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block 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, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block 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, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; + +/** + * Allocate, reallocate, or free 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`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @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 Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking 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 + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free 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 in the array + * @param size Size of the single element of the array + * + * @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 Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free 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[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to the size of buffer `ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +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. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @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, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @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 + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @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); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `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); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to 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[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(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[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on 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: don't try the division if nelem and elsize + * are both less 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 be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/motion_vector.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/motion_vector.h new file mode 100644 index 00000000..ec295563 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * 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 + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/murmur3.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/murmur3.h new file mode 100644 index 00000000..1b09175c --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/murmur3.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + */ + +/** + * @file + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +#if FF_API_CRYPTO_SIZE_T +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); +#else +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/opt.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/opt.h new file mode 100644 index 00000000..39f4a8dd --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/opt.h @@ -0,0 +1,865 @@ +/* + * AVOptions + * copyright (c) 2005 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" +#include "version.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 { + * const 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_mallocz(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 makes it possible 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. + */ + +enum AVOptionType{ + 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_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST, + AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT, + AV_OPT_TYPE_SAMPLE_FMT, + AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational + AV_OPT_TYPE_DURATION, + AV_OPT_TYPE_COLOR, + AV_OPT_TYPE_CHANNEL_LAYOUT, + AV_OPT_TYPE_BOOL, +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering +#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +#define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information +//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. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * 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); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * 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_opt_set() 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 allocated objects 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); + + +/** + * 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(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @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_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * 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); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< 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 (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * 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_opt_set(). 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(const 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); +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); +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); +/** + * @note Any old dictionary present is discarded and replaced with a copy of the new one. The + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, 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 + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has + * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set + * to NULL instead of an allocated empty string. + */ +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); +/** + * @param[out] out_val The returned dictionary is a copy of the actual value and must + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * 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 + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. + * Original memory allocated for such options is freed unless both src and dest options points to the same memory. + * + * @param dest Object to copy from + * @param src Object to copy into + * @return 0 on success, negative on error + */ +int av_opt_copy(void *dest, const void *src); + +/** + * 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 + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_free_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Check if given option is set to its default value. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/parseutils.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/parseutils.h new file mode 100644 index 00000000..e66d24b7 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/parseutils.h @@ -0,0 +1,193 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @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); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * 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); + +/** + * 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); + +/** + * 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); + +/** + * Simplified version of strptime + * + * 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(). + * + * The supported input field descriptors are listed below. + * - %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' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/pixdesc.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/pixdesc.h new file mode 100644 index 00000000..c055810a --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/pixdesc.h @@ -0,0 +1,440 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" +#include "version.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; + +#if FF_API_PLUS1_MINUS1 + /** deprecated, use step instead */ + attribute_deprecated int step_minus1; + + /** deprecated, use depth instead */ + attribute_deprecated int depth_minus1; + + /** deprecated, use offset instead */ + attribute_deprecated int offset_plus1; +#endif +} AVComponentDescriptor; + +/** + * 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. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< 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 = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * 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. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format is "pseudo-paletted". This means that it contains a + * fixed palette in the 2nd plane but the palette is fixed/constant for each + * PIX_FMT. This allows interpreting the data as if it was PAL8, which can + * in some cases be simpler. Or the data can be interpreted purely based on + * the pixel format without using the palette. + * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + * + * @deprecated This flag is deprecated, and will be removed. When it is removed, + * the extra palette allocation in AVFrame.data[1] is removed as well. Only + * actual paletted formats (as indicated by AV_PIX_FMT_FLAG_PAL) will have a + * palette. Starting with FFmpeg versions which have this flag deprecated, the + * extra "pseudo" palette is already ignored, and API users are not required to + * allocate a palette for AV_PIX_FMT_FLAG_PSEUDOPAL formats (it was required + * before the deprecation, though). + */ +#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always + * straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * 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. + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @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); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * 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); + +/** + * 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); + +/** + * 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. + * @param dst_element_size size of elements in dst array (2 or 4 byte) + */ +void av_read_image_line2(void *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, + int dst_element_size); + +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 + * @param src_element_size size of elements in src array (2 or 4 byte) + */ +void av_write_image_line2(const void *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int src_element_size); + +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); + +/** + * 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); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< 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. + * av_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 av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * 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. + * av_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). + */ +enum AVPixelFormat av_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); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/pixelutils.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/pixelutils.h new file mode 100644 index 00000000..a8dbc157 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/pixelutils.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include +#include "common.h" + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define 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. + * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * + * @par + * When the pixel format is palettized RGB32 (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 RGB32 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 8 bits 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. + */ +enum AVPixelFormat { + 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 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range + 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 AV_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) + 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)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + 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)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + +#if FF_API_VAAPI + /** @name Deprecated pixel formats */ + /**@{*/ + 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 VASurfaceID + /**@}*/ + AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, +#else + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, +#endif + + 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 + 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)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + 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_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + 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 + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< 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 + + 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 + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (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 + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + */ + AV_PIX_FMT_QSV, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB, ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + 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_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_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_XVMC,///< XVideo Motion Acceleration via common packet passing + + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + /** + * Hardware surfaces for OpenCL. + * + * data[i] contain 2D image objects (typed in C as cl_mem, used + * in OpenCL as image2d_t) for each plane of the surface. + */ + AV_PIX_FMT_OPENCL, + + AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian + AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian + + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + + AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian + AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian + + AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 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_NV42, ///< as above, but U and V bytes are swapped + + 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 +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE) +#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + 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, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + 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_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + 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 + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above + AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + 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_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * MPEG vs JPEG YUV range. + */ +enum AVColorRange { + 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 +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/random_seed.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/random_seed.h new file mode 100644 index 00000000..0462a048 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/rational.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/rational.h new file mode 100644 index 00000000..5c6b67b4 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/rational.h @@ -0,0 +1,214 @@ +/* + * rational numbers + * Copyright (c) 2003 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 + */ + +/** + * @file + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>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 an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is 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. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/rc4.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/rc4.h new file mode 100644 index 00000000..029cd2ad --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/rc4.h @@ -0,0 +1,66 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * 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 + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/replaygain.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/replaygain.h new file mode 100644 index 00000000..b49bf1a3 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/ripemd.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/ripemd.h new file mode 100644 index 00000000..0db6858f --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/ripemd.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + */ + +/** + * @file + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); +#else +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/samplefmt.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/samplefmt.h new file mode 100644 index 00000000..8cd43ae8 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/samplefmt.h @@ -0,0 +1,272 @@ +/* + * 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 + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +#include "avutil.h" +#include "attributes.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - 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. + * + * - 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. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * 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. + * + */ +enum AVSampleFormat { + 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_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, 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); + +/** + * 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); + +/** + * 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); + +/** + * 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); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * 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); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/sha.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/sha.h new file mode 100644 index 00000000..c0180e57 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/sha.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 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 + */ + +/** + * @file + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/sha512.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/sha512.h new file mode 100644 index 00000000..bef714b4 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/sha512.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + */ + +/** + * @file + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/spherical.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/spherical.h new file mode 100644 index 00000000..cef759cf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * 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 + */ + +/** + * @file + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/stereo3d.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/stereo3d.h new file mode 100644 index 00000000..d421aac2 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/stereo3d.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * 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 + */ + +/** + * @file + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + +/** + * List of possible view types. + */ +enum AVStereo3DView { + /** + * Frame contains two packed views. + */ + AV_STEREO3D_VIEW_PACKED, + + /** + * Frame contains only the left view. + */ + AV_STEREO3D_VIEW_LEFT, + + /** + * Frame contains only the right view. + */ + AV_STEREO3D_VIEW_RIGHT, +}; + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; + + /** + * Determines which views are packed. + */ + enum AVStereo3DView view; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/tea.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/tea.h new file mode 100644 index 00000000..dd929bda --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * 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 + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/threadmessage.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/threadmessage.h new file mode 100644 index 00000000..42ce655f --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/threadmessage.h @@ -0,0 +1,115 @@ +/* + * 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 + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/time.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/time.h new file mode 100644 index 00000000..dc169b06 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * 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. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/timecode.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/timecode.h new file mode 100644 index 00000000..37c1361b --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/timecode.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * 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 + */ + +/** + * @file + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, 30 or 60 + * @return adjusted frame number + * @warning adjustment is only valid in NTSC 29.97 and 59.94 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity + * correction (PC) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/timestamp.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/timestamp.h new file mode 100644 index 00000000..e082f01b --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * 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 + */ + +/** + * @file + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/tree.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/tree.h new file mode 100644 index 00000000..d5e0aebf --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/tree.h @@ -0,0 +1,138 @@ +/* + * copyright (c) 2006 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 + */ + +/** + * @file + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/twofish.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/twofish.h new file mode 100644 index 00000000..813cfecd --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/tx.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/tx.h new file mode 100644 index 00000000..d6cdfdf9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/tx.h @@ -0,0 +1,93 @@ +/* + * 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 + */ + +#ifndef AVUTIL_TX_H +#define AVUTIL_TX_H + +#include +#include + +typedef struct AVTXContext AVTXContext; + +typedef struct AVComplexFloat { + float re, im; +} AVComplexFloat; + +typedef struct AVComplexDouble { + double re, im; +} AVComplexDouble; + +enum AVTXType { + /** + * Standard complex to complex FFT with sample data type AVComplexFloat. + * Scaling currently unsupported + */ + AV_TX_FLOAT_FFT = 0, + /** + * Standard MDCT with sample data type of float and a scale type of + * float. Length is the frame size, not the window size (which is 2x frame) + */ + AV_TX_FLOAT_MDCT = 1, + /** + * Same as AV_TX_FLOAT_FFT with a data type of AVComplexDouble. + */ + AV_TX_DOUBLE_FFT = 2, + /** + * Same as AV_TX_FLOAT_MDCT with data and scale type of double. + */ + AV_TX_DOUBLE_MDCT = 3, +}; + +/** + * Function pointer to a function to perform the transform. + * + * @note Using a different context than the one allocated during av_tx_init() + * is not allowed. + * + * @param s the transform context + * @param out the output array + * @param in the input array + * @param stride the input or output stride (depending on transform direction) + * in bytes, currently implemented for all MDCT transforms + */ +typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); + +/** + * Initialize a transform context with the given configuration + * Currently power of two lengths from 4 to 131072 are supported, along with + * any length decomposable to a power of two and either 3, 5 or 15. + * + * @param ctx the context to allocate, will be NULL on error + * @param tx pointer to the transform function pointer to set + * @param type type the type of transform + * @param inv whether to do an inverse or a forward transform + * @param len the size of the transform in samples + * @param scale pointer to the value to scale the output if supported by type + * @param flags currently unused + * + * @return 0 on success, negative error code on failure + */ +int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, + int inv, int len, const void *scale, uint64_t flags); + +/** + * Frees a context and sets ctx to NULL, does nothing when ctx == NULL + */ +void av_tx_uninit(AVTXContext **ctx); + +#endif /* AVUTIL_TX_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/version.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/version.h new file mode 100644 index 00000000..ecc6a7c9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/version.h @@ -0,0 +1,139 @@ +/* + * copyright (c) 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + +#define LIBAVUTIL_VERSION_MAJOR 56 +#define LIBAVUTIL_VERSION_MINOR 33 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#ifndef FF_API_VAAPI +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_QP +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PLUS1_MINUS1 +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_ERROR_FRAME +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_GET_SET +#define FF_API_FRAME_GET_SET (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PSEUDOPAL +#define FF_API_PSEUDOPAL (LIBAVUTIL_VERSION_MAJOR < 57) +#endif + + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libavutil/xtea.h b/Kyoo.Transcoder/ffmpeg/include/libavutil/xtea.h new file mode 100644 index 00000000..735427c1 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libpostproc/postprocess.h b/Kyoo.Transcoder/ffmpeg/include/libpostproc/postprocess.h new file mode 100644 index 00000000..348ee7cc --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libpostproc/postprocess.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version.h" + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#include + +typedef void pp_context; +typedef void pp_mode; + +#if LIBPOSTPROC_VERSION_INT < (52<<16) +typedef pp_context pp_context_t; +typedef pp_mode pp_mode_t; +extern const char *const pp_help; ///< a simple help text +#else +extern const char pp_help[]; ///< a simple help text +#endif + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libpostproc/version.h b/Kyoo.Transcoder/ffmpeg/include/libpostproc/version.h new file mode 100644 index 00000000..08e2a315 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libpostproc/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/avutil.h" + +#define LIBPOSTPROC_VERSION_MAJOR 55 +#define LIBPOSTPROC_VERSION_MINOR 6 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#endif /* POSTPROC_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libswresample/swresample.h b/Kyoo.Transcoder/ffmpeg/include/libswresample/swresample.h new file mode 100644 index 00000000..c7b84fbc --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libswresample/swresample.h @@ -0,0 +1,579 @@ +/* + * 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 + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * 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. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * 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). This is using the swr_alloc() function. + * @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 + * + * The same job can be done using swr_alloc_set_opts() as well: + * @code + * SwrContext *swr = swr_alloc_set_opts(NULL, // we're allocating a new context + * AV_CH_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * AV_CH_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @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 + * using @ref AVOptions, as described above in the first example; or by using + * swr_alloc_set_opts(), but with the first argument the allocated context. + * You must 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 samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * 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(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version.h" + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +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 */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * 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. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(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 existing Swr context if available, or NULL if not + * @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); + +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** 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 using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion 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); + +/** + * 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. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param s[in] initialized Swr context + * @param pts[in] timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + +/** + * 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 >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +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: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libswresample/version.h b/Kyoo.Transcoder/ffmpeg/include/libswresample/version.h new file mode 100644 index 00000000..c0794341 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libswresample/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/avutil.h" + +#define LIBSWRESAMPLE_VERSION_MAJOR 3 +#define LIBSWRESAMPLE_VERSION_MINOR 6 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libswscale/swscale.h b/Kyoo.Transcoder/ffmpeg/include/libswscale/swscale.h new file mode 100644 index 00000000..7713f51e --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libswscale/swscale.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2001-2011 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version.h" + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * 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); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * 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); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * 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 + */ +av_warn_unused_result +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); + +/** + * 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 + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @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 + */ +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); + +/** + * 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[]); + +/** + * @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); + +/** + * 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); + +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif + +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); + +/** + * 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); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/Kyoo.Transcoder/ffmpeg/include/libswscale/version.h b/Kyoo.Transcoder/ffmpeg/include/libswscale/version.h new file mode 100644 index 00000000..cc434c04 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/include/libswscale/version.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#define LIBSWSCALE_VERSION_MAJOR 5 +#define LIBSWSCALE_VERSION_MINOR 6 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + +#endif /* SWSCALE_VERSION_H */ diff --git a/Kyoo.Transcoder/ffmpeg/lib/avcodec-58.def b/Kyoo.Transcoder/ffmpeg/lib/avcodec-58.def new file mode 100644 index 00000000..afc6144a --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/avcodec-58.def @@ -0,0 +1,238 @@ +EXPORTS + av_ac3_parse_header + av_adts_header_parse + av_bitstream_filter_close + av_bitstream_filter_filter + av_bitstream_filter_init + av_bitstream_filter_next + av_bsf_alloc + av_bsf_flush + av_bsf_free + av_bsf_get_by_name + av_bsf_get_class + av_bsf_get_null_filter + av_bsf_init + av_bsf_iterate + av_bsf_list_alloc + av_bsf_list_append + av_bsf_list_append2 + av_bsf_list_finalize + av_bsf_list_free + av_bsf_list_parse_str + av_bsf_next + av_bsf_receive_packet + av_bsf_send_packet + av_codec_ffversion + av_codec_get_chroma_intra_matrix + av_codec_get_codec_descriptor + av_codec_get_codec_properties + av_codec_get_lowres + av_codec_get_max_lowres + av_codec_get_pkt_timebase + av_codec_get_seek_preroll + av_codec_is_decoder + av_codec_is_encoder + av_codec_iterate + av_codec_next + av_codec_set_chroma_intra_matrix + av_codec_set_codec_descriptor + av_codec_set_lowres + av_codec_set_pkt_timebase + av_codec_set_seek_preroll + av_copy_packet + av_copy_packet_side_data + av_cpb_properties_alloc + av_d3d11va_alloc_context + av_dct_calc + av_dct_end + av_dct_init + av_dirac_parse_sequence_header + av_dup_packet + av_dv_codec_profile + av_dv_codec_profile2 + av_dv_frame_profile + av_fast_padded_malloc + av_fast_padded_mallocz + av_fft_calc + av_fft_end + av_fft_init + av_fft_permute + av_free_packet + av_get_audio_frame_duration + av_get_audio_frame_duration2 + av_get_bits_per_sample + av_get_codec_tag_string + av_get_exact_bits_per_sample + av_get_pcm_codec + av_get_profile_name + av_grow_packet + av_hwaccel_next + av_imdct_calc + av_imdct_half + av_init_packet + av_jni_get_java_vm + av_jni_set_java_vm + av_lockmgr_register + av_mdct_calc + av_mdct_end + av_mdct_init + av_mediacodec_alloc_context + av_mediacodec_default_free + av_mediacodec_default_init + av_mediacodec_release_buffer + av_mediacodec_render_buffer_at_time + av_new_packet + av_packet_add_side_data + av_packet_alloc + av_packet_clone + av_packet_copy_props + av_packet_free + av_packet_free_side_data + av_packet_from_data + av_packet_get_side_data + av_packet_make_refcounted + av_packet_make_writable + av_packet_merge_side_data + av_packet_move_ref + av_packet_new_side_data + av_packet_pack_dictionary + av_packet_ref + av_packet_rescale_ts + av_packet_shrink_side_data + av_packet_side_data_name + av_packet_split_side_data + av_packet_unpack_dictionary + av_packet_unref + av_parser_change + av_parser_close + av_parser_init + av_parser_iterate + av_parser_next + av_parser_parse2 + av_picture_copy + av_picture_crop + av_picture_pad + av_qsv_alloc_context + av_rdft_calc + av_rdft_end + av_rdft_init + av_register_bitstream_filter + av_register_codec_parser + av_register_hwaccel + av_shrink_packet + av_vorbis_parse_frame + av_vorbis_parse_frame_flags + av_vorbis_parse_free + av_vorbis_parse_init + av_vorbis_parse_reset + av_xiphlacing + avcodec_align_dimensions + avcodec_align_dimensions2 + avcodec_alloc_context3 + avcodec_chroma_pos_to_enum + avcodec_close + avcodec_configuration + avcodec_copy_context + avcodec_dct_alloc + avcodec_dct_get_class + avcodec_dct_init + avcodec_decode_audio4 + avcodec_decode_subtitle2 + avcodec_decode_video2 + avcodec_default_execute + avcodec_default_execute2 + avcodec_default_get_buffer2 + avcodec_default_get_format + avcodec_descriptor_get + avcodec_descriptor_get_by_name + avcodec_descriptor_next + avcodec_encode_audio2 + avcodec_encode_subtitle + avcodec_encode_video2 + avcodec_enum_to_chroma_pos + avcodec_fill_audio_frame + avcodec_find_best_pix_fmt2 + avcodec_find_best_pix_fmt_of_2 + avcodec_find_best_pix_fmt_of_list + avcodec_find_decoder + avcodec_find_decoder_by_name + avcodec_find_encoder + avcodec_find_encoder_by_name + avcodec_flush_buffers + avcodec_free_context + avcodec_get_chroma_sub_sample + avcodec_get_class + avcodec_get_context_defaults3 + avcodec_get_frame_class + avcodec_get_hw_config + avcodec_get_hw_frames_parameters + avcodec_get_name + avcodec_get_pix_fmt_loss + avcodec_get_subtitle_rect_class + avcodec_get_type + avcodec_is_open + avcodec_license + avcodec_open2 + avcodec_parameters_alloc + avcodec_parameters_copy + avcodec_parameters_free + avcodec_parameters_from_context + avcodec_parameters_to_context + avcodec_pix_fmt_to_codec_tag + avcodec_profile_name + avcodec_receive_frame + avcodec_receive_packet + avcodec_register + avcodec_register_all + avcodec_send_frame + avcodec_send_packet + avcodec_string + avcodec_version + avpicture_alloc + avpicture_fill + avpicture_free + avpicture_get_size + avpicture_layout + avpriv_ac3_channel_layout_tab + avpriv_ac3_parse_header + avpriv_align_put_bits + avpriv_bprint_to_extradata + avpriv_codec2_mode_bit_rate + avpriv_codec2_mode_block_align + avpriv_codec2_mode_frame_size + avpriv_codec_get_cap_skip_frame_fill_param + avpriv_copy_bits + avpriv_dca_convert_bitstream + avpriv_dca_parse_core_frame_header + avpriv_dca_sample_rates + avpriv_dnxhd_get_frame_size + avpriv_dnxhd_get_hr_frame_size + avpriv_dnxhd_get_interlaced + avpriv_do_elbg + avpriv_exif_decode_ifd + avpriv_find_pix_fmt + avpriv_find_start_code + avpriv_fits_header_init + avpriv_fits_header_parse_line + avpriv_get_raw_pix_fmt_tags + avpriv_h264_has_num_reorder_frames + avpriv_init_elbg + avpriv_mjpeg_bits_ac_chrominance + avpriv_mjpeg_bits_ac_luminance + avpriv_mjpeg_bits_dc_chrominance + avpriv_mjpeg_bits_dc_luminance + avpriv_mjpeg_val_ac_chrominance + avpriv_mjpeg_val_ac_luminance + avpriv_mjpeg_val_dc + avpriv_mpa_bitrate_tab + avpriv_mpa_freq_tab + avpriv_mpeg4audio_get_config + avpriv_mpeg4audio_sample_rates + avpriv_mpegaudio_decode_header + avpriv_pix_fmt_bps_avi + avpriv_pix_fmt_bps_mov + avpriv_put_string + avpriv_split_xiph_headers + avpriv_tak_parse_streaminfo + avpriv_toupper4 + avsubtitle_free diff --git a/Kyoo.Transcoder/ffmpeg/lib/avcodec.lib b/Kyoo.Transcoder/ffmpeg/lib/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..7d5e852b3641562789955b23f1ff051d37aefd43 GIT binary patch literal 185506 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 TdW;cA6X$NJHOO8{Bgg+AE+uY1 literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/avdevice-58.def b/Kyoo.Transcoder/ffmpeg/lib/avdevice-58.def new file mode 100644 index 00000000..01682fc5 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/avdevice-58.def @@ -0,0 +1,19 @@ +EXPORTS + av_device_capabilities + av_device_ffversion + av_input_audio_device_next + av_input_video_device_next + av_output_audio_device_next + av_output_video_device_next + avdevice_app_to_dev_control_message + avdevice_capabilities_create + avdevice_capabilities_free + avdevice_configuration + avdevice_dev_to_app_control_message + avdevice_free_list_devices + avdevice_license + avdevice_list_devices + avdevice_list_input_sources + avdevice_list_output_sinks + avdevice_register_all + avdevice_version diff --git a/Kyoo.Transcoder/ffmpeg/lib/avdevice.lib b/Kyoo.Transcoder/ffmpeg/lib/avdevice.lib new file mode 100644 index 0000000000000000000000000000000000000000..238d5285d2c23103fa46e06e924db5171e216a7a GIT binary patch literal 15874 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 literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/avformat-58.def b/Kyoo.Transcoder/ffmpeg/lib/avformat-58.def new file mode 100644 index 00000000..0c89fc71 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/avformat-58.def @@ -0,0 +1,176 @@ +EXPORTS + av_add_index_entry + av_append_packet + av_apply_bitstream_filters + av_codec_get_id + av_codec_get_tag + av_codec_get_tag2 + av_demuxer_iterate + av_demuxer_open + av_dump_format + av_filename_number_test + av_find_best_stream + av_find_default_stream_index + av_find_input_format + av_find_program_from_stream + av_fmt_ctx_get_duration_estimation_method + av_format_ffversion + av_format_get_audio_codec + av_format_get_control_message_cb + av_format_get_data_codec + av_format_get_metadata_header_padding + av_format_get_opaque + av_format_get_open_cb + av_format_get_probe_score + av_format_get_subtitle_codec + av_format_get_video_codec + av_format_inject_global_side_data + av_format_set_audio_codec + av_format_set_control_message_cb + av_format_set_data_codec + av_format_set_metadata_header_padding + av_format_set_opaque + av_format_set_open_cb + av_format_set_subtitle_codec + av_format_set_video_codec + av_get_frame_filename + av_get_frame_filename2 + av_get_output_timestamp + av_get_packet + av_guess_codec + av_guess_format + av_guess_frame_rate + av_guess_sample_aspect_ratio + av_hex_dump + av_hex_dump_log + av_iformat_next + av_index_search_timestamp + av_interleaved_write_frame + av_interleaved_write_uncoded_frame + av_match_ext + av_muxer_iterate + av_new_program + av_oformat_next + av_pkt_dump2 + av_pkt_dump_log2 + av_probe_input_buffer + av_probe_input_buffer2 + av_probe_input_format + av_probe_input_format2 + av_probe_input_format3 + av_program_add_stream_index + av_read_frame + av_read_pause + av_read_play + av_register_all + av_register_input_format + av_register_output_format + av_sdp_create + av_seek_frame + av_stream_add_side_data + av_stream_get_codec_timebase + av_stream_get_end_pts + av_stream_get_parser + av_stream_get_r_frame_rate + av_stream_get_recommended_encoder_configuration + av_stream_get_side_data + av_stream_new_side_data + av_stream_set_r_frame_rate + av_stream_set_recommended_encoder_configuration + av_url_split + av_write_frame + av_write_trailer + av_write_uncoded_frame + av_write_uncoded_frame_query + avformat_alloc_context + avformat_alloc_output_context2 + avformat_close_input + avformat_configuration + avformat_find_stream_info + avformat_flush + avformat_free_context + avformat_get_class + avformat_get_mov_audio_tags + avformat_get_mov_video_tags + avformat_get_riff_audio_tags + avformat_get_riff_video_tags + avformat_init_output + avformat_license + avformat_match_stream_specifier + avformat_network_deinit + avformat_network_init + avformat_new_stream + avformat_open_input + avformat_query_codec + avformat_queue_attached_pictures + avformat_seek_file + avformat_transfer_internal_stream_timing_info + avformat_version + avformat_write_header + avio_accept + avio_alloc_context + avio_check + avio_close + avio_close_dir + avio_close_dyn_buf + avio_closep + avio_context_free + avio_enum_protocols + avio_feof + avio_find_protocol_name + avio_flush + avio_free_directory_entry + avio_get_dyn_buf + avio_get_str + avio_get_str16be + avio_get_str16le + avio_handshake + avio_open + avio_open2 + avio_open_dir + avio_open_dyn_buf + avio_pause + avio_print_string_array + avio_printf + avio_put_str + avio_put_str16be + avio_put_str16le + avio_r8 + avio_rb16 + avio_rb24 + avio_rb32 + avio_rb64 + avio_read + avio_read_dir + avio_read_partial + avio_read_to_bprint + avio_rl16 + avio_rl24 + avio_rl32 + avio_rl64 + avio_seek + avio_seek_time + avio_size + avio_skip + avio_w8 + avio_wb16 + avio_wb24 + avio_wb32 + avio_wb64 + avio_wl16 + avio_wl24 + avio_wl32 + avio_wl64 + avio_write + avio_write_marker + avpriv_dv_get_packet + avpriv_dv_init_demux + avpriv_dv_produce_packet + avpriv_io_delete + avpriv_io_move + avpriv_mpegts_parse_close + avpriv_mpegts_parse_open + avpriv_mpegts_parse_packet + avpriv_new_chapter + avpriv_register_devices + avpriv_set_pts_info diff --git a/Kyoo.Transcoder/ffmpeg/lib/avformat.lib b/Kyoo.Transcoder/ffmpeg/lib/avformat.lib new file mode 100644 index 0000000000000000000000000000000000000000..bf37f4501319fbb4af5954114ae97d9541e947fd GIT binary patch literal 135770 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 K>?X|N`2Pb9#UR)K literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/avutil-56.def b/Kyoo.Transcoder/ffmpeg/lib/avutil-56.def new file mode 100644 index 00000000..84ea685e --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/avutil-56.def @@ -0,0 +1,536 @@ +EXPORTS + av_add_i + av_add_q + av_add_stable + av_adler32_update + av_aes_alloc + av_aes_crypt + av_aes_ctr_alloc + av_aes_ctr_crypt + av_aes_ctr_free + av_aes_ctr_get_iv + av_aes_ctr_increment_iv + av_aes_ctr_init + av_aes_ctr_set_full_iv + av_aes_ctr_set_iv + av_aes_ctr_set_random_iv + av_aes_init + av_aes_size + av_append_path_component + av_asprintf + av_assert0_fpu + av_audio_fifo_alloc + av_audio_fifo_drain + av_audio_fifo_free + av_audio_fifo_peek + av_audio_fifo_peek_at + av_audio_fifo_read + av_audio_fifo_realloc + av_audio_fifo_reset + av_audio_fifo_size + av_audio_fifo_space + av_audio_fifo_write + av_base64_decode + av_base64_encode + av_basename + av_blowfish_alloc + av_blowfish_crypt + av_blowfish_crypt_ecb + av_blowfish_init + av_bmg_get + av_bprint_append_data + av_bprint_channel_layout + av_bprint_chars + av_bprint_clear + av_bprint_escape + av_bprint_finalize + av_bprint_get_buffer + av_bprint_init + av_bprint_init_for_buffer + av_bprint_strftime + av_bprintf + av_buffer_alloc + av_buffer_allocz + av_buffer_create + av_buffer_default_free + av_buffer_get_opaque + av_buffer_get_ref_count + av_buffer_is_writable + av_buffer_make_writable + av_buffer_pool_get + av_buffer_pool_init + av_buffer_pool_init2 + av_buffer_pool_uninit + av_buffer_realloc + av_buffer_ref + av_buffer_unref + av_calloc + av_camellia_alloc + av_camellia_crypt + av_camellia_init + av_camellia_size + av_cast5_alloc + av_cast5_crypt + av_cast5_crypt2 + av_cast5_init + av_cast5_size + av_channel_layout_extract_channel + av_chroma_location_from_name + av_chroma_location_name + av_cmp_i + av_color_primaries_from_name + av_color_primaries_name + av_color_range_from_name + av_color_range_name + av_color_space_from_name + av_color_space_name + av_color_transfer_from_name + av_color_transfer_name + av_compare_mod + av_compare_ts + av_content_light_metadata_alloc + av_content_light_metadata_create_side_data + av_cpu_count + av_cpu_max_align + av_crc + av_crc_get_table + av_crc_init + av_d2q + av_d2str + av_default_get_category + av_default_item_name + av_des_alloc + av_des_crypt + av_des_init + av_des_mac + av_dict_copy + av_dict_count + av_dict_free + av_dict_get + av_dict_get_string + av_dict_parse_string + av_dict_set + av_dict_set_int + av_dirname + av_display_matrix_flip + av_display_rotation_get + av_display_rotation_set + av_div_i + av_div_q + av_downmix_info_update_side_data + av_dynamic_hdr_plus_alloc + av_dynamic_hdr_plus_create_side_data + av_dynarray2_add + av_dynarray_add + av_dynarray_add_nofree + av_encryption_info_add_side_data + av_encryption_info_alloc + av_encryption_info_clone + av_encryption_info_free + av_encryption_info_get_side_data + av_encryption_init_info_add_side_data + av_encryption_init_info_alloc + av_encryption_init_info_free + av_encryption_init_info_get_side_data + av_escape + av_expr_eval + av_expr_free + av_expr_parse + av_expr_parse_and_eval + av_fast_malloc + av_fast_mallocz + av_fast_realloc + av_fifo_alloc + av_fifo_alloc_array + av_fifo_drain + av_fifo_free + av_fifo_freep + av_fifo_generic_peek + av_fifo_generic_peek_at + av_fifo_generic_read + av_fifo_generic_write + av_fifo_grow + av_fifo_realloc2 + av_fifo_reset + av_fifo_size + av_fifo_space + av_file_map + av_file_unmap + av_find_best_pix_fmt_of_2 + av_find_info_tag + av_find_nearest_q_idx + av_fopen_utf8 + av_force_cpu_flags + av_fourcc_make_string + av_frame_alloc + av_frame_apply_cropping + av_frame_clone + av_frame_copy + av_frame_copy_props + av_frame_free + av_frame_get_best_effort_timestamp + av_frame_get_buffer + av_frame_get_channel_layout + av_frame_get_channels + av_frame_get_color_range + av_frame_get_colorspace + av_frame_get_decode_error_flags + av_frame_get_metadata + av_frame_get_pkt_duration + av_frame_get_pkt_pos + av_frame_get_pkt_size + av_frame_get_plane_buffer + av_frame_get_qp_table + av_frame_get_sample_rate + av_frame_get_side_data + av_frame_is_writable + av_frame_make_writable + av_frame_move_ref + av_frame_new_side_data + av_frame_new_side_data_from_buf + av_frame_ref + av_frame_remove_side_data + av_frame_set_best_effort_timestamp + av_frame_set_channel_layout + av_frame_set_channels + av_frame_set_color_range + av_frame_set_colorspace + av_frame_set_decode_error_flags + av_frame_set_metadata + av_frame_set_pkt_duration + av_frame_set_pkt_pos + av_frame_set_pkt_size + av_frame_set_qp_table + av_frame_set_sample_rate + av_frame_side_data_name + av_frame_unref + av_free + av_freep + av_gcd + av_get_alt_sample_fmt + av_get_bits_per_pixel + av_get_bytes_per_sample + av_get_channel_description + av_get_channel_layout + av_get_channel_layout_channel_index + av_get_channel_layout_nb_channels + av_get_channel_layout_string + av_get_channel_name + av_get_colorspace_name + av_get_cpu_flags + av_get_default_channel_layout + av_get_extended_channel_layout + av_get_known_color_name + av_get_media_type_string + av_get_packed_sample_fmt + av_get_padded_bits_per_pixel + av_get_picture_type_char + av_get_pix_fmt + av_get_pix_fmt_loss + av_get_pix_fmt_name + av_get_pix_fmt_string + av_get_planar_sample_fmt + av_get_random_seed + av_get_sample_fmt + av_get_sample_fmt_name + av_get_sample_fmt_string + av_get_standard_channel_layout + av_get_time_base_q + av_get_token + av_gettime + av_gettime_relative + av_gettime_relative_is_monotonic + av_hash_alloc + av_hash_final + av_hash_final_b64 + av_hash_final_bin + av_hash_final_hex + av_hash_freep + av_hash_get_name + av_hash_get_size + av_hash_init + av_hash_names + av_hash_update + av_hmac_alloc + av_hmac_calc + av_hmac_final + av_hmac_free + av_hmac_init + av_hmac_update + av_hwdevice_ctx_alloc + av_hwdevice_ctx_create + av_hwdevice_ctx_create_derived + av_hwdevice_ctx_init + av_hwdevice_find_type_by_name + av_hwdevice_get_hwframe_constraints + av_hwdevice_get_type_name + av_hwdevice_hwconfig_alloc + av_hwdevice_iterate_types + av_hwframe_constraints_free + av_hwframe_ctx_alloc + av_hwframe_ctx_create_derived + av_hwframe_ctx_init + av_hwframe_get_buffer + av_hwframe_map + av_hwframe_transfer_data + av_hwframe_transfer_get_formats + av_i2int + av_image_alloc + av_image_check_sar + av_image_check_size + av_image_check_size2 + av_image_copy + av_image_copy_plane + av_image_copy_to_buffer + av_image_copy_uc_from + av_image_fill_arrays + av_image_fill_black + av_image_fill_linesizes + av_image_fill_max_pixsteps + av_image_fill_pointers + av_image_get_buffer_size + av_image_get_linesize + av_int2i + av_int_list_length_for_size + av_lfg_init + av_lfg_init_from_data + av_log + av_log2 + av_log2_16bit + av_log2_i + av_log_default_callback + av_log_format_line + av_log_format_line2 + av_log_get_flags + av_log_get_level + av_log_set_callback + av_log_set_flags + av_log_set_level + av_lzo1x_decode + av_malloc + av_malloc_array + av_mallocz + av_mallocz_array + av_mastering_display_metadata_alloc + av_mastering_display_metadata_create_side_data + av_match_list + av_match_name + av_max_alloc + av_md5_alloc + av_md5_final + av_md5_init + av_md5_size + av_md5_sum + av_md5_update + av_memcpy_backptr + av_memdup + av_mod_i + av_mul_i + av_mul_q + av_murmur3_alloc + av_murmur3_final + av_murmur3_init + av_murmur3_init_seeded + av_murmur3_update + av_nearer_q + av_opt_child_class_next + av_opt_child_next + av_opt_copy + av_opt_eval_double + av_opt_eval_flags + av_opt_eval_float + av_opt_eval_int + av_opt_eval_int64 + av_opt_eval_q + av_opt_find + av_opt_find2 + av_opt_flag_is_set + av_opt_free + av_opt_freep_ranges + av_opt_get + av_opt_get_channel_layout + av_opt_get_dict_val + av_opt_get_double + av_opt_get_image_size + av_opt_get_int + av_opt_get_key_value + av_opt_get_pixel_fmt + av_opt_get_q + av_opt_get_sample_fmt + av_opt_get_video_rate + av_opt_is_set_to_default + av_opt_is_set_to_default_by_name + av_opt_next + av_opt_ptr + av_opt_query_ranges + av_opt_query_ranges_default + av_opt_serialize + av_opt_set + av_opt_set_bin + av_opt_set_channel_layout + av_opt_set_defaults + av_opt_set_defaults2 + av_opt_set_dict + av_opt_set_dict2 + av_opt_set_dict_val + av_opt_set_double + av_opt_set_from_string + av_opt_set_image_size + av_opt_set_int + av_opt_set_pixel_fmt + av_opt_set_q + av_opt_set_sample_fmt + av_opt_set_video_rate + av_opt_show2 + av_parse_color + av_parse_cpu_caps + av_parse_cpu_flags + av_parse_ratio + av_parse_time + av_parse_video_rate + av_parse_video_size + av_pix_fmt_count_planes + av_pix_fmt_desc_get + av_pix_fmt_desc_get_id + av_pix_fmt_desc_next + av_pix_fmt_get_chroma_sub_sample + av_pix_fmt_swap_endianness + av_pixelutils_get_sad_fn + av_q2intfloat + av_rc4_alloc + av_rc4_crypt + av_rc4_init + av_read_image_line + av_read_image_line2 + av_realloc + av_realloc_array + av_realloc_f + av_reallocp + av_reallocp_array + av_reduce + av_rescale + av_rescale_delta + av_rescale_q + av_rescale_q_rnd + av_rescale_rnd + av_ripemd_alloc + av_ripemd_final + av_ripemd_init + av_ripemd_size + av_ripemd_update + av_sample_fmt_is_planar + av_samples_alloc + av_samples_alloc_array_and_samples + av_samples_copy + av_samples_fill_arrays + av_samples_get_buffer_size + av_samples_set_silence + av_set_cpu_flags_mask + av_set_options_string + av_sha512_alloc + av_sha512_final + av_sha512_init + av_sha512_size + av_sha512_update + av_sha_alloc + av_sha_final + av_sha_init + av_sha_size + av_sha_update + av_shr_i + av_small_strptime + av_spherical_alloc + av_spherical_from_name + av_spherical_projection_name + av_spherical_tile_bounds + av_sscanf + av_stereo3d_alloc + av_stereo3d_create_side_data + av_stereo3d_from_name + av_stereo3d_type_name + av_strcasecmp + av_strdup + av_strerror + av_strireplace + av_stristart + av_stristr + av_strlcat + av_strlcatf + av_strlcpy + av_strncasecmp + av_strndup + av_strnstr + av_strstart + av_strtod + av_strtok + av_sub_i + av_sub_q + av_tea_alloc + av_tea_crypt + av_tea_init + av_tea_size + av_tempfile + av_thread_message_flush + av_thread_message_queue_alloc + av_thread_message_queue_free + av_thread_message_queue_nb_elems + av_thread_message_queue_recv + av_thread_message_queue_send + av_thread_message_queue_set_err_recv + av_thread_message_queue_set_err_send + av_thread_message_queue_set_free_func + av_timecode_adjust_ntsc_framenum2 + av_timecode_check_frame_rate + av_timecode_get_smpte_from_framenum + av_timecode_init + av_timecode_init_from_string + av_timecode_make_mpeg_tc_string + av_timecode_make_smpte_tc_string + av_timecode_make_string + av_timegm + av_tree_destroy + av_tree_enumerate + av_tree_find + av_tree_insert + av_tree_node_alloc + av_tree_node_size + av_twofish_alloc + av_twofish_crypt + av_twofish_init + av_twofish_size + av_tx_init + av_tx_uninit + av_usleep + av_utf8_decode + av_util_ffversion + av_vbprintf + av_version_info + av_vlog + av_write_image_line + av_write_image_line2 + av_xtea_alloc + av_xtea_crypt + av_xtea_init + av_xtea_le_crypt + av_xtea_le_init + avpriv_alloc_fixed_dsp + avpriv_cga_font + avpriv_dict_set_timestamp + avpriv_float_dsp_alloc + avpriv_get_gamma_from_trc + avpriv_get_trc_function_from_trc + avpriv_init_lls + avpriv_open + avpriv_report_missing_feature + avpriv_request_sample + avpriv_scalarproduct_float_c + avpriv_set_systematic_pal2 + avpriv_slicethread_create + avpriv_slicethread_execute + avpriv_slicethread_free + avpriv_solve_lls + avpriv_tempfile + avpriv_vga16_font + avutil_configuration + avutil_license + avutil_version diff --git a/Kyoo.Transcoder/ffmpeg/lib/avutil.lib b/Kyoo.Transcoder/ffmpeg/lib/avutil.lib new file mode 100644 index 0000000000000000000000000000000000000000..e72b2a1a6e919c9e47c7c91b64f8ac7350cb961a GIT binary patch literal 407528 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 G%zpt%Ety^b literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libavcodec.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libavcodec.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..c1ff29edc738b1faa8bdfed74ce7edc4af1ee654 GIT binary patch literal 857596 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 r%AVb#-Rw8*E00~Y*or_ literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libavfilter.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libavfilter.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..5e1bb5ae02c575d387d386647ff6109d607d7f3c GIT binary patch literal 46428 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 U?W}>e7a47pl1ZRdb9gcKf1%AzR{#J2 literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libavformat.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libavformat.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..97cbf33155a66f5a7cb74821ba5c60d7fb764e2b GIT binary patch literal 138272 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 literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libpostproc.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libpostproc.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..69f61029b003e1a2c93e434e33b85e8960f9bf18 GIT binary patch literal 7130 zcmeI1Pj4GV6u@8C2}z@<3L*3#6*4GARaMN|@j7l*RTV-UIPeuVCSEs|9NXA#MekKl z94f?-10R3`Cypo|gd+!z9J#@J^Y*=&{gcU>lc61HW@p|!@6NpUo3}IT4<7br$0v`r zKB;F@GwO7@_YXQzRIi7o%Ps5msNG3_aI^&gR{??nK<#IM^)}~?835(W-*Mg!04QI1 z%z5V-0Oj3ZIPd)hK>6AO&Np5F+;}ma%oo$yS1Y~C@npP6 zzFA~{Btp~~%#y@B%4%4V^ozbu!l;N;XZ|di&4-h*+)0cjV$~ZBkCX8n4aYVSJrS$k zU?4xuY1$6e#lZ}QPoB~pP!X}c`GI({`Z9`S-kZG&ekGA?R zYX}&?Png$CZ5zK)&sfAjmiNzjfvgD7LDe>skLTX9w&6ldDp2=%)yJ$(#V;gN_lPppL@A~rYbsa-5Mp^wM3IG(i9Sqobst1crkZJH%eQebM5FP62^Xee3X=bZ zd7B1|i7s^rk5XSLrDUPsF<*7`0MrNSE4tqwbdPd9^%d#;iTQ51UI)8OB1SM!=Tdm~ z_iYlrdX?)i&8>WNMk)D%GPA#dHM=$2u5|W%DlxNTmQsnC2YJCh z0~^N5OvgLa#6we7^h`{p8KvTXNp(w{mLu2-7V5{56wW{^3k*Ac+p4C z6-UoU&-HS>0zDs=>nT07wwI;nGTGa_saJs-I~JE3rr4!s*LaAF0Ei)doAVx|bQi;X zbSv`_b&7m^hCaB6k6VtPe0+T5==t~v%k>I;JSf*wKKB0wADhI7cW<@|+z<&u2^oQ7 z3(c33jW%Dfz?17~*&0s@3A{%n_5qXm`d-y;1HY0LmHW{2$ z=!sUH>hy&6+}MA~dm)M(7e%X0Cu;bj)vlxGi&k#*bMy+)>YV7O(Tet`%f8LtB6{qR zZ)M4O8|OyJMka|>Bne-nnH+FKqm=jf}rdg!sb=yI&tF2{4u5QfPBS0`&a_+Lg zlmR@(tE>T;O%@)NdZJEy34YvD@auU3TeDvjh~Bzr554Dj)JM|$j-HRCJLP%>l3L|@O42Q~;<6-NvUbO< lg7ZHF-fLA)V(+EkSem-2gf0PmiKWt%omGygTxTg&{{VD(M;-tG literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libswresample.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libswresample.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..21ff4d83d4c22c4289f81cbf02441cd8b1d52025 GIT binary patch literal 15196 zcmeHOy^q{f5FdPZLx<#PFg5G_#>LP!?x=iNd8A%qa30ny_uyS~I|Z+Er32Z4%; ziXsJ~LWr7*f*Rc)z#l+Cg(xVg5Tb#ZH}-quXP?jRoa{bnp6z+F&u`}aJo7xy``qpB zq<8PNwU;XKQfsx_yPZb6)vi=r)g16<-GaoXY`v!pM!tYEMs{llo-eanK2S9ZBSEj3507TC>nO+zI5WV;# z)2+V&h}@e@^)UcZ6Z;@)<9&!ac#lqX`su`&Gd(CW?raj= zH~mXyB-0!1k8u=Mze+OJq~-5*heLmWeUHb%@UGQ)&uXP#4gLEwZ#l+-tZnYQ{G*)%;*3+QS&Q@Ww%7q zeSgsXOmszZ%!?#?gYMMsiFqWkH}U0I)urO^MX1ma@b)y1B>I!lmD*S0%-&%i!UUFF5z#LWf(Y7?UItT{+B<^BtlIsozqn-lU zD2@!PLCcB}D-r0sSnAE{D0EfQL$%x*dZM~=QSD|^`K9_!OC8BW^}k#~Ck2460np`O zS%GTM@6Nhc(0g!M#lu(8g+986pN^6}Z2Mgt4xv)b!VI0SI_HY`zaeeX zkg?FA0`8q~wlrGFMt>kZE#xq69;TuHPn5foE~jUU?)w)~HC?WaO{(DH0R9Qj&A~nV z?8DFsgK;DE=J^jfN<&6e$Wgk` zOqhG%g|akbY6JD-o_L0ltvoq5D_g*bVK^0grDeoeSsxmUBYk{md;Ac zN6Rq$Jd8Ce7KJDOWVRfWcj5_LN3cMT~C)w_@#Qf zoc2o>aqf%yr85#s@dbKm@$@X}NyYf4+ssh410Uc~_@=m42~=6lnb^v|@@UoMN{(Y* z6X)+ZY^{qq&cfDNA(w@%O1fMETQ}0>G`69e5v)kzca&S{AGv_VcgWgS3K{31tgED)Spi!kgCa}S zY#-EGU`afk_f3o$$HlW{5m&O} z*@lqIif8B3%co$ z6V7an41y9Z>0k=q^b2IP-6WdkZT-BiZO=Q_WnKSl5rnW96kTJ6svUS0j}eNF-j6@R z4TZ=lkiT9a2cFRO<}Vo@1>_w4oklit@@Jf^ zyE5JmS1`uM(3?|K9C!myX-y-wG5CpbGZ9oEqg+q!Rm>ZLPAHq>-n95;vaJ5+YzP*E zApAU87YE+Lb3#yD8-pQ>pNXOZ`DHh`13z!?RgX)%<1CaFLA2*W#USW1GgR$B2af_l zBCiu-=cv?97`+N)l55Gg@p`aeSAcwrzOGmsAhOEEl;1gU{?~`{g-O|V)$!^HRQvR%Ra}m98mr-M>wD`#z Oz4)JK7Hp1OFaHlbpAujI literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/libswscale.dll.a b/Kyoo.Transcoder/ffmpeg/lib/libswscale.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..b95f1c962b65b50b3e68e1e32d97032eeb89d985 GIT binary patch literal 22232 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 literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/postproc-55.def b/Kyoo.Transcoder/ffmpeg/lib/postproc-55.def new file mode 100644 index 00000000..1dd67ee9 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/postproc-55.def @@ -0,0 +1,11 @@ +EXPORTS + postproc_configuration + postproc_ffversion + postproc_license + postproc_version + pp_free_context + pp_free_mode + pp_get_context + pp_get_mode_by_name_and_quality + pp_help + pp_postprocess diff --git a/Kyoo.Transcoder/ffmpeg/lib/postproc.lib b/Kyoo.Transcoder/ffmpeg/lib/postproc.lib new file mode 100644 index 0000000000000000000000000000000000000000..6d7bf81d45e13b1489ad5dd3a3fe34668823dacd GIT binary patch literal 9078 zcmeI2&u<$=6vv;}Nz+;_l#-T;3dul_DpbrmvA2$dsz@O5>p%}kAcWXB@j71W*v8&O zZG}*TP=yeO9yoG9{Y(0HaOS{YL3wXx-^}a}d&fB#nP#M!oqhB5&di(7KF_ZG`g`s1 ze(z4@-D)z`o1WL&-twBwYSk4@W?8LbbNqqb3IJRKa2^7zz5uZHm&}zv04QI&BlG23 z0FLfbWNgXh|CJv={V8x>1~=^&p7+!(k`z_a6Avncp6C{O^w1{V;l<)iYJ` zRrZI2D7YUbKg34VbjLv;y3z`5;&#@nNeBsBm2ZxN@gy7$_)6?MHY;5}+z$p5^q}+! z>)5Px-7bGLrPK{di-YNg2S?*}lrw^4W9K-W1W|3sDUhqXuGeTFaogL9 zxXz<<2pzyi3E)LhTZNi%usE4oRN?M!t<#R$Qx&pd2kt(t?IAA(>4bD4U2vnp((_nZ z!Eu>s2VB-Q*-pBP({;C5cNr_|IXZ6VBd@_b&1S9B??bH{_Jg?bpJxCErEdEk8)CcZ zGwPz8>W5^eznp0r!&l{L8pBU3LPH)%rr4LlN2}OWE=|=4{}2V`5_u?_s1Hh{ao{a1 z3u8$|Fxj(b(leqUGwGoZ<%m}PYbG~o{*=}+6O-5D^`$k+W0JJ#Wat#*X$_r|F3(Q3 zihYS)GR2x%x|2CMP{*p;TgxYc*$)>6owx1iY-Q>E4Ogs)&c3m#i=^||=yw*KC;7Sz zoxkMk6rFG23d~FAd7^XXGuX0FOC&O*zq zS6Qti?v^FJTQcAp5%-K(%6+rJf&tdB!PzmDxJ}*6sLhW_J%iTkLpu zjh*Krcf8*k{Te&j%v;|mUzg$chkTvdJzT?kVBYxaXnysNrFflXeqwtC$4^PeU{@MM z>A+`rR54i3Iz_S3V9l{>$FY~)NBoLwTlD1CG1h;P91o0sXK{Q#Uzg$d$9$dQ82@51 rH^&vdqPYDte&NS!Ei=nE1hXc~t=K{b2fn~kv7DTFisw{g0n`5i;6M|_ literal 0 HcmV?d00001 diff --git a/Kyoo.Transcoder/ffmpeg/lib/swresample-3.def b/Kyoo.Transcoder/ffmpeg/lib/swresample-3.def new file mode 100644 index 00000000..4ca6d903 --- /dev/null +++ b/Kyoo.Transcoder/ffmpeg/lib/swresample-3.def @@ -0,0 +1,24 @@ +EXPORTS + swr_alloc + swr_alloc_set_opts + swr_build_matrix + swr_close + swr_config_frame + swr_convert + swr_convert_frame + swr_drop_output + swr_ffversion + swr_free + swr_get_class + swr_get_delay + swr_get_out_samples + swr_init + swr_inject_silence + swr_is_initialized + swr_next_pts + swr_set_channel_mapping + swr_set_compensation + swr_set_matrix + swresample_configuration + swresample_license + swresample_version diff --git a/Kyoo.Transcoder/ffmpeg/lib/swresample.lib b/Kyoo.Transcoder/ffmpeg/lib/swresample.lib new file mode 100644 index 0000000000000000000000000000000000000000..81424cf7096790c6227ad2ed6dbedbd812b7d75f GIT binary patch literal 18842 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 Mnf1S3 + +extern "C" API struct Stream +{ + std::string title; + std::string languageCode; + std::string format; + bool isDefault; + bool isForced; + std::string path; +}; \ No newline at end of file diff --git a/Kyoo.Transcoder/src/Transcoder.cpp b/Kyoo.Transcoder/src/Transcoder.cpp new file mode 100644 index 00000000..9f7b0092 --- /dev/null +++ b/Kyoo.Transcoder/src/Transcoder.cpp @@ -0,0 +1,47 @@ +#include "pch.h" +#include "Transcoder.h" + +//ffmpeg imports +extern "C" +{ + #include + #include +} + +int Init() +{ + return 42; +} + +//Video ScanVideo(std::string path) +//{ +// +//} + +void ExtractSubtitles(const char* path) +{ + AVFormatContext* formatContext = NULL; + + if (avformat_open_input(&formatContext, path, NULL, NULL)) + { + std::cout << "Error: Can't open the file at " << path << std::endl; + return; + } + + if (avformat_find_stream_info(formatContext, NULL) < 0) + { + std::cout << "Error: Could't find streams informations for the file at " << path << std::endl; + return; + } + + AVDictionaryEntry* metadata = NULL; + + while ((metadata = av_dict_get(formatContext->metadata, "", metadata, AV_DICT_IGNORE_SUFFIX))) + { + std::cout << metadata->key << " - " << metadata->value << std::endl; + } + + avformat_close_input(&formatContext); + + return; +} \ No newline at end of file diff --git a/Kyoo.Transcoder/Transcoder.h b/Kyoo.Transcoder/src/Transcoder.h similarity index 77% rename from Kyoo.Transcoder/Transcoder.h rename to Kyoo.Transcoder/src/Transcoder.h index 8b142199..3ffef510 100644 --- a/Kyoo.Transcoder/Transcoder.h +++ b/Kyoo.Transcoder/src/Transcoder.h @@ -11,4 +11,4 @@ extern "C" API int Init(); -extern "C" API Video ScanVideo(std::string path); +extern "C" API void ExtractSubtitles(const char* path); diff --git a/Kyoo.Transcoder/dllmain.cpp b/Kyoo.Transcoder/src/dllmain.cpp similarity index 100% rename from Kyoo.Transcoder/dllmain.cpp rename to Kyoo.Transcoder/src/dllmain.cpp diff --git a/Kyoo.Transcoder/framework.h b/Kyoo.Transcoder/src/framework.h similarity index 100% rename from Kyoo.Transcoder/framework.h rename to Kyoo.Transcoder/src/framework.h diff --git a/Kyoo.Transcoder/pch.cpp b/Kyoo.Transcoder/src/pch.cpp similarity index 100% rename from Kyoo.Transcoder/pch.cpp rename to Kyoo.Transcoder/src/pch.cpp diff --git a/Kyoo.Transcoder/pch.h b/Kyoo.Transcoder/src/pch.h similarity index 100% rename from Kyoo.Transcoder/pch.h rename to Kyoo.Transcoder/src/pch.h diff --git a/Kyoo/ClientApp/src/app/player/player.component.html b/Kyoo/ClientApp/src/app/player/player.component.html index 90ce7779..ecb8a314 100644 --- a/Kyoo/ClientApp/src/app/player/player.component.html +++ b/Kyoo/ClientApp/src/app/player/player.component.html @@ -1,7 +1,7 @@
diff --git a/Kyoo/Controllers/SubtitleController.cs b/Kyoo/Controllers/SubtitleController.cs index 15591ca1..a87bae06 100644 --- a/Kyoo/Controllers/SubtitleController.cs +++ b/Kyoo/Controllers/SubtitleController.cs @@ -1,4 +1,5 @@ using Kyoo.InternalAPI; +using Kyoo.Models; using Kyoo.Models.Watch; using Microsoft.AspNetCore.Mvc; @@ -9,10 +10,12 @@ namespace Kyoo.Controllers public class SubtitleController : ControllerBase { private readonly ILibraryManager libraryManager; + private readonly ITranscoder transcoder; - public SubtitleController(ILibraryManager libraryManager) + public SubtitleController(ILibraryManager libraryManager, ITranscoder transcoder) { this.libraryManager = libraryManager; + this.transcoder = transcoder; } [HttpGet("{showSlug}-s{seasonNumber}e{episodeNumber}-{languageTag}.{format?}")] @@ -26,5 +29,14 @@ namespace Kyoo.Controllers //Should use appropriate mime type here return PhysicalFile(subtitle.Path, "text/x-ssa"); } + + [HttpGet("extract/{showSlug}-s{seasonNumber}e{episodeNumber}")] + public IActionResult ExtractSubtitle(string showSlug, long seasonNumber, long episodeNumber) + { + Episode episode = libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); + transcoder.ExtractSubtitles(episode.Path); + + return null; + } } } \ No newline at end of file diff --git a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs index 0efb67bf..88ef1bd1 100644 --- a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs @@ -217,7 +217,7 @@ namespace Kyoo.InternalAPI public Stream GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag) { - string query = "SELECT streams.* FROM streams JOIN episodes ON streams.episodeID = episodes.id JOIN shows ON episodes.showID = shows.id WHERE shows.showSlug = $showSlug, episodes.seasonNumber = $seasonNumber, episodes.episodeNumber = $episodeNumber, streams.language = $languageTag;"; + string query = "SELECT streams.* FROM streams JOIN episodes ON streams.episodeID = episodes.id JOIN shows ON episodes.showID = shows.id WHERE shows.showSlug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber AND streams.language = $languageTag;"; using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) { diff --git a/Kyoo/InternalAPI/Transcoder/ITranscoder.cs b/Kyoo/InternalAPI/Transcoder/ITranscoder.cs index 8c7277a7..2c2aa716 100644 --- a/Kyoo/InternalAPI/Transcoder/ITranscoder.cs +++ b/Kyoo/InternalAPI/Transcoder/ITranscoder.cs @@ -8,8 +8,7 @@ namespace Kyoo.InternalAPI //Should transcode to a mp4 container with a h264 video format and a AAC audio format, no subtitles. string Transcode(string path); - void GetVideo(string Path); - - dynamic ScanVideo(string Path); + //Extract all subtitles of a video and save them in the subtitles sub-folder. + void ExtractSubtitles(string path); } } diff --git a/Kyoo/InternalAPI/Transcoder/Transcoder.cs b/Kyoo/InternalAPI/Transcoder/Transcoder.cs index 16938d7f..2e477740 100644 --- a/Kyoo/InternalAPI/Transcoder/Transcoder.cs +++ b/Kyoo/InternalAPI/Transcoder/Transcoder.cs @@ -8,21 +8,19 @@ namespace Kyoo.InternalAPI { public Transcoder(IConfiguration config) { - string transcoderPath = config.GetValue("plugins"); - Debug.WriteLine("&Transcoder DLL Path: " + transcoderPath); Debug.WriteLine("&Api INIT: " + TranscoderAPI.Init()); } + public void ExtractSubtitles(string path) + { + Debug.WriteLine("&Transcoder extract subs: " + TranscoderAPI.ExtractSubtitles(path)); + } + public void GetVideo(string path) { Debug.WriteLine("&Getting video..."); } - public dynamic ScanVideo(string path) - { - return TranscoderAPI.ScanVideo(path); - } - public string Stream(string path) { return @"D:\Videos\Anohana\AnoHana S01E01.mp4"; diff --git a/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs b/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs index 7bd99d6b..516a9ee1 100644 --- a/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs +++ b/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs @@ -7,9 +7,9 @@ namespace Kyoo.InternalAPI.TranscoderLink private const string TranscoderPath = @"C:\Projects\Kyoo\Debug\Kyoo.Transcoder.dll"; [DllImport(TranscoderPath, CallingConvention = CallingConvention.Cdecl)] - public extern static int Init(); + public extern static string Init(); [DllImport(TranscoderPath, CallingConvention = CallingConvention.Cdecl)] - public extern static dynamic ScanVideo(string path); + public extern static string ExtractSubtitles(string path); } } diff --git a/ffmpeg-build.txt b/ffmpeg-build.txt new file mode 100644 index 00000000..19fb77c1 --- /dev/null +++ b/ffmpeg-build.txt @@ -0,0 +1,16 @@ +Make sure that the ffmpeg-src directory contains a blank snapshot of the ffmpeg source code. +Open the Visual Studio Command Prompt with admin privilege (using the windows start menu). +Make sure that msys64 is installed and nasm is inside the path +Run: "C:\Program Files\Workspace\msys64\msys2_shell.cmd" -mingw64 -use-full-path +Verify that items are link inside the new cmd windows (run which cl and run which link) +Then cd to the ffmpeg source file (cd /c/Projects/Kyoo/ffmpeg-src) + +Then configure the project: +./configure --toolchain=msvc --disable-shared +Or, if you want x64 builds use: +./configure --toolchain=msvc --target-os=win64 --arch=x86_64 --disable-shared +If it doesn't work, try this command: I think that the last part are useless. +./configure --toolchain=msvc --disable-shared --enable-static --extra-libs=-static --extra-cflags=--static +Then run "make". +Then run "make install" +The build can be found in the usr/local/include and usr/local/lib subfolders of your msys64 folder. \ No newline at end of file