From 9f0ef52fd4d2701248da5a6159a1ea77cb1c1832 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Wed, 7 Aug 2024 23:15:47 -0700 Subject: [PATCH] Update FFmpeg to version 7.0 and rebuilt soxr Rebuilt libsoxr, which now removes the dependency on libavutil. --- .gitignore | 8 +- Cog.xcodeproj/project.pbxproj | 32 +- .../libvgmstream.xcodeproj/project.pbxproj | 32 +- .../FFMPEG/FFMPEG.xcodeproj/project.pbxproj | 32 +- Plugins/FFMPEG/FFMPEGDecoder.h | 2 +- Plugins/FFMPEG/FFMPEGDecoder.m | 2 +- .../ffmpeg/include/libavcodec/avcodec.h | 1193 ++++++++--------- ThirdParty/ffmpeg/include/libavcodec/avfft.h | 31 + ThirdParty/ffmpeg/include/libavcodec/codec.h | 38 +- .../ffmpeg/include/libavcodec/codec_desc.h | 8 +- .../ffmpeg/include/libavcodec/codec_id.h | 28 +- .../ffmpeg/include/libavcodec/codec_par.h | 57 +- .../ffmpeg/include/libavcodec/d3d11va.h | 3 - ThirdParty/ffmpeg/include/libavcodec/defs.h | 143 ++ ThirdParty/ffmpeg/include/libavcodec/dirac.h | 6 +- ThirdParty/ffmpeg/include/libavcodec/dxva2.h | 3 - ThirdParty/ffmpeg/include/libavcodec/jni.h | 21 + ThirdParty/ffmpeg/include/libavcodec/packet.h | 163 ++- ThirdParty/ffmpeg/include/libavcodec/vdpau.h | 24 +- .../ffmpeg/include/libavcodec/version.h | 4 +- .../ffmpeg/include/libavcodec/version_major.h | 28 +- .../ffmpeg/include/libavcodec/videotoolbox.h | 56 - .../ffmpeg/include/libavformat/avformat.h | 839 +++++++----- ThirdParty/ffmpeg/include/libavformat/avio.h | 24 +- .../ffmpeg/include/libavformat/version.h | 4 +- .../include/libavformat/version_major.h | 14 +- .../libavutil/ambient_viewing_environment.h | 72 + .../ffmpeg/include/libavutil/audio_fifo.h | 9 +- .../ffmpeg/include/libavutil/avassert.h | 3 + .../ffmpeg/include/libavutil/avstring.h | 12 +- ThirdParty/ffmpeg/include/libavutil/avutil.h | 19 +- ThirdParty/ffmpeg/include/libavutil/bprint.h | 15 +- .../ffmpeg/include/libavutil/channel_layout.h | 266 ++-- ThirdParty/ffmpeg/include/libavutil/common.h | 21 +- ThirdParty/ffmpeg/include/libavutil/cpu.h | 3 + ThirdParty/ffmpeg/include/libavutil/csp.h | 39 + ThirdParty/ffmpeg/include/libavutil/dict.h | 125 +- ThirdParty/ffmpeg/include/libavutil/eval.h | 2 +- .../ffmpeg/include/libavutil/executor.h | 67 + .../ffmpeg/include/libavutil/ffversion.h | 2 +- ThirdParty/ffmpeg/include/libavutil/fifo.h | 206 +-- ThirdParty/ffmpeg/include/libavutil/file.h | 17 - .../include/libavutil/film_grain_params.h | 68 +- ThirdParty/ffmpeg/include/libavutil/frame.h | 262 +++- .../include/libavutil/hdr_dynamic_metadata.h | 33 + .../libavutil/hdr_dynamic_vivid_metadata.h | 63 +- .../ffmpeg/include/libavutil/hwcontext.h | 26 +- .../ffmpeg/include/libavutil/hwcontext_cuda.h | 5 + .../include/libavutil/hwcontext_d3d12va.h | 134 ++ .../include/libavutil/hwcontext_mediacodec.h | 25 + .../libavutil/hwcontext_videotoolbox.h | 7 +- .../include/libavutil/hwcontext_vulkan.h | 128 +- ThirdParty/ffmpeg/include/libavutil/iamf.h | 680 ++++++++++ .../ffmpeg/include/libavutil/imgutils.h | 56 +- .../ffmpeg/include/libavutil/intreadwrite.h | 8 +- .../ffmpeg/include/libavutil/mathematics.h | 55 + ThirdParty/ffmpeg/include/libavutil/mem.h | 92 +- ThirdParty/ffmpeg/include/libavutil/opt.h | 607 +++++---- ThirdParty/ffmpeg/include/libavutil/pixdesc.h | 5 + ThirdParty/ffmpeg/include/libavutil/pixfmt.h | 64 +- .../ffmpeg/include/libavutil/random_seed.h | 14 + .../ffmpeg/include/libavutil/rational.h | 4 + .../ffmpeg/include/libavutil/samplefmt.h | 4 +- .../ffmpeg/include/libavutil/timecode.h | 14 +- .../ffmpeg/include/libavutil/timestamp.h | 17 +- ThirdParty/ffmpeg/include/libavutil/tx.h | 57 +- ThirdParty/ffmpeg/include/libavutil/version.h | 23 +- .../include/libavutil/video_enc_params.h | 4 +- .../ffmpeg/include/libavutil/video_hint.h | 107 ++ .../ffmpeg/include/libswresample/swresample.h | 67 +- .../ffmpeg/include/libswresample/version.h | 2 +- .../include/libswresample/version_major.h | 2 +- ThirdParty/libraries-debug-overlay.tar.xz | Bin 5115348 -> 2760352 bytes ThirdParty/libraries.tar.xz | Bin 7032896 -> 7055000 bytes ThirdParty/soxr/README.md | 5 - 75 files changed, 4009 insertions(+), 2302 deletions(-) create mode 100644 ThirdParty/ffmpeg/include/libavutil/ambient_viewing_environment.h create mode 100644 ThirdParty/ffmpeg/include/libavutil/executor.h create mode 100644 ThirdParty/ffmpeg/include/libavutil/hwcontext_d3d12va.h create mode 100644 ThirdParty/ffmpeg/include/libavutil/iamf.h create mode 100644 ThirdParty/ffmpeg/include/libavutil/video_hint.h diff --git a/.gitignore b/.gitignore index 98cea3310..ff52565fc 100644 --- a/.gitignore +++ b/.gitignore @@ -31,10 +31,10 @@ Xcode-config/DEVELOPMENT_TEAM.xcconfig /ThirdParty/fdk-aac/lib/libfdk-aac.dylib /ThirdParty/fdk-aac/lib/libfdk-aac.la /ThirdParty/fdk-aac/lib/pkgconfig/fdk-aac.pc -/ThirdParty/ffmpeg/lib/libavcodec.59.dylib -/ThirdParty/ffmpeg/lib/libavformat.59.dylib -/ThirdParty/ffmpeg/lib/libavutil.57.dylib -/ThirdParty/ffmpeg/lib/libswresample.4.dylib +/ThirdParty/ffmpeg/lib/libavcodec.61.dylib +/ThirdParty/ffmpeg/lib/libavformat.61.dylib +/ThirdParty/ffmpeg/lib/libavutil.59.dylib +/ThirdParty/ffmpeg/lib/libswresample.5.dylib /ThirdParty/flac/lib/libFLAC.12.dylib /ThirdParty/libid3tag/lib/libid3tag.a /ThirdParty/libmad/lib/libmad.a diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 581f33ca9..b205fedc7 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -158,10 +158,10 @@ 839E56F52879625100DFB5F4 /* SADIE_D02-96000.mhr in Resources */ = {isa = PBXBuildFile; fileRef = 839E56F12879625100DFB5F4 /* SADIE_D02-96000.mhr */; }; 83A360B220E4E81D00192DAB /* Flac.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8303A30C20E4E3D000951EF8 /* Flac.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 83A3B734283AE89000CC6593 /* ColorToValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */; }; - 83AA7D04279EBCA900087AA4 /* libavcodec.59.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D00279EBC8200087AA4 /* libavcodec.59.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 83AA7D05279EBCAB00087AA4 /* libavformat.59.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D03279EBC8300087AA4 /* libavformat.59.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 83AA7D06279EBCAD00087AA4 /* libavutil.57.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D02279EBC8200087AA4 /* libavutil.57.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 83AA7D07279EBCAF00087AA4 /* libswresample.4.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D01279EBC8200087AA4 /* libswresample.4.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 83AA7D04279EBCA900087AA4 /* libavcodec.61.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D00279EBC8200087AA4 /* libavcodec.61.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 83AA7D05279EBCAB00087AA4 /* libavformat.61.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D03279EBC8300087AA4 /* libavformat.61.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 83AA7D06279EBCAD00087AA4 /* libavutil.59.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D02279EBC8200087AA4 /* libavutil.59.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 83AA7D07279EBCAF00087AA4 /* libswresample.5.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D01279EBC8200087AA4 /* libswresample.5.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 83B06704180D579E008E3612 /* MIDI.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83B066A1180D5669008E3612 /* MIDI.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 83B61E2429A8296500CD0580 /* LyricsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 83B61E2229A8296500CD0580 /* LyricsWindow.xib */; }; 83B61E2829A82A0200CD0580 /* LyricsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83B61E2729A82A0200CD0580 /* LyricsWindowController.m */; }; @@ -717,10 +717,10 @@ 83256B69286661FC0036D9C0 /* libmpg123.0.dylib in CopyFiles */, 836EF0C927BB91E900BF35B2 /* libvorbisfile.3.dylib in CopyFiles */, 836EF0C827BB91E600BF35B2 /* libogg.0.dylib in CopyFiles */, - 83AA7D07279EBCAF00087AA4 /* libswresample.4.dylib in CopyFiles */, - 83AA7D06279EBCAD00087AA4 /* libavutil.57.dylib in CopyFiles */, - 83AA7D05279EBCAB00087AA4 /* libavformat.59.dylib in CopyFiles */, - 83AA7D04279EBCA900087AA4 /* libavcodec.59.dylib in CopyFiles */, + 83AA7D07279EBCAF00087AA4 /* libswresample.5.dylib in CopyFiles */, + 83AA7D06279EBCAD00087AA4 /* libavutil.59.dylib in CopyFiles */, + 83AA7D05279EBCAB00087AA4 /* libavformat.61.dylib in CopyFiles */, + 83AA7D04279EBCA900087AA4 /* libavcodec.61.dylib in CopyFiles */, 83B72E3B279045B7006007A3 /* libfdk-aac.2.dylib in CopyFiles */, 8305963C277F013200EBFAAE /* File_Extractor.framework in CopyFiles */, ED69CBCA25BE32E80090B90D /* MASShortcut.framework in CopyFiles */, @@ -1019,10 +1019,10 @@ 839E56F12879625100DFB5F4 /* SADIE_D02-96000.mhr */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SADIE_D02-96000.mhr"; sourceTree = ""; }; 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ColorToValueTransformer.m; path = Preferences/Preferences/ColorToValueTransformer.m; sourceTree = ""; }; 83A3B733283AE6AA00CC6593 /* ColorToValueTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ColorToValueTransformer.h; path = Preferences/Preferences/ColorToValueTransformer.h; sourceTree = ""; }; - 83AA7D00279EBC8200087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = ""; }; - 83AA7D01279EBC8200087AA4 /* libswresample.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.4.dylib; path = ThirdParty/ffmpeg/lib/libswresample.4.dylib; sourceTree = ""; }; - 83AA7D02279EBC8200087AA4 /* libavutil.57.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.57.dylib; path = ThirdParty/ffmpeg/lib/libavutil.57.dylib; sourceTree = ""; }; - 83AA7D03279EBC8300087AA4 /* libavformat.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.59.dylib; path = ThirdParty/ffmpeg/lib/libavformat.59.dylib; sourceTree = ""; }; + 83AA7D00279EBC8200087AA4 /* libavcodec.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.61.dylib; path = ThirdParty/ffmpeg/lib/libavcodec.61.dylib; sourceTree = ""; }; + 83AA7D01279EBC8200087AA4 /* libswresample.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.5.dylib; path = ThirdParty/ffmpeg/lib/libswresample.5.dylib; sourceTree = ""; }; + 83AA7D02279EBC8200087AA4 /* libavutil.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.59.dylib; path = ThirdParty/ffmpeg/lib/libavutil.59.dylib; sourceTree = ""; }; + 83AA7D03279EBC8300087AA4 /* libavformat.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.61.dylib; path = ThirdParty/ffmpeg/lib/libavformat.61.dylib; sourceTree = ""; }; 83AB9031237CEFD300A433D5 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; 83B0669C180D5668008E3612 /* MIDI.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MIDI.xcodeproj; path = Plugins/MIDI/MIDI.xcodeproj; sourceTree = ""; }; 83B61E2329A8296500CD0580 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LyricsWindow.xib; sourceTree = ""; }; @@ -1173,10 +1173,10 @@ 836EF0C627BB91AB00BF35B2 /* libvorbisfile.3.dylib */, 836EF0C427BB919300BF35B2 /* libogg.0.dylib */, 83B72E2A279044F6006007A3 /* libfdk-aac.2.dylib */, - 83AA7D00279EBC8200087AA4 /* libavcodec.59.dylib */, - 83AA7D03279EBC8300087AA4 /* libavformat.59.dylib */, - 83AA7D02279EBC8200087AA4 /* libavutil.57.dylib */, - 83AA7D01279EBC8200087AA4 /* libswresample.4.dylib */, + 83AA7D00279EBC8200087AA4 /* libavcodec.61.dylib */, + 83AA7D03279EBC8300087AA4 /* libavformat.61.dylib */, + 83AA7D02279EBC8200087AA4 /* libavutil.59.dylib */, + 83AA7D01279EBC8200087AA4 /* libswresample.5.dylib */, 83059634277F011100EBFAAE /* File_Extractor.xcodeproj */, 17BB5EA50B8A87850009ACB1 /* IOKit.framework */, 17BB5CF60B8A86350009ACB1 /* AudioUnit.framework */, diff --git a/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj b/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj index 0bd971cd5..05fb3dcff 100644 --- a/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj +++ b/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj @@ -637,10 +637,10 @@ 83AA5D241F6E2F9C0020821C /* awc.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D201F6E2F9B0020821C /* awc.c */; }; 83AA5D251F6E2F9C0020821C /* hca_keys.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AA5D211F6E2F9C0020821C /* hca_keys.h */; }; 83AA5D271F6E2F9C0020821C /* stma.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D231F6E2F9C0020821C /* stma.c */; }; - 83AA7D17279EBD0400087AA4 /* libavcodec.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */; }; - 83AA7D18279EBD0900087AA4 /* libavformat.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */; }; - 83AA7D19279EBD0B00087AA4 /* libavutil.57.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D16279EBCF900087AA4 /* libavutil.57.dylib */; }; - 83AA7D1A279EBD0D00087AA4 /* libswresample.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D15279EBCF900087AA4 /* libswresample.4.dylib */; }; + 83AA7D17279EBD0400087AA4 /* libavcodec.61.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D13279EBCF900087AA4 /* libavcodec.61.dylib */; }; + 83AA7D18279EBD0900087AA4 /* libavformat.61.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D14279EBCF900087AA4 /* libavformat.61.dylib */; }; + 83AA7D19279EBD0B00087AA4 /* libavutil.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D16279EBCF900087AA4 /* libavutil.59.dylib */; }; + 83AA7D1A279EBD0D00087AA4 /* libswresample.5.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D15279EBCF900087AA4 /* libswresample.5.dylib */; }; 83AA7F7D2519C042004C5298 /* dsb.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7F742519C041004C5298 /* dsb.c */; }; 83AA7F7E2519C042004C5298 /* svag_kcet.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7F752519C041004C5298 /* svag_kcet.c */; }; 83AA7F7F2519C042004C5298 /* bsf.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7F762519C042004C5298 /* bsf.c */; }; @@ -1485,10 +1485,10 @@ 83AA5D201F6E2F9B0020821C /* awc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awc.c; sourceTree = ""; }; 83AA5D211F6E2F9C0020821C /* hca_keys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hca_keys.h; sourceTree = ""; }; 83AA5D231F6E2F9C0020821C /* stma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stma.c; sourceTree = ""; }; - 83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = ""; }; - 83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.59.dylib; sourceTree = ""; }; - 83AA7D15279EBCF900087AA4 /* libswresample.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.4.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.4.dylib; sourceTree = ""; }; - 83AA7D16279EBCF900087AA4 /* libavutil.57.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.57.dylib; path = ../../ThirdParty/ffmpeg/lib/libavutil.57.dylib; sourceTree = ""; }; + 83AA7D13279EBCF900087AA4 /* libavcodec.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.61.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.61.dylib; sourceTree = ""; }; + 83AA7D14279EBCF900087AA4 /* libavformat.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.61.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.61.dylib; sourceTree = ""; }; + 83AA7D15279EBCF900087AA4 /* libswresample.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.5.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.5.dylib; sourceTree = ""; }; + 83AA7D16279EBCF900087AA4 /* libavutil.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavutil.59.dylib; sourceTree = ""; }; 83AA7F742519C041004C5298 /* dsb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsb.c; sourceTree = ""; }; 83AA7F752519C041004C5298 /* svag_kcet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svag_kcet.c; sourceTree = ""; }; 83AA7F762519C042004C5298 /* bsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bsf.c; sourceTree = ""; }; @@ -1606,10 +1606,10 @@ files = ( 836EF0DD27BB97C500BF35B2 /* libvorbisfile.3.dylib in Frameworks */, 836EF0DB27BB975900BF35B2 /* libvorbis.0.dylib in Frameworks */, - 83AA7D1A279EBD0D00087AA4 /* libswresample.4.dylib in Frameworks */, - 83AA7D19279EBD0B00087AA4 /* libavutil.57.dylib in Frameworks */, - 83AA7D18279EBD0900087AA4 /* libavformat.59.dylib in Frameworks */, - 83AA7D17279EBD0400087AA4 /* libavcodec.59.dylib in Frameworks */, + 83AA7D1A279EBD0D00087AA4 /* libswresample.5.dylib in Frameworks */, + 83AA7D19279EBD0B00087AA4 /* libavutil.59.dylib in Frameworks */, + 83AA7D18279EBD0900087AA4 /* libavformat.61.dylib in Frameworks */, + 83AA7D17279EBD0400087AA4 /* libavcodec.61.dylib in Frameworks */, 83B72E3A27904589006007A3 /* libfdk-aac.2.dylib in Frameworks */, 83E22FC32772FD16000015EE /* AudioToolbox.framework in Frameworks */, 83E22FC12772FD06000015EE /* libbz2.tbd in Frameworks */, @@ -1782,10 +1782,10 @@ 836EF0DC27BB97BA00BF35B2 /* libvorbisfile.3.dylib */, 836EF0D027BB960A00BF35B2 /* libvorbis.0.dylib */, 83B72E342790452C006007A3 /* libfdk-aac.2.dylib */, - 83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */, - 83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */, - 83AA7D16279EBCF900087AA4 /* libavutil.57.dylib */, - 83AA7D15279EBCF900087AA4 /* libswresample.4.dylib */, + 83AA7D13279EBCF900087AA4 /* libavcodec.61.dylib */, + 83AA7D14279EBCF900087AA4 /* libavformat.61.dylib */, + 83AA7D16279EBCF900087AA4 /* libavutil.59.dylib */, + 83AA7D15279EBCF900087AA4 /* libswresample.5.dylib */, 8315868C26F58AF900803A3A /* libspeex.a */, 83D731381A74968900CA1366 /* g719.xcodeproj */, 835FC6C123F62AEE006960FA /* libatrac9.xcodeproj */, diff --git a/Plugins/FFMPEG/FFMPEG.xcodeproj/project.pbxproj b/Plugins/FFMPEG/FFMPEG.xcodeproj/project.pbxproj index bebaf17a1..c97b5f213 100644 --- a/Plugins/FFMPEG/FFMPEG.xcodeproj/project.pbxproj +++ b/Plugins/FFMPEG/FFMPEG.xcodeproj/project.pbxproj @@ -17,10 +17,10 @@ 8352D49D1CDDB8C0009D16AA /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8352D49C1CDDB8C0009D16AA /* CoreMedia.framework */; }; 8352D49F1CDDB8D7009D16AA /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8352D49E1CDDB8D7009D16AA /* CoreVideo.framework */; }; 8356BCE927B37C6F0074E50C /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 8356BCE727B37C6F0074E50C /* NSDictionary+Merge.m */; }; - 83AA7D0C279EBCC600087AA4 /* libavcodec.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D08279EBCC600087AA4 /* libavcodec.59.dylib */; }; - 83AA7D0D279EBCC600087AA4 /* libavutil.57.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D09279EBCC600087AA4 /* libavutil.57.dylib */; }; - 83AA7D0E279EBCC600087AA4 /* libswresample.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D0A279EBCC600087AA4 /* libswresample.4.dylib */; }; - 83AA7D0F279EBCC600087AA4 /* libavformat.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D0B279EBCC600087AA4 /* libavformat.59.dylib */; }; + 83AA7D0C279EBCC600087AA4 /* libavcodec.61.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D08279EBCC600087AA4 /* libavcodec.61.dylib */; }; + 83AA7D0D279EBCC600087AA4 /* libavutil.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D09279EBCC600087AA4 /* libavutil.59.dylib */; }; + 83AA7D0E279EBCC600087AA4 /* libswresample.5.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D0A279EBCC600087AA4 /* libswresample.5.dylib */; }; + 83AA7D0F279EBCC600087AA4 /* libavformat.61.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D0B279EBCC600087AA4 /* libavformat.61.dylib */; }; 83B72E3927904557006007A3 /* libfdk-aac.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B72E3827904557006007A3 /* libfdk-aac.2.dylib */; }; 83CBC5AA2866F75B00F2753B /* FFMPEGContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBC5A92866F75B00F2753B /* FFMPEGContainer.m */; }; 83E22FC62772FD32000015EE /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 83E22FC52772FD32000015EE /* libbz2.tbd */; }; @@ -61,10 +61,10 @@ 8356BD1A27B3D06F0074E50C /* HTTPSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPSource.h; path = ../HTTPSource/HTTPSource.h; sourceTree = ""; }; 83747C542862DD4D0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = ""; }; 8384913818081F6C00E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = ""; }; - 83AA7D08279EBCC600087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = ""; }; - 83AA7D09279EBCC600087AA4 /* libavutil.57.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.57.dylib; path = ../../ThirdParty/ffmpeg/lib/libavutil.57.dylib; sourceTree = ""; }; - 83AA7D0A279EBCC600087AA4 /* libswresample.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.4.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.4.dylib; sourceTree = ""; }; - 83AA7D0B279EBCC600087AA4 /* libavformat.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.59.dylib; sourceTree = ""; }; + 83AA7D08279EBCC600087AA4 /* libavcodec.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.61.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.61.dylib; sourceTree = ""; }; + 83AA7D09279EBCC600087AA4 /* libavutil.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavutil.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavutil.59.dylib; sourceTree = ""; }; + 83AA7D0A279EBCC600087AA4 /* libswresample.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.5.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.5.dylib; sourceTree = ""; }; + 83AA7D0B279EBCC600087AA4 /* libavformat.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.61.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.61.dylib; sourceTree = ""; }; 83B72E3827904557006007A3 /* libfdk-aac.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libfdk-aac.2.dylib"; path = "../../ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib"; sourceTree = ""; }; 83CBC5A82866F75B00F2753B /* FFMPEGContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FFMPEGContainer.h; sourceTree = ""; }; 83CBC5A92866F75B00F2753B /* FFMPEGContainer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FFMPEGContainer.m; sourceTree = ""; }; @@ -84,17 +84,17 @@ buildActionMask = 2147483647; files = ( 83B72E3927904557006007A3 /* libfdk-aac.2.dylib in Frameworks */, - 83AA7D0C279EBCC600087AA4 /* libavcodec.59.dylib in Frameworks */, + 83AA7D0C279EBCC600087AA4 /* libavcodec.61.dylib in Frameworks */, 83E22FC82772FD3A000015EE /* AudioToolbox.framework in Frameworks */, - 83AA7D0E279EBCC600087AA4 /* libswresample.4.dylib in Frameworks */, + 83AA7D0E279EBCC600087AA4 /* libswresample.5.dylib in Frameworks */, 83E22FC62772FD32000015EE /* libbz2.tbd in Frameworks */, - 83AA7D0D279EBCC600087AA4 /* libavutil.57.dylib in Frameworks */, + 83AA7D0D279EBCC600087AA4 /* libavutil.59.dylib in Frameworks */, 8352D4991CDDB06A009D16AA /* libz.tbd in Frameworks */, 8352D4971CDDB05E009D16AA /* Security.framework in Frameworks */, 8352D4911CDDB02A009D16AA /* VideoDecodeAcceleration.framework in Frameworks */, 8352D49F1CDDB8D7009D16AA /* CoreVideo.framework in Frameworks */, 8352D4931CDDB034009D16AA /* QuartzCore.framework in Frameworks */, - 83AA7D0F279EBCC600087AA4 /* libavformat.59.dylib in Frameworks */, + 83AA7D0F279EBCC600087AA4 /* libavformat.61.dylib in Frameworks */, 8352D49D1CDDB8C0009D16AA /* CoreMedia.framework in Frameworks */, 8352D49B1CDDB8B2009D16AA /* VideoToolbox.framework in Frameworks */, 8352D48F1CDDB023009D16AA /* CoreFoundation.framework in Frameworks */, @@ -123,10 +123,10 @@ isa = PBXGroup; children = ( 83B72E3827904557006007A3 /* libfdk-aac.2.dylib */, - 83AA7D08279EBCC600087AA4 /* libavcodec.59.dylib */, - 83AA7D0B279EBCC600087AA4 /* libavformat.59.dylib */, - 83AA7D09279EBCC600087AA4 /* libavutil.57.dylib */, - 83AA7D0A279EBCC600087AA4 /* libswresample.4.dylib */, + 83AA7D08279EBCC600087AA4 /* libavcodec.61.dylib */, + 83AA7D0B279EBCC600087AA4 /* libavformat.61.dylib */, + 83AA7D09279EBCC600087AA4 /* libavutil.59.dylib */, + 83AA7D0A279EBCC600087AA4 /* libswresample.5.dylib */, 8352D4981CDDB06A009D16AA /* libz.tbd */, 8352D4941CDDB03E009D16AA /* libiconv.tbd */, 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */, diff --git a/Plugins/FFMPEG/FFMPEGDecoder.h b/Plugins/FFMPEG/FFMPEGDecoder.h index 8bd814d37..33570c237 100644 --- a/Plugins/FFMPEG/FFMPEGDecoder.h +++ b/Plugins/FFMPEG/FFMPEGDecoder.h @@ -14,7 +14,7 @@ #include extern int ffmpeg_read(void *opaque, uint8_t *buf, int buf_size); -extern int ffmpeg_write(void *opaque, uint8_t *buf, int buf_size); +extern int ffmpeg_write(void *opaque, const uint8_t *buf, int buf_size); int64_t ffmpeg_seek(void *opaque, int64_t offset, int whence); @interface FFMPEGDecoder : NSObject { diff --git a/Plugins/FFMPEG/FFMPEGDecoder.m b/Plugins/FFMPEG/FFMPEGDecoder.m index ef1def498..efb433c30 100644 --- a/Plugins/FFMPEG/FFMPEGDecoder.m +++ b/Plugins/FFMPEG/FFMPEGDecoder.m @@ -27,7 +27,7 @@ int ffmpeg_read(void *opaque, uint8_t *buf, int buf_size) { return (int)sizeRead; } -int ffmpeg_write(void *opaque, uint8_t *buf, int buf_size) { +int ffmpeg_write(void *opaque, const uint8_t *buf, int buf_size) { return -1; } diff --git a/ThirdParty/ffmpeg/include/libavcodec/avcodec.h b/ThirdParty/ffmpeg/include/libavcodec/avcodec.h index 3edd8e263..83dc48725 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/avcodec.h +++ b/ThirdParty/ffmpeg/include/libavcodec/avcodec.h @@ -31,6 +31,7 @@ #include "libavutil/attributes.h" #include "libavutil/avutil.h" #include "libavutil/buffer.h" +#include "libavutil/channel_layout.h" #include "libavutil/dict.h" #include "libavutil/frame.h" #include "libavutil/log.h" @@ -38,8 +39,6 @@ #include "libavutil/rational.h" #include "codec.h" -#include "codec_desc.h" -#include "codec_par.h" #include "codec_id.h" #include "defs.h" #include "packet.h" @@ -49,8 +48,13 @@ * to avoid unnecessary rebuilds. When included externally, keep including * the full version information. */ #include "version.h" + +#include "codec_desc.h" +#include "codec_par.h" #endif +struct AVCodecParameters; + /** * @defgroup libavc libavcodec * Encoding/Decoding Library @@ -183,12 +187,16 @@ * @{ */ +#if FF_API_BUFFER_MIN_SIZE /** * @ingroup lavc_encoding * minimum encoding buffer size * Used to avoid some checks during header writing. + * @deprecated Unused: avcodec_receive_packet() does not work + * with preallocated packet buffers. */ #define AV_INPUT_BUFFER_MIN_SIZE 16384 +#endif /** * @ingroup lavc_encoding @@ -226,21 +234,76 @@ typedef struct RcOverride{ * Use qpel MC. */ #define AV_CODEC_FLAG_QPEL (1 << 4) +#if FF_API_DROPCHANGED /** * Don't output frames whose parameters differ from first * decoded frame in stream. + * + * @deprecated callers should implement this functionality in their own code */ #define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +#endif /** - * Request the encoder to output reconstructed frames, i.e. frames that would be - * produced by decoding the encoded bistream. These frames may be retrieved by - * calling avcodec_receive_frame() immediately after a successful call to + * Request the encoder to output reconstructed frames, i.e.\ frames that would + * be produced by decoding the encoded bistream. These frames may be retrieved + * by calling avcodec_receive_frame() immediately after a successful call to * avcodec_receive_packet(). * * Should only be used with encoders flagged with the - * AV_CODEC_CAP_ENCODER_RECON_FRAME capability. + * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability. + * + * @note + * Each reconstructed frame returned by the encoder corresponds to the last + * encoded packet, i.e. the frames are returned in coded order rather than + * presentation order. + * + * @note + * Frame parameters (like pixel format or dimensions) do not have to match the + * AVCodecContext values. Make sure to use the values from the returned frame. */ #define AV_CODEC_FLAG_RECON_FRAME (1 << 6) +/** + * @par decoding + * Request the decoder to propagate each packet's AVPacket.opaque and + * AVPacket.opaque_ref to its corresponding output AVFrame. + * + * @par encoding: + * Request the encoder to propagate each frame's AVFrame.opaque and + * AVFrame.opaque_ref values to its corresponding output AVPacket. + * + * @par + * May only be set on encoders that have the + * @ref AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability flag. + * + * @note + * While in typical cases one input frame produces exactly one output packet + * (perhaps after a delay), in general the mapping of frames to packets is + * M-to-N, so + * - Any number of input frames may be associated with any given output packet. + * This includes zero - e.g. some encoders may output packets that carry only + * metadata about the whole stream. + * - A given input frame may be associated with any number of output packets. + * Again this includes zero - e.g. some encoders may drop frames under certain + * conditions. + * . + * This implies that when using this flag, the caller must NOT assume that + * - a given input frame's opaques will necessarily appear on some output packet; + * - every output packet will have some non-NULL opaque value. + * . + * When an output packet contains multiple frames, the opaque values will be + * taken from the first of those. + * + * @note + * The converse holds for decoders, with frames and packets switched. + */ +#define AV_CODEC_FLAG_COPY_OPAQUE (1 << 7) +/** + * Signal to the encoder that the values of AVFrame.duration are valid and + * should be used (typically for transferring them to output packets). + * + * If this flag is not set, frame durations are ignored. + */ +#define AV_CODEC_FLAG_FRAME_DURATION (1 << 8) /** * Use internal 2pass ratecontrol in first pass mode. */ @@ -261,15 +324,6 @@ typedef struct RcOverride{ * error[?] variables will be set during encoding. */ #define AV_CODEC_FLAG_PSNR (1 << 15) -#if FF_API_FLAG_TRUNCATED -/** - * Input bitstream might be truncated at a random location - * instead of only at frame boundaries. - * - * @deprecated use codec parsers for packetizing input - */ -#define AV_CODEC_FLAG_TRUNCATED (1 << 16) -#endif /** * Use interlaced DCT. */ @@ -310,11 +364,6 @@ typedef struct RcOverride{ */ #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. @@ -380,8 +429,6 @@ typedef struct RcOverride{ */ #define AV_GET_ENCODE_BUFFER_FLAG_REF (1 << 0) -struct AVCodecInternal; - /** * main external API structure. * New fields can be added to the end with minor version bumps. @@ -447,29 +494,6 @@ typedef struct AVCodecContext { */ 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. @@ -515,19 +539,42 @@ typedef struct AVCodecContext { * (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. + * - decoding: unused. */ AVRational time_base; + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed. + * - encoding: unused. + * - decoding: set by user. + */ + AVRational pkt_timebase; + + /** + * - 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; + +#if FF_API_TICKS_PER_FRAME /** * 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. + * + * @deprecated + * - decoding: Use AVCodecDescriptor.props & AV_CODEC_PROP_FIELDS + * - encoding: Set AVCodecContext.framerate instead + * */ + attribute_deprecated int ticks_per_frame; +#endif /** * Codec delay. @@ -586,11 +633,13 @@ typedef struct AVCodecContext { int coded_width, coded_height; /** - * the number of pictures in a group of pictures, or 0 for intra_only + * 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: unused + * - decoding: Set by libavcodec. */ - int gop_size; + AVRational sample_aspect_ratio; /** * Pixel format, see AV_PIX_FMT_xxx. @@ -607,6 +656,82 @@ typedef struct AVCodecContext { */ enum AVPixelFormat pix_fmt; + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * 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 to override the default output color range value, + * If not specified, libavcodec sets the color range depending on the + * output format. + * - decoding: Set by libavcodec, can be set by the user to propagate the + * color range to components reading from the decoder context. + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + + /** + * 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; + + /** + * 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) + /** * If non NULL, 'draw_horiz_band' is called by the libavcodec * decoder to draw a horizontal band. It improves cache usage. Not @@ -685,14 +810,6 @@ typedef struct AVCodecContext { */ 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; - /** * qscale factor between P- and I-frames * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). @@ -745,27 +862,11 @@ typedef struct AVCodecContext { float dark_masking; /** - * slice count - * - encoding: Set by libavcodec. - * - decoding: Set by user (or 0). - */ - int slice_count; - - /** - * 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. + * noise vs. sse weight for the nsse comparison function * - encoding: Set by user. - * - decoding: Set by libavcodec. + * - decoding: unused */ - AVRational sample_aspect_ratio; + int nsse_weight; /** * motion estimation comparison function @@ -853,16 +954,6 @@ typedef struct AVCodecContext { */ 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. @@ -891,6 +982,13 @@ typedef struct AVCodecContext { */ uint16_t *inter_matrix; + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + /** * precision of the intra DC coefficient - 8 * - encoding: Set by user. @@ -898,20 +996,6 @@ typedef struct AVCodecContext { */ 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. @@ -940,11 +1024,11 @@ typedef struct AVCodecContext { int keyint_min; /** - * number of reference frames + * the number of pictures in a group of pictures, or 0 for intra_only * - encoding: Set by user. - * - decoding: Set by lavc. + * - decoding: unused */ - int refs; + int gop_size; /** * Note: Value depends upon the compare function used for fullpel ME. @@ -953,41 +1037,6 @@ typedef struct AVCodecContext { */ int mv0_threshold; - /** - * 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 @@ -997,24 +1046,9 @@ typedef struct AVCodecContext { */ int slices; - /** Field order - * - encoding: set by libavcodec - * - decoding: Set by user. - */ - enum AVFieldOrder field_order; - /* audio only */ int sample_rate; ///< samples per second -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * number of audio channels - * @deprecated use ch_layout.nb_channels - */ - attribute_deprecated - int channels; -#endif - /** * audio sample format * - encoding: Set by user. @@ -1022,6 +1056,14 @@ typedef struct AVCodecContext { */ enum AVSampleFormat sample_fmt; ///< sample format + /** + * Audio channel layout. + * - encoding: must be set by the caller, to one of AVCodec.ch_layouts. + * - decoding: may be set by the caller if known e.g. from the container. + * The decoder can then override during decoding as needed. + */ + AVChannelLayout ch_layout; + /* The following data should not be initialized. */ /** * Number of samples per channel in an audio frame. @@ -1034,17 +1076,6 @@ typedef struct AVCodecContext { */ 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. @@ -1058,26 +1089,6 @@ typedef struct AVCodecContext { */ int cutoff; -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * Audio channel layout. - * - encoding: set by user. - * - decoding: set by user, may be overwritten by libavcodec. - * @deprecated use ch_layout - */ - attribute_deprecated - uint64_t channel_layout; - - /** - * Request decoder to use this channel layout if it can (0 for default) - * - encoding: unused - * - decoding: Set by user. - * @deprecated use "downmix" codec private option - */ - attribute_deprecated - uint64_t request_channel_layout; -#endif - /** * Type of service that the audio stream conveys. * - encoding: Set by user. @@ -1093,6 +1104,41 @@ typedef struct AVCodecContext { */ enum AVSampleFormat request_sample_fmt; + /** + * 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; + + /** + * 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; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + /** * 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 @@ -1176,6 +1222,29 @@ typedef struct AVCodecContext { int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); /* - encoding parameters */ + /** + * 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 + 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) @@ -1203,7 +1272,7 @@ typedef struct AVCodecContext { /** * decoder bitstream buffer size * - encoding: Set by user. - * - decoding: unused + * - decoding: May be set by libavcodec. */ int rc_buffer_size; @@ -1350,17 +1419,6 @@ typedef struct AVCodecContext { */ int err_recognition; - /** - * 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. @@ -1392,6 +1450,75 @@ typedef struct AVCodecContext { */ void *hwaccel_context; + /** + * 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; + + /** + * 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. 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; + /** * error * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. @@ -1430,10 +1557,6 @@ typedef struct AVCodecContext { #define FF_IDCT_SIMPLEARMV6 17 #define FF_IDCT_FAAN 20 #define FF_IDCT_SIMPLENEON 22 -#if FF_API_IDCT_NONE -// formerly used by xvmc -#define FF_IDCT_NONE 24 -#endif #define FF_IDCT_SIMPLEAUTO 128 /** @@ -1450,13 +1573,6 @@ typedef struct AVCodecContext { */ int bits_per_raw_sample; - /** - * low resolution decoding, 1-> 1/2 size, 2->1/4 size - * - encoding: unused - * - decoding: Set by user. - */ - int lowres; - /** * thread count * is used to decide how many independent tasks should be passed to execute() @@ -1484,27 +1600,6 @@ typedef struct AVCodecContext { */ int active_thread_type; -#if FF_API_THREAD_SAFE_CALLBACKS - /** - * 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. - * - * @deprecated the custom get_buffer2() callback should always be - * thread-safe. Thread-unsafe get_buffer2() implementations will be - * invalid starting with LIBAVCODEC_VERSION_MAJOR=60; in other words, - * libavcodec will behave as if this field was always set to 1. - * Callers that want to be forward compatible with future libavcodec - * versions should wrap access to this field in - * `#if LIBAVCODEC_VERSION_MAJOR < 60` - */ - attribute_deprecated - int thread_safe_callbacks; -#endif - /** * The codec may call this to execute several independent things. * It will return only after finishing all tasks. @@ -1535,19 +1630,16 @@ typedef struct AVCodecContext { */ 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. + * See the AV_PROFILE_* defines in defs.h. */ int profile; +#if FF_API_FF_PROFILE_LEVEL + /** @deprecated The following defines are deprecated; use AV_PROFILE_* + * in defs.h instead. */ #define FF_PROFILE_UNKNOWN -99 #define FF_PROFILE_RESERVED -100 @@ -1569,12 +1661,19 @@ typedef struct AVCodecContext { #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_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_DTS_HD_MA_X 61 +#define FF_PROFILE_DTS_HD_MA_X_IMAX 62 + + +#define FF_PROFILE_EAC3_DDP_ATMOS 30 + +#define FF_PROFILE_TRUEHD_ATMOS 30 #define FF_PROFILE_MPEG2_422 0 #define FF_PROFILE_MPEG2_HIGH 1 @@ -1639,6 +1738,7 @@ typedef struct AVCodecContext { #define FF_PROFILE_HEVC_MAIN_10 2 #define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 #define FF_PROFILE_HEVC_REXT 4 +#define FF_PROFILE_HEVC_SCC 9 #define FF_PROFILE_VVC_MAIN_10 1 #define FF_PROFILE_VVC_MAIN_10_444 33 @@ -1668,13 +1768,34 @@ typedef struct AVCodecContext { #define FF_PROFILE_KLVA_SYNC 0 #define FF_PROFILE_KLVA_ASYNC 1 +#define FF_PROFILE_EVC_BASELINE 0 +#define FF_PROFILE_EVC_MAIN 1 +#endif + /** - * level - * - encoding: Set by user. + * Encoding level descriptor. + * - encoding: Set by user, corresponds to a specific level defined by the + * codec, usually corresponding to the profile level, if not specified it + * is set to FF_LEVEL_UNKNOWN. * - decoding: Set by libavcodec. + * See AV_LEVEL_* in defs.h. */ int level; +#if FF_API_FF_PROFILE_LEVEL + /** @deprecated The following define is deprecated; use AV_LEVEL_UNKOWN + * in defs.h instead. */ #define FF_LEVEL_UNKNOWN -99 +#endif + + /** + * 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 +#define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004 /** * Skip loop filtering for selected frames. @@ -1698,72 +1819,46 @@ typedef struct AVCodecContext { 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; - - /** - * 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. + * 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: 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. + * - decoding: set by user + * - encoding: unused */ - int initial_padding; + int skip_alpha; /** - * - 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. + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. */ - AVRational framerate; + int skip_top; /** - * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. - * - encoding: unused. - * - decoding: Set by libavcodec before calling get_format() + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. */ - enum AVPixelFormat sw_pix_fmt; + int skip_bottom; /** - * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. - * - encoding unused. - * - decoding set by user. + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. */ - AVRational pkt_timebase; + int lowres; /** * AVCodecDescriptor * - encoding: unused. * - decoding: set by libavcodec. */ - const AVCodecDescriptor *codec_descriptor; - - /** - * 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 + const struct AVCodecDescriptor *codec_descriptor; /** * Character encoding of the input subtitles file. @@ -1785,43 +1880,15 @@ typedef struct AVCodecContext { #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 + * 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()) */ - 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 - /** - * @deprecated unused - */ - attribute_deprecated - 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; + int subtitle_header_size; + uint8_t *subtitle_header; /** * dump format separator. @@ -1839,68 +1906,24 @@ typedef struct AVCodecContext { */ 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 -#define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004 - /** * Additional data associated with the entire coded stream. * - * - decoding: unused + * - decoding: may be set by user before calling avcodec_open2(). * - 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. + * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of + * metadata exported in frame, packet, or coded stream side data by + * decoders and encoders. * - * - 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. + * - decoding: set by user + * - encoding: set by user */ - AVBufferRef *hw_frames_ctx; - -#if FF_API_SUB_TEXT_FORMAT - /** - * @deprecated unused - */ - attribute_deprecated - int sub_text_format; -#define FF_SUB_TEXT_FMT_ASS 0 -#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; + int export_side_data; /** * The number of pixels per image to maximally accept. @@ -1910,37 +1933,6 @@ typedef struct AVCodecContext { */ 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 @@ -1968,20 +1960,6 @@ typedef struct AVCodecContext { */ 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. * @@ -1998,16 +1976,6 @@ typedef struct AVCodecContext { */ int64_t max_samples; - /** - * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of - * metadata exported in frame, packet, or coded stream side data by - * decoders and encoders. - * - * - decoding: set by user - * - encoding: set by user - */ - int export_side_data; - /** * This callback is called at the beginning of each packet to get a data * buffer for it. @@ -2051,12 +2019,62 @@ typedef struct AVCodecContext { int (*get_encode_buffer)(struct AVCodecContext *s, AVPacket *pkt, int flags); /** - * Audio channel layout. - * - encoding: must be set by the caller, to one of AVCodec.ch_layouts. - * - decoding: may be set by the caller if known e.g. from the container. - * The decoder can then override during decoding as needed. + * 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. */ - AVChannelLayout ch_layout; + int64_t frame_num; + + /** + * Decoding only. May be set by the caller before avcodec_open2() to an + * av_malloc()'ed array (or via AVOptions). Owned and freed by the decoder + * afterwards. + * + * Side data attached to decoded frames may come from several sources: + * 1. coded_side_data, which the decoder will for certain types translate + * from packet-type to frame-type and attach to frames; + * 2. side data attached to an AVPacket sent for decoding (same + * considerations as above); + * 3. extracted from the coded bytestream. + * The first two cases are supplied by the caller and typically come from a + * container. + * + * This array configures decoder behaviour in cases when side data of the + * same type is present both in the coded bytestream and in the + * user-supplied side data (items 1. and 2. above). In all cases, at most + * one instance of each side data type will be attached to output frames. By + * default it will be the bytestream side data. Adding an + * AVPacketSideDataType value to this array will flip the preference for + * this type, thus making the decoder prefer user-supplied side data over + * bytestream. In case side data of the same type is present both in + * coded_data and attacked to a packet, the packet instance always has + * priority. + * + * The array may also contain a single -1, in which case the preference is + * switched for all side data types. + */ + int *side_data_prefer_packet; + /** + * Number of entries in side_data_prefer_packet. + */ + unsigned nb_side_data_prefer_packet; + + /** + * Array containing static side data, such as HDR10 CLL / MDCV structures. + * Side data entries should be allocated by usage of helpers defined in + * libavutil/frame.h. + * + * - encoding: may be set by user before calling avcodec_open2() for + * encoder configuration. Afterwards owned and freed by the + * encoder. + * - decoding: unused + */ + AVFrameSideData **decoded_side_data; + int nb_decoded_side_data; } AVCodecContext; /** @@ -2101,120 +2119,6 @@ typedef struct AVHWAccel { * 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. - * - * @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; - - /** - * 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; /** @@ -2253,6 +2157,22 @@ typedef struct AVHWAccel { */ #define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) +/** + * Some hardware decoders (namely nvdec) can either output direct decoder + * surfaces, or make an on-device copy and return said copy. + * There is a hard limit on how many decoder surfaces there can be, and it + * cannot be accurately guessed ahead of time. + * For some processing chains, this can be okay, but others will run into the + * limit and in turn produce very confusing errors that require fine tuning of + * more or less obscure options by the user, or in extreme cases cannot be + * resolved at all without inserting an avfilter that forces a copy. + * + * Thus, the hwaccel will by default make a copy for safety and resilience. + * If a users really wants to minimize the amount of copies, they can set this + * flag and ensure their processing chain does not exhaust the surface pool. + */ +#define AV_HWACCEL_FLAG_UNSAFE_OUTPUT (1 << 3) + /** * @} */ @@ -2291,6 +2211,7 @@ typedef struct AVSubtitleRect { uint8_t *data[4]; int linesize[4]; + int flags; enum AVSubtitleType type; char *text; ///< 0 terminated plain UTF-8 text @@ -2301,8 +2222,6 @@ typedef struct AVSubtitleRect { * struct. */ char *ass; - - int flags; } AVSubtitleRect; typedef struct AVSubtitle { @@ -2358,14 +2277,6 @@ void avcodec_free_context(AVCodecContext **avctx); */ const AVClass *avcodec_get_class(void); -#if FF_API_GET_FRAME_CLASS -/** - * @deprecated This function should not be used. - */ -attribute_deprecated -const AVClass *avcodec_get_frame_class(void); -#endif - /** * Get the AVClass for AVSubtitleRect. It can be used in combination with * AV_OPT_SEARCH_FAKE_OBJ for examining options. @@ -2381,7 +2292,7 @@ const AVClass *avcodec_get_subtitle_rect_class(void); * * @return >= 0 on success, a negative AVERROR code on failure */ -int avcodec_parameters_from_context(AVCodecParameters *par, +int avcodec_parameters_from_context(struct AVCodecParameters *par, const AVCodecContext *codec); /** @@ -2393,7 +2304,7 @@ int avcodec_parameters_from_context(AVCodecParameters *par, * @return >= 0 on success, a negative AVERROR code on failure. */ int avcodec_parameters_to_context(AVCodecContext *codec, - const AVCodecParameters *par); + const struct AVCodecParameters *par); /** * Initialize the AVCodecContext to use the given AVCodec. Prior to using this @@ -2403,9 +2314,16 @@ int avcodec_parameters_to_context(AVCodecContext *codec, * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for * retrieving a codec. * - * @note Always call this function before using decoding routines (such as - * @ref avcodec_receive_frame()). + * Depending on the codec, you might need to set options in the codec context + * also for decoding (e.g. width, height, or the pixel or audio sample format in + * the case the information is not available in the bitstream, as when decoding + * raw audio or video). * + * Options in the codec context can be set either by setting them in the options + * AVDictionary, or by setting the values in the context itself, directly or by + * using the av_opt_set() API before calling this function. + * + * Example: * @code * av_dict_set(&opts, "b", "2.5M", 0); * codec = avcodec_find_decoder(AV_CODEC_ID_H264); @@ -2418,20 +2336,40 @@ int avcodec_parameters_to_context(AVCodecContext *codec, * exit(1); * @endcode * + * In the case AVCodecParameters are available (e.g. when demuxing a stream + * using libavformat, and accessing the AVStream contained in the demuxer), the + * codec parameters can be copied to the codec context using + * avcodec_parameters_to_context(), as in the following example: + * + * @code + * AVStream *stream = ...; + * context = avcodec_alloc_context3(codec); + * if (avcodec_parameters_to_context(context, stream->codecpar) < 0) + * exit(1); + * if (avcodec_open2(context, codec, NULL) < 0) + * exit(1); + * @endcode + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * * @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. + * @param options A dictionary filled with AVCodecContext and codec-private + * options, which are set on top of the options already set in + * avctx, can be NULL. On return this object will be filled with + * options that were not found in the avctx codec context. * * @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(). + * av_dict_set(), av_opt_set(), av_opt_find(), avcodec_parameters_to_context() */ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); +#if FF_API_AVCODEC_CLOSE /** * Close a given AVCodecContext and free all the data associated with it * (but not the AVCodecContext itself). @@ -2440,12 +2378,14 @@ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **op * 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 + * @deprecated 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. */ +attribute_deprecated int avcodec_close(AVCodecContext *avctx); +#endif /** * Free all allocated data in the given subtitle struct. @@ -2496,34 +2436,6 @@ void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int linesize_align[AV_NUM_DATA_POINTERS]); -#ifdef FF_API_AVCODEC_CHROMA_POS -/** - * 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 - * @deprecated Use av_chroma_location_enum_to_pos() instead. - */ - attribute_deprecated -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 - * @deprecated Use av_chroma_location_pos_to_enum() instead. - */ - attribute_deprecated -enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); -#endif - /** * Decode a subtitle message. * Return a negative value on error, otherwise return the number of bytes used. @@ -2552,8 +2464,7 @@ enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); * @param[in] avpkt The input AVPacket containing the input buffer. */ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, - int *got_sub_ptr, - AVPacket *avpkt); + int *got_sub_ptr, const AVPacket *avpkt); /** * Supply raw packet data as input to a decoder. @@ -2589,23 +2500,23 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, * 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 + * @retval 0 success + * @retval 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). + * @retval 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) + * @retval AVERROR(EINVAL) codec not opened, it is an encoder, or requires flush + * @retval AVERROR(ENOMEM) failed to add packet to internal queue, or similar + * @retval "another negative error code" legitimate decoding errors */ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); /** * Return decoded output data from a decoder or encoder (when the - * AV_CODEC_FLAG_RECON_FRAME flag is used). + * @ref AV_CODEC_FLAG_RECON_FRAME flag is used). * * @param avctx codec context * @param frame This will be set to a reference-counted video or audio @@ -2613,18 +2524,14 @@ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); * codec. 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 codec has been fully flushed, and there will be - * no more output frames - * AVERROR(EINVAL): codec not opened, or it is an encoder without - * the AV_CODEC_FLAG_RECON_FRAME flag enabled - * 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 + * @retval 0 success, a frame was returned + * @retval AVERROR(EAGAIN) output is not available in this state - user must + * try to send new input + * @retval AVERROR_EOF the codec has been fully flushed, and there will be + * no more output frames + * @retval AVERROR(EINVAL) codec not opened, or it is an encoder without the + * @ref AV_CODEC_FLAG_RECON_FRAME flag enabled + * @retval "other negative error code" legitimate decoding errors */ int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); @@ -2651,16 +2558,16 @@ int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); * 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, it is a decoder, or requires flush - * AVERROR(ENOMEM): failed to add packet to internal queue, or similar - * other errors: legitimate encoding errors + * @retval 0 success + * @retval 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). + * @retval AVERROR_EOF the encoder has been flushed, and no new frames can + * be sent to it + * @retval AVERROR(EINVAL) codec not opened, it is a decoder, or requires flush + * @retval AVERROR(ENOMEM) failed to add packet to internal queue, or similar + * @retval "another negative error code" legitimate encoding errors */ int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); @@ -2671,13 +2578,13 @@ int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); * @param avpkt This will be set to a reference-counted packet allocated by the * encoder. Note that the function will always call * av_packet_unref(avpkt) 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 a decoder - * other errors: legitimate encoding errors + * @retval 0 success + * @retval AVERROR(EAGAIN) output is not available in the current state - user must + * try to send input + * @retval AVERROR_EOF the encoder has been fully flushed, and there will be no + * more output packets + * @retval AVERROR(EINVAL) codec not opened, or it is a decoder + * @retval "another negative error code" legitimate encoding errors */ int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); diff --git a/ThirdParty/ffmpeg/include/libavcodec/avfft.h b/ThirdParty/ffmpeg/include/libavcodec/avfft.h index 0c0f9b8d8..e3a0da1eb 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/avfft.h +++ b/ThirdParty/ffmpeg/include/libavcodec/avfft.h @@ -19,6 +19,10 @@ #ifndef AVCODEC_AVFFT_H #define AVCODEC_AVFFT_H +#include "libavutil/attributes.h" +#include "version_major.h" +#if FF_API_AVFFT + /** * @file * @ingroup lavc_fft @@ -44,26 +48,42 @@ 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 + * @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_FFT */ +attribute_deprecated FFTContext *av_fft_init(int nbits, int inverse); /** * Do the permutation needed BEFORE calling ff_fft_calc(). + * @deprecated without replacement */ +attribute_deprecated 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. + * @deprecated use the av_tx_fn value returned by av_tx_init, which also does permutation */ +attribute_deprecated void av_fft_calc(FFTContext *s, FFTComplex *z); +attribute_deprecated void av_fft_end(FFTContext *s); +/** + * @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_MDCT, + * with a flag of AV_TX_FULL_IMDCT for a replacement to av_imdct_calc. + */ +attribute_deprecated FFTContext *av_mdct_init(int nbits, int inverse, double scale); +attribute_deprecated void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +attribute_deprecated void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +attribute_deprecated void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +attribute_deprecated void av_mdct_end(FFTContext *s); /* Real Discrete Fourier Transform */ @@ -81,9 +101,14 @@ 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 + * + * @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_RDFT */ +attribute_deprecated RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +attribute_deprecated void av_rdft_calc(RDFTContext *s, FFTSample *data); +attribute_deprecated void av_rdft_end(RDFTContext *s); /* Discrete Cosine Transform */ @@ -106,13 +131,19 @@ enum DCTTransformType { * @param type the type of transform * * @note the first element of the input of DST-I is ignored + * + * @deprecated use av_tx_init from libavutil/tx.h with an appropriate type of AV_TX_FLOAT_DCT */ +attribute_deprecated DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +attribute_deprecated void av_dct_calc(DCTContext *s, FFTSample *data); +attribute_deprecated void av_dct_end (DCTContext *s); /** * @} */ +#endif /* FF_API_AVFFT */ #endif /* AVCODEC_AVFFT_H */ diff --git a/ThirdParty/ffmpeg/include/libavcodec/codec.h b/ThirdParty/ffmpeg/include/libavcodec/codec.h index 77a1a3f5a..6f9b42760 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/codec.h +++ b/ThirdParty/ffmpeg/include/libavcodec/codec.h @@ -50,12 +50,6 @@ * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer. */ #define AV_CODEC_CAP_DR1 (1 << 1) -#if FF_API_FLAG_TRUNCATED -/** - * @deprecated Use parsers to always send proper frames. - */ -#define AV_CODEC_CAP_TRUNCATED (1 << 3) -#endif /** * Encoder or decoder requires flushing with NULL input at the end in order to * give the complete and correct output. @@ -86,6 +80,7 @@ */ #define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) +#if FF_API_SUBFRAMES /** * Codec can output multiple frames per AVPacket * Normally demuxers return one frame at a time, demuxers which do not do @@ -98,6 +93,8 @@ * as a last resort. */ #define AV_CODEC_CAP_SUBFRAMES (1 << 8) +#endif + /** * Codec is experimental and is thus avoided in favor of non experimental * encoders @@ -125,9 +122,6 @@ * multithreading-capable external libraries. */ #define AV_CODEC_CAP_OTHER_THREADS (1 << 15) -#if FF_API_AUTO_THREADS -#define AV_CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_OTHER_THREADS -#endif /** * Audio encoder supports receiving a different number of samples in each call. */ @@ -143,17 +137,6 @@ */ #define AV_CODEC_CAP_AVOID_PROBING (1 << 17) -#if FF_API_UNUSED_CODEC_CAPS -/** - * Deprecated and unused. Use AVCodecDescriptor.props instead - */ -#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 -/** - * Deprecated and unused. Use AVCodecDescriptor.props instead - */ -#define AV_CODEC_CAP_LOSSLESS 0x80000000 -#endif - /** * Codec is backed by a hardware implementation. Typically used to * identify a non-hwaccel hardware decoder. For information about hwaccels, use @@ -169,9 +152,9 @@ #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. + * This encoder can reorder user opaque values from input AVFrames and return + * them with corresponding output packets. + * @see AV_CODEC_FLAG_COPY_OPAQUE */ #define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20) @@ -226,15 +209,8 @@ typedef struct AVCodec { 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 -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * @deprecated use ch_layouts instead - */ - attribute_deprecated - const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 -#endif 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} + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {AV_PROFILE_UNKNOWN} /** * Group name of the codec implementation. diff --git a/ThirdParty/ffmpeg/include/libavcodec/codec_desc.h b/ThirdParty/ffmpeg/include/libavcodec/codec_desc.h index 126b52df4..96afd2020 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/codec_desc.h +++ b/ThirdParty/ffmpeg/include/libavcodec/codec_desc.h @@ -60,7 +60,7 @@ typedef struct AVCodecDescriptor { const char *const *mime_types; /** * If non-NULL, an array of profiles recognized for this codec. - * Terminated with FF_PROFILE_UNKNOWN. + * Terminated with AV_PROFILE_UNKNOWN. */ const struct AVProfile *profiles; } AVCodecDescriptor; @@ -90,6 +90,12 @@ typedef struct AVCodecDescriptor { * equal. */ #define AV_CODEC_PROP_REORDER (1 << 3) + +/** + * Video codec supports separate coding of fields in interlaced frames. + */ +#define AV_CODEC_PROP_FIELDS (1 << 4) + /** * Subtitle codec is bitmap based * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. diff --git a/ThirdParty/ffmpeg/include/libavcodec/codec_id.h b/ThirdParty/ffmpeg/include/libavcodec/codec_id.h index 82874daaa..c8dc21da7 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/codec_id.h +++ b/ThirdParty/ffmpeg/include/libavcodec/codec_id.h @@ -253,9 +253,6 @@ enum AVCodecID { AV_CODEC_ID_AVRP, AV_CODEC_ID_012V, AV_CODEC_ID_AVUI, -#if FF_API_AYUV_CODECID - AV_CODEC_ID_AYUV, -#endif AV_CODEC_ID_TARGA_Y216, AV_CODEC_ID_V308, AV_CODEC_ID_V408, @@ -319,6 +316,12 @@ enum AVCodecID { AV_CODEC_ID_RADIANCE_HDR, AV_CODEC_ID_WBMP, AV_CODEC_ID_MEDIA100, + AV_CODEC_ID_VQC, + AV_CODEC_ID_PDV, + AV_CODEC_ID_EVC, + AV_CODEC_ID_RTV1, + AV_CODEC_ID_VMIX, + AV_CODEC_ID_LEAD, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs @@ -412,6 +415,7 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_IMA_CUNNING, AV_CODEC_ID_ADPCM_IMA_MOFLEX, AV_CODEC_ID_ADPCM_IMA_ACORN, + AV_CODEC_ID_ADPCM_XMD, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000, @@ -429,6 +433,8 @@ enum AVCodecID { AV_CODEC_ID_SDX2_DPCM, AV_CODEC_ID_GREMLIN_DPCM, AV_CODEC_ID_DERF_DPCM, + AV_CODEC_ID_WADY_DPCM, + AV_CODEC_ID_CBD2_DPCM, /* audio codecs */ AV_CODEC_ID_MP2 = 0x15000, @@ -532,6 +538,11 @@ enum AVCodecID { AV_CODEC_ID_MISC4, AV_CODEC_ID_APAC, AV_CODEC_ID_FTR, + AV_CODEC_ID_WAVARC, + AV_CODEC_ID_RKA, + AV_CODEC_ID_AC4, + AV_CODEC_ID_OSQ, + AV_CODEC_ID_QOA, /* subtitle codecs */ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. @@ -576,6 +587,7 @@ enum AVCodecID { AV_CODEC_ID_DVD_NAV, AV_CODEC_ID_TIMED_ID3, AV_CODEC_ID_BIN_DATA, + AV_CODEC_ID_SMPTE_2038, AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it @@ -586,6 +598,16 @@ enum AVCodecID { * 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 + /** + * Dummy null video codec, useful mainly for development and debugging. + * Null encoder/decoder discard all input and never return any output. + */ + AV_CODEC_ID_VNULL, + /** + * Dummy null audio codec, useful mainly for development and debugging. + * Null encoder/decoder discard all input and never return any output. + */ + AV_CODEC_ID_ANULL, }; /** diff --git a/ThirdParty/ffmpeg/include/libavcodec/codec_par.h b/ThirdParty/ffmpeg/include/libavcodec/codec_par.h index f51d27c59..f4b9bb5c0 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/codec_par.h +++ b/ThirdParty/ffmpeg/include/libavcodec/codec_par.h @@ -29,21 +29,14 @@ #include "libavutil/pixfmt.h" #include "codec_id.h" +#include "defs.h" +#include "packet.h" /** * @addtogroup lavc_core * @{ */ -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 -}; - /** * This struct describes the properties of an encoded stream. * @@ -79,6 +72,19 @@ typedef struct AVCodecParameters { */ int extradata_size; + /** + * Additional data associated with the entire stream. + * + * Should be allocated with av_packet_side_data_new() or + * av_packet_side_data_add(), and will be freed by avcodec_parameters_free(). + */ + AVPacketSideData *coded_side_data; + + /** + * Amount of entries in @ref coded_side_data. + */ + int nb_coded_side_data; + /** * - video: the pixel format, the value corresponds to enum AVPixelFormat. * - audio: the sample format, the value corresponds to enum AVSampleFormat. @@ -137,6 +143,18 @@ typedef struct AVCodecParameters { */ AVRational sample_aspect_ratio; + /** + * Video only. Number of frames per second, for streams with constant frame + * durations. Should be set to { 0, 1 } when some frames have differing + * durations or if the value is not known. + * + * @note This field correponds to values that are stored in codec-level + * headers and is typically overridden by container/transport-layer + * timestamps, when available. It should thus be used only as a last resort, + * when no higher-level timing information is available. + */ + AVRational framerate; + /** * Video only. The order of the fields in interlaced video. */ @@ -156,22 +174,10 @@ typedef struct AVCodecParameters { */ int video_delay; -#if FF_API_OLD_CHANNEL_LAYOUT /** - * 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. - * @deprecated use ch_layout + * Audio only. The channel layout and number of channels. */ - attribute_deprecated - uint64_t channel_layout; - /** - * Audio only. The number of audio channels. - * @deprecated use ch_layout.nb_channels - */ - attribute_deprecated - int channels; -#endif + AVChannelLayout ch_layout; /** * Audio only. The number of audio samples per second. */ @@ -206,11 +212,6 @@ typedef struct AVCodecParameters { * Audio only. Number of samples to skip after a discontinuity. */ int seek_preroll; - - /** - * Audio only. The channel layout and number of channels. - */ - AVChannelLayout ch_layout; } AVCodecParameters; /** diff --git a/ThirdParty/ffmpeg/include/libavcodec/d3d11va.h b/ThirdParty/ffmpeg/include/libavcodec/d3d11va.h index 6816b6c1e..27f40e551 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/d3d11va.h +++ b/ThirdParty/ffmpeg/include/libavcodec/d3d11va.h @@ -45,9 +45,6 @@ * @{ */ -#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. diff --git a/ThirdParty/ffmpeg/include/libavcodec/defs.h b/ThirdParty/ffmpeg/include/libavcodec/defs.h index fbe3254db..00d840ec1 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/defs.h +++ b/ThirdParty/ffmpeg/include/libavcodec/defs.h @@ -61,6 +61,149 @@ #define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions #define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + +#define AV_PROFILE_UNKNOWN -99 +#define AV_PROFILE_RESERVED -100 + +#define AV_PROFILE_AAC_MAIN 0 +#define AV_PROFILE_AAC_LOW 1 +#define AV_PROFILE_AAC_SSR 2 +#define AV_PROFILE_AAC_LTP 3 +#define AV_PROFILE_AAC_HE 4 +#define AV_PROFILE_AAC_HE_V2 28 +#define AV_PROFILE_AAC_LD 22 +#define AV_PROFILE_AAC_ELD 38 +#define AV_PROFILE_MPEG2_AAC_LOW 128 +#define AV_PROFILE_MPEG2_AAC_HE 131 + +#define AV_PROFILE_DNXHD 0 +#define AV_PROFILE_DNXHR_LB 1 +#define AV_PROFILE_DNXHR_SQ 2 +#define AV_PROFILE_DNXHR_HQ 3 +#define AV_PROFILE_DNXHR_HQX 4 +#define AV_PROFILE_DNXHR_444 5 + +#define AV_PROFILE_DTS 20 +#define AV_PROFILE_DTS_ES 30 +#define AV_PROFILE_DTS_96_24 40 +#define AV_PROFILE_DTS_HD_HRA 50 +#define AV_PROFILE_DTS_HD_MA 60 +#define AV_PROFILE_DTS_EXPRESS 70 +#define AV_PROFILE_DTS_HD_MA_X 61 +#define AV_PROFILE_DTS_HD_MA_X_IMAX 62 + +#define AV_PROFILE_EAC3_DDP_ATMOS 30 + +#define AV_PROFILE_TRUEHD_ATMOS 30 + +#define AV_PROFILE_MPEG2_422 0 +#define AV_PROFILE_MPEG2_HIGH 1 +#define AV_PROFILE_MPEG2_SS 2 +#define AV_PROFILE_MPEG2_SNR_SCALABLE 3 +#define AV_PROFILE_MPEG2_MAIN 4 +#define AV_PROFILE_MPEG2_SIMPLE 5 + +#define AV_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define AV_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define AV_PROFILE_H264_BASELINE 66 +#define AV_PROFILE_H264_CONSTRAINED_BASELINE (66|AV_PROFILE_H264_CONSTRAINED) +#define AV_PROFILE_H264_MAIN 77 +#define AV_PROFILE_H264_EXTENDED 88 +#define AV_PROFILE_H264_HIGH 100 +#define AV_PROFILE_H264_HIGH_10 110 +#define AV_PROFILE_H264_HIGH_10_INTRA (110|AV_PROFILE_H264_INTRA) +#define AV_PROFILE_H264_MULTIVIEW_HIGH 118 +#define AV_PROFILE_H264_HIGH_422 122 +#define AV_PROFILE_H264_HIGH_422_INTRA (122|AV_PROFILE_H264_INTRA) +#define AV_PROFILE_H264_STEREO_HIGH 128 +#define AV_PROFILE_H264_HIGH_444 144 +#define AV_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define AV_PROFILE_H264_HIGH_444_INTRA (244|AV_PROFILE_H264_INTRA) +#define AV_PROFILE_H264_CAVLC_444 44 + +#define AV_PROFILE_VC1_SIMPLE 0 +#define AV_PROFILE_VC1_MAIN 1 +#define AV_PROFILE_VC1_COMPLEX 2 +#define AV_PROFILE_VC1_ADVANCED 3 + +#define AV_PROFILE_MPEG4_SIMPLE 0 +#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define AV_PROFILE_MPEG4_CORE 2 +#define AV_PROFILE_MPEG4_MAIN 3 +#define AV_PROFILE_MPEG4_N_BIT 4 +#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define AV_PROFILE_MPEG4_HYBRID 8 +#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define AV_PROFILE_MPEG4_CORE_SCALABLE 10 +#define AV_PROFILE_MPEG4_ADVANCED_CODING 11 +#define AV_PROFILE_MPEG4_ADVANCED_CORE 12 +#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define AV_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define AV_PROFILE_JPEG2000_DCINEMA_2K 3 +#define AV_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define AV_PROFILE_VP9_0 0 +#define AV_PROFILE_VP9_1 1 +#define AV_PROFILE_VP9_2 2 +#define AV_PROFILE_VP9_3 3 + +#define AV_PROFILE_HEVC_MAIN 1 +#define AV_PROFILE_HEVC_MAIN_10 2 +#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define AV_PROFILE_HEVC_REXT 4 +#define AV_PROFILE_HEVC_SCC 9 + +#define AV_PROFILE_VVC_MAIN_10 1 +#define AV_PROFILE_VVC_MAIN_10_444 33 + +#define AV_PROFILE_AV1_MAIN 0 +#define AV_PROFILE_AV1_HIGH 1 +#define AV_PROFILE_AV1_PROFESSIONAL 2 + +#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define AV_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define AV_PROFILE_SBC_MSBC 1 + +#define AV_PROFILE_PRORES_PROXY 0 +#define AV_PROFILE_PRORES_LT 1 +#define AV_PROFILE_PRORES_STANDARD 2 +#define AV_PROFILE_PRORES_HQ 3 +#define AV_PROFILE_PRORES_4444 4 +#define AV_PROFILE_PRORES_XQ 5 + +#define AV_PROFILE_ARIB_PROFILE_A 0 +#define AV_PROFILE_ARIB_PROFILE_C 1 + +#define AV_PROFILE_KLVA_SYNC 0 +#define AV_PROFILE_KLVA_ASYNC 1 + +#define AV_PROFILE_EVC_BASELINE 0 +#define AV_PROFILE_EVC_MAIN 1 + + +#define AV_LEVEL_UNKNOWN -99 + +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 +}; + /** * @ingroup lavc_decoding */ diff --git a/ThirdParty/ffmpeg/include/libavcodec/dirac.h b/ThirdParty/ffmpeg/include/libavcodec/dirac.h index e6d9d346d..8c348cdc0 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/dirac.h +++ b/ThirdParty/ffmpeg/include/libavcodec/dirac.h @@ -31,7 +31,11 @@ * @author Jordi Ortiz */ -#include "avcodec.h" +#include +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" /** * The spec limits the number of wavelet decompositions to 4 for both diff --git a/ThirdParty/ffmpeg/include/libavcodec/dxva2.h b/ThirdParty/ffmpeg/include/libavcodec/dxva2.h index 22c93992f..bdec6112e 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/dxva2.h +++ b/ThirdParty/ffmpeg/include/libavcodec/dxva2.h @@ -45,9 +45,6 @@ * @{ */ -#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. diff --git a/ThirdParty/ffmpeg/include/libavcodec/jni.h b/ThirdParty/ffmpeg/include/libavcodec/jni.h index dd99e9261..955cd2809 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/jni.h +++ b/ThirdParty/ffmpeg/include/libavcodec/jni.h @@ -43,4 +43,25 @@ int av_jni_set_java_vm(void *vm, void *log_ctx); */ void *av_jni_get_java_vm(void *log_ctx); +/* + * Set the Android application context which will be used to retrieve the Android + * content resolver to handle content uris. + * + * This function is only available on Android. + * + * @param app_ctx global JNI reference to the Android application context + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_android_app_ctx(void *app_ctx, void *log_ctx); + +/* + * Get the Android application context that has been set with + * av_jni_set_android_app_ctx. + * + * This function is only available on Android. + * + * @return a pointer the the Android application context + */ +void *av_jni_get_android_app_ctx(void); + #endif /* AVCODEC_JNI_H */ diff --git a/ThirdParty/ffmpeg/include/libavcodec/packet.h b/ThirdParty/ffmpeg/include/libavcodec/packet.h index 404d52007..b0ba3baea 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/packet.h +++ b/ThirdParty/ffmpeg/include/libavcodec/packet.h @@ -33,9 +33,9 @@ #include "libavcodec/version_major.h" /** - * @defgroup lavc_packet AVPacket + * @defgroup lavc_packet_side_data AVPacketSideData * - * Types and functions for working with AVPacket. + * Types and functions for working with AVPacketSideData. * @{ */ enum AVPacketSideDataType { @@ -161,7 +161,7 @@ enum AVPacketSideDataType { * 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) + * u8 selected channels (0=main/left, 1=sub/right, 2=both) * @endcode */ AV_PKT_DATA_JP_DUALMONO, @@ -299,6 +299,37 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_DYNAMIC_HDR10_PLUS, + /** + * IAMF Mix Gain Parameter Data associated with the audio frame. This metadata + * is in the form of the AVIAMFParamDefinition struct and contains information + * defined in sections 3.6.1 and 3.8.1 of the Immersive Audio Model and + * Formats standard. + */ + AV_PKT_DATA_IAMF_MIX_GAIN_PARAM, + + /** + * IAMF Demixing Info Parameter Data associated with the audio frame. This + * metadata is in the form of the AVIAMFParamDefinition struct and contains + * information defined in sections 3.6.1 and 3.8.2 of the Immersive Audio Model + * and Formats standard. + */ + AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM, + + /** + * IAMF Recon Gain Info Parameter Data associated with the audio frame. This + * metadata is in the form of the AVIAMFParamDefinition struct and contains + * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio Model + * and Formats standard. + */ + AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM, + + /** + * Ambient viewing environment metadata, as defined by H.274. This metadata + * should be associated with a video stream and contains data in the form + * of the AVAmbientViewingEnvironment struct. + */ + AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT, + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may @@ -312,12 +343,129 @@ enum AVPacketSideDataType { #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED +/** + * This structure stores auxiliary information for decoding, presenting, or + * otherwise processing the coded stream. It is typically exported by demuxers + * and encoders and can be fed to decoders and muxers either in a per packet + * basis, or as global side data (applying to the entire coded stream). + * + * Global side data is handled as follows: + * - During demuxing, it may be exported through + * @ref AVStream.codecpar.side_data "AVStream's codec parameters", which can + * then be passed as input to decoders through the + * @ref AVCodecContext.coded_side_data "decoder context's side data", for + * initialization. + * - For muxing, it can be fed through @ref AVStream.codecpar.side_data + * "AVStream's codec parameters", typically the output of encoders through + * the @ref AVCodecContext.coded_side_data "encoder context's side data", for + * initialization. + * + * Packet specific side data is handled as follows: + * - During demuxing, it may be exported through @ref AVPacket.side_data + * "AVPacket's side data", which can then be passed as input to decoders. + * - For muxing, it can be fed through @ref AVPacket.side_data "AVPacket's + * side data", typically the output of encoders. + * + * Different modules may accept or export different types of side data + * depending on media type and codec. Refer to @ref AVPacketSideDataType for a + * list of defined types and where they may be found or used. + */ typedef struct AVPacketSideData { uint8_t *data; size_t size; enum AVPacketSideDataType type; } AVPacketSideData; +/** + * Allocate a new packet side data. + * + * @param sd pointer to an array of side data to which the side data should + * be added. *sd may be NULL, in which case the array will be + * initialized. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. The integer value will be increased by 1 on success. + * @param type side data type + * @param size desired side data size + * @param flags currently unused. Must be zero + * + * @return pointer to freshly allocated side data on success, or NULL otherwise. + */ +AVPacketSideData *av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, + enum AVPacketSideDataType type, + size_t size, int flags); + +/** + * Wrap existing data as packet side data. + * + * @param sd pointer to an array of side data to which the side data should + * be added. *sd may be NULL, in which case the array will be + * initialized + * @param nb_sd pointer to an integer containing the number of entries in + * the array. The integer value will be increased by 1 on success. + * @param type side data type + * @param data a data array. It must be allocated with the av_malloc() family + * of functions. The ownership of the data is transferred to the + * side data array on success + * @param size size of the data array + * @param flags currently unused. Must be zero + * + * @return pointer to freshly allocated side data on success, or NULL otherwise + * On failure, the side data array is unchanged and the data remains + * owned by the caller. + */ +AVPacketSideData *av_packet_side_data_add(AVPacketSideData **sd, int *nb_sd, + enum AVPacketSideDataType type, + void *data, size_t size, int flags); + +/** + * Get side information from a side data array. + * + * @param sd the array from which the side data should be fetched + * @param nb_sd value containing the number of entries in the array. + * @param type desired side information type + * + * @return pointer to side data if present or NULL otherwise + */ +const AVPacketSideData *av_packet_side_data_get(const AVPacketSideData *sd, + int nb_sd, + enum AVPacketSideDataType type); + +/** + * Remove side data of the given type from a side data array. + * + * @param sd the array from which the side data should be removed + * @param nb_sd pointer to an integer containing the number of entries in + * the array. Will be reduced by the amount of entries removed + * upon return + * @param type side information type + */ +void av_packet_side_data_remove(AVPacketSideData *sd, int *nb_sd, + enum AVPacketSideDataType type); + +/** + * Convenience function to free all the side data stored in an array, and + * the array itself. + * + * @param sd pointer to array of side data to free. Will be set to NULL + * upon return. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. Will be set to 0 upon return. + */ +void av_packet_side_data_free(AVPacketSideData **sd, int *nb_sd); + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * @} + */ + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ + /** * 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 @@ -448,13 +596,6 @@ typedef struct AVPacketList { #define AV_PKT_FLAG_DISPOSABLE 0x0010 enum AVSideDataParamChangeFlags { -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * @deprecated those are not used by any decoder - */ - AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, - AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, -#endif AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, }; @@ -603,8 +744,6 @@ int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size); -const char *av_packet_side_data_name(enum AVPacketSideDataType type); - /** * Pack a dictionary for use in side_data. * diff --git a/ThirdParty/ffmpeg/include/libavcodec/vdpau.h b/ThirdParty/ffmpeg/include/libavcodec/vdpau.h index 35c4b1096..8021c2576 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/vdpau.h +++ b/ThirdParty/ffmpeg/include/libavcodec/vdpau.h @@ -66,16 +66,14 @@ typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, /** * 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 + * This structure will be allocated and stored in AVCodecContext.hwaccel_context + * by av_vdpau_bind_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. + * be used outside of libavcodec. */ typedef struct AVVDPAUContext { /** @@ -95,15 +93,27 @@ typedef struct AVVDPAUContext { AVVDPAU_Render2 render2; } AVVDPAUContext; +#if FF_API_VDPAU_ALLOC_GET_SET /** * @brief allocation function for AVVDPAUContext * * Allows extending the struct without breaking API/ABI + * @deprecated use av_vdpau_bind_context() instead */ +attribute_deprecated AVVDPAUContext *av_alloc_vdpaucontext(void); +/** + * @deprecated render2 is public and can be accessed directly + */ +attribute_deprecated AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +/** + * @deprecated render2 is public and can be accessed directly + */ +attribute_deprecated void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); +#endif /** * Associate a VDPAU device with a codec context for hardware acceleration. @@ -145,12 +155,16 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, uint32_t *width, uint32_t *height); +#if FF_API_VDPAU_ALLOC_GET_SET /** * Allocate an AVVDPAUContext. * * @return Newly-allocated AVVDPAUContext or NULL on failure. + * @deprecated use av_vdpau_bind_context() instead */ +attribute_deprecated AVVDPAUContext *av_vdpau_alloc_context(void); +#endif /** @} */ diff --git a/ThirdParty/ffmpeg/include/libavcodec/version.h b/ThirdParty/ffmpeg/include/libavcodec/version.h index 2206401aa..43794ea58 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/version.h +++ b/ThirdParty/ffmpeg/include/libavcodec/version.h @@ -29,8 +29,8 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 50 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 3 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/ThirdParty/ffmpeg/include/libavcodec/version_major.h b/ThirdParty/ffmpeg/include/libavcodec/version_major.h index 12f863deb..ab1f4511b 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/version_major.h +++ b/ThirdParty/ffmpeg/include/libavcodec/version_major.h @@ -25,7 +25,7 @@ * Libavcodec version macros. */ -#define LIBAVCODEC_VERSION_MAJOR 59 +#define LIBAVCODEC_VERSION_MAJOR 61 /** * FF_API_* defines may be placed below to indicate public API that will be @@ -37,21 +37,15 @@ * at once through the bump. This improves the git bisect-ability of the change. */ -#define FF_API_OPENH264_SLICE_MODE (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_OPENH264_CABAC (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_UNUSED_CODEC_CAPS (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_THREAD_SAFE_CALLBACKS (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_GET_FRAME_CLASS (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_AUTO_THREADS (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_FLAG_TRUNCATED (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_SUB_TEXT_FORMAT (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_SVTAV1_OPTS (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_AYUV_CODECID (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_VT_OUTPUT_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 60) -#define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 60) +#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_SUBFRAMES (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_TICKS_PER_FRAME (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_DROPCHANGED (LIBAVCODEC_VERSION_MAJOR < 62) + +#define FF_API_AVFFT (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_FF_PROFILE_LEVEL (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_AVCODEC_CLOSE (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_BUFFER_MIN_SIZE (LIBAVCODEC_VERSION_MAJOR < 62) +#define FF_API_VDPAU_ALLOC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 62) #endif /* AVCODEC_VERSION_MAJOR_H */ diff --git a/ThirdParty/ffmpeg/include/libavcodec/videotoolbox.h b/ThirdParty/ffmpeg/include/libavcodec/videotoolbox.h index 25a747a49..d68d76e40 100644 --- a/ThirdParty/ffmpeg/include/libavcodec/videotoolbox.h +++ b/ThirdParty/ffmpeg/include/libavcodec/videotoolbox.h @@ -57,19 +57,9 @@ typedef struct AVVideotoolboxContext { /** * Videotoolbox decompression session object. - * Created and freed the caller. */ VTDecompressionSessionRef session; -#if FF_API_VT_OUTPUT_CALLBACK - /** - * The output callback that must be passed to the session. - * Set by av_videottoolbox_default_init() - */ - attribute_deprecated - VTDecompressionOutputCallback output_callback; -#endif - /** * 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 @@ -79,61 +69,15 @@ typedef struct AVVideotoolboxContext { /** * 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); - /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavformat/avformat.h b/ThirdParty/ffmpeg/include/libavformat/avformat.h index 1d97d56ac..de4039767 100644 --- a/ThirdParty/ffmpeg/include/libavformat/avformat.h +++ b/ThirdParty/ffmpeg/include/libavformat/avformat.h @@ -307,10 +307,8 @@ * @} */ -#include #include /* FILE */ -#include "libavcodec/codec.h" #include "libavcodec/codec_par.h" #include "libavcodec/defs.h" #include "libavcodec/packet.h" @@ -325,13 +323,13 @@ * to avoid unnecessary rebuilds. When included externally, keep including * the full version information. */ #include "libavformat/version.h" + +#include "libavutil/frame.h" +#include "libavcodec/codec.h" #endif struct AVFormatContext; -struct AVStream; - -struct AVDeviceInfoList; -struct AVDeviceCapabilitiesQuery; +struct AVFrame; /** * @defgroup metadata_api Public Metadata API @@ -487,7 +485,9 @@ typedef struct AVProbeData { #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. */ +#if FF_API_ALLOW_FLUSH +#define AVFMT_ALLOW_FLUSH 0x10000 /**< @deprecated: Just send a NULL packet if you want to flush a muxer. */ +#endif #define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly increasing timestamps, but they must still be monotonic */ @@ -523,7 +523,7 @@ typedef struct AVOutputFormat { /** * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, - * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE */ int flags; @@ -536,114 +536,6 @@ typedef struct AVOutputFormat { 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. - ***************************************************************** - */ - /** - * size of private data so that it can be allocated in the wrapper - */ - int priv_data_size; - - /** - * Internal flags. See FF_FMT_FLAG_* in internal.h. - */ - int flags_internal; - - 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 *); - /** - * A format-specific function for interleavement. - * If unset, packets will be interleaved by dts. - * - * @param s An AVFormatContext for output. pkt will be added to - * resp. taken from its packet buffer. - * @param[in,out] pkt A packet to be interleaved if has_packet is set; - * also used to return packets. If no packet is returned - * (e.g. on error), pkt is blank on return. - * @param flush 1 if no further packets are available as input and - * all remaining packets should be output. - * @param has_packet If set, pkt contains a packet to be interleaved - * on input; otherwise pkt is blank on input. - * @return 1 if a packet was output, 0 if no packet could be output, - * < 0 if an error occurred - */ - int (*interleave_packet)(struct AVFormatContext *s, AVPacket *pkt, - int flush, int has_packet); - /** - * 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); - 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. - * - * @note pkt might have been directly forwarded by a meta-muxer; therefore - * pkt->stream_index as well as the pkt's timebase might be invalid. - * Return 0 if more packets from this stream must be checked; 1 if not. - */ - int (*check_bitstream)(struct AVFormatContext *s, struct AVStream *st, - const AVPacket *pkt); } AVOutputFormat; /** * @} @@ -691,103 +583,6 @@ typedef struct AVInputFormat { * @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. - ***************************************************************** - */ - /** - * 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; - - /** - * Internal flags. See FF_FMT_FLAG_* in internal.h. - */ - int flags_internal; - - /** - * 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. - * Upon returning an error, pkt must be unreferenced by the caller. - */ - 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); - } AVInputFormat; /** * @} @@ -909,9 +704,9 @@ typedef struct AVIndexEntry { */ #define AV_DISPOSITION_METADATA (1 << 18) /** - * The audio stream is intended to be mixed with another stream before - * presentation. - * Corresponds to mix_type=0 in mpegts. + * The stream is intended to be mixed with another stream before presentation. + * Used for example to signal the stream contains an image part of a HEIF grid, + * or for mix_type=0 in mpegts. */ #define AV_DISPOSITION_DEPENDENT (1 << 19) /** @@ -948,12 +743,10 @@ const char *av_disposition_to_string(int disposition); * sizeof(AVStream) must not be used outside libav*. */ typedef struct AVStream { -#if FF_API_AVSTREAM_CLASS /** * A class for @ref avoptions. Set on stream creation. */ const AVClass *av_class; -#endif int index; /**< stream index in AVFormatContext */ /** @@ -963,6 +756,17 @@ typedef struct AVStream { */ int id; + /** + * 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; + void *priv_data; /** @@ -1038,6 +842,7 @@ typedef struct AVStream { */ AVPacket attached_pic; +#if FF_API_AVSTREAM_SIDE_DATA /** * An array of side data that applies to the whole stream (i.e. the * container does not allow it to change between packets). @@ -1054,13 +859,20 @@ typedef struct AVStream { * * Freed by libavformat in avformat_free_context(). * - * @see av_format_inject_global_side_data() + * @deprecated use AVStream's @ref AVCodecParameters.coded_side_data + * "codecpar side data". */ + attribute_deprecated AVPacketSideData *side_data; /** * The number of elements in the AVStream.side_data array. + * + * @deprecated use AVStream's @ref AVCodecParameters.nb_coded_side_data + * "codecpar side data". */ + attribute_deprecated int nb_side_data; +#endif /** * Flags indicating events happening on the stream, a combination of @@ -1098,17 +910,6 @@ typedef struct AVStream { */ AVRational r_frame_rate; - /** - * 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; - /** * Number of bits in timestamps. Used for wrapping control. * @@ -1119,17 +920,255 @@ typedef struct AVStream { int pts_wrap_bits; } AVStream; -struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); - -#if FF_API_GET_END_PTS /** - * Returns the pts of the last muxed packet + its duration + * AVStreamGroupTileGrid holds information on how to combine several + * independent images on a single canvas for presentation. * - * the retuned value is undefined when used with a demuxer. + * The output should be a @ref AVStreamGroupTileGrid.background "background" + * colored @ref AVStreamGroupTileGrid.coded_width "coded_width" x + * @ref AVStreamGroupTileGrid.coded_height "coded_height" canvas where a + * @ref AVStreamGroupTileGrid.nb_tiles "nb_tiles" amount of tiles are placed in + * the order they appear in the @ref AVStreamGroupTileGrid.offsets "offsets" + * array, at the exact offset described for them. In particular, if two or more + * tiles overlap, the image with higher index in the + * @ref AVStreamGroupTileGrid.offsets "offsets" array takes priority. + * Note that a single image may be used multiple times, i.e. multiple entries + * in @ref AVStreamGroupTileGrid.offsets "offsets" may have the same value of + * idx. + * + * The following is an example of a simple grid with 3 rows and 4 columns: + * + * +---+---+---+---+ + * | 0 | 1 | 2 | 3 | + * +---+---+---+---+ + * | 4 | 5 | 6 | 7 | + * +---+---+---+---+ + * | 8 | 9 |10 |11 | + * +---+---+---+---+ + * + * Assuming all tiles have a dimension of 512x512, the + * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of + * the first @ref AVStreamGroup.streams "stream" in the group is "0,0", the + * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of + * the second @ref AVStreamGroup.streams "stream" in the group is "512,0", the + * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of + * the fifth @ref AVStreamGroup.streams "stream" in the group is "0,512", the + * @ref AVStreamGroupTileGrid.offsets "offset", of the topleft pixel of + * the sixth @ref AVStreamGroup.streams "stream" in the group is "512,512", + * etc. + * + * The following is an example of a canvas with overlaping tiles: + * + * +-----------+ + * | %%%%% | + * |***%%3%%@@@| + * |**0%%%%%2@@| + * |***##1@@@@@| + * | ##### | + * +-----------+ + * + * Assuming a canvas with size 1024x1024 and all tiles with a dimension of + * 512x512, a possible @ref AVStreamGroupTileGrid.offsets "offset" for the + * topleft pixel of the first @ref AVStreamGroup.streams "stream" in the group + * would be 0x256, the @ref AVStreamGroupTileGrid.offsets "offset" for the + * topleft pixel of the second @ref AVStreamGroup.streams "stream" in the group + * would be 256x512, the @ref AVStreamGroupTileGrid.offsets "offset" for the + * topleft pixel of the third @ref AVStreamGroup.streams "stream" in the group + * would be 512x256, and the @ref AVStreamGroupTileGrid.offsets "offset" for + * the topleft pixel of the fourth @ref AVStreamGroup.streams "stream" in the + * group would be 256x0. + * + * sizeof(AVStreamGroupTileGrid) is not a part of the ABI and may only be + * allocated by avformat_stream_group_create(). */ -attribute_deprecated -int64_t av_stream_get_end_pts(const AVStream *st); -#endif +typedef struct AVStreamGroupTileGrid { + const AVClass *av_class; + + /** + * Amount of tiles in the grid. + * + * Must be > 0. + */ + unsigned int nb_tiles; + + /** + * Width of the canvas. + * + * Must be > 0. + */ + int coded_width; + /** + * Width of the canvas. + * + * Must be > 0. + */ + int coded_height; + + /** + * An @ref nb_tiles sized array of offsets in pixels from the topleft edge + * of the canvas, indicating where each stream should be placed. + * It must be allocated with the av_malloc() family of functions. + * + * - demuxing: set by libavformat, must not be modified by the caller. + * - muxing: set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + struct { + /** + * Index of the stream in the group this tile references. + * + * Must be < @ref AVStreamGroup.nb_streams "nb_streams". + */ + unsigned int idx; + /** + * Offset in pixels from the left edge of the canvas where the tile + * should be placed. + */ + int horizontal; + /** + * Offset in pixels from the top edge of the canvas where the tile + * should be placed. + */ + int vertical; + } *offsets; + + /** + * The pixel value per channel in RGBA format used if no pixel of any tile + * is located at a particular pixel location. + * + * @see av_image_fill_color(). + * @see av_parse_color(). + */ + uint8_t background[4]; + + /** + * Offset in pixels from the left edge of the canvas where the actual image + * meant for presentation starts. + * + * This field must be >= 0 and < @ref coded_width. + */ + int horizontal_offset; + /** + * Offset in pixels from the top edge of the canvas where the actual image + * meant for presentation starts. + * + * This field must be >= 0 and < @ref coded_height. + */ + int vertical_offset; + + /** + * Width of the final image for presentation. + * + * Must be > 0 and <= (@ref coded_width - @ref horizontal_offset). + * When it's not equal to (@ref coded_width - @ref horizontal_offset), the + * result of (@ref coded_width - width - @ref horizontal_offset) is the + * amount amount of pixels to be cropped from the right edge of the + * final image before presentation. + */ + int width; + /** + * Height of the final image for presentation. + * + * Must be > 0 and <= (@ref coded_height - @ref vertical_offset). + * When it's not equal to (@ref coded_height - @ref vertical_offset), the + * result of (@ref coded_height - height - @ref vertical_offset) is the + * amount amount of pixels to be cropped from the bottom edge of the + * final image before presentation. + */ + int height; +} AVStreamGroupTileGrid; + +enum AVStreamGroupParamsType { + AV_STREAM_GROUP_PARAMS_NONE, + AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT, + AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION, + AV_STREAM_GROUP_PARAMS_TILE_GRID, +}; + +struct AVIAMFAudioElement; +struct AVIAMFMixPresentation; + +typedef struct AVStreamGroup { + /** + * A class for @ref avoptions. Set by avformat_stream_group_create(). + */ + const AVClass *av_class; + + void *priv_data; + + /** + * Group index in AVFormatContext. + */ + unsigned int index; + + /** + * Group type-specific group ID. + * + * decoding: set by libavformat + * encoding: may set by the user + */ + int64_t id; + + /** + * Group type + * + * decoding: set by libavformat on group creation + * encoding: set by avformat_stream_group_create() + */ + enum AVStreamGroupParamsType type; + + /** + * Group type-specific parameters + */ + union { + struct AVIAMFAudioElement *iamf_audio_element; + struct AVIAMFMixPresentation *iamf_mix_presentation; + struct AVStreamGroupTileGrid *tile_grid; + } params; + + /** + * Metadata that applies to the whole group. + * + * - demuxing: set by libavformat on group creation + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Number of elements in AVStreamGroup.streams. + * + * Set by avformat_stream_group_add_stream() must not be modified by any other code. + */ + unsigned int nb_streams; + + /** + * A list of streams in the group. New entries are created with + * avformat_stream_group_add_stream(). + * + * - demuxing: entries are created by libavformat on group creation. + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new entries may also + * appear in av_read_frame(). + * - muxing: entries are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + + /** + * Stream group disposition - a combination of AV_DISPOSITION_* flags. + * This field currently applies to all defined AVStreamGroupParamsType. + * + * - demuxing: set by libavformat when creating the group or in + * avformat_find_stream_info(). + * - muxing: may be set by the caller before avformat_write_header(). + */ + int disposition; +} AVStreamGroup; + +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); #define AV_PROGRAM_RUNNING 1 @@ -1285,6 +1324,39 @@ typedef struct AVFormatContext { */ AVStream **streams; + /** + * Number of elements in AVFormatContext.stream_groups. + * + * Set by avformat_stream_group_create(), must not be modified by any other code. + */ + unsigned int nb_stream_groups; + /** + * A list of all stream groups in the file. New groups are created with + * avformat_stream_group_create(), and filled with avformat_stream_group_add_stream(). + * + * - demuxing: groups may be created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new groups may also + * appear in av_read_frame(). + * - muxing: groups may be created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStreamGroup **stream_groups; + + /** + * 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; + /** * input or output URL. Unlike the old filename field, this field has no * length restriction. @@ -1352,11 +1424,10 @@ typedef struct AVFormatContext { */ #define AVFMT_FLAG_BITEXACT 0x0400 #define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) -#if FF_API_LAVF_PRIV_OPT -#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (deprecated, does nothing) -#endif #define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#if FF_API_LAVF_SHORTEST #define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#endif #define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer /** @@ -1405,36 +1476,10 @@ typedef struct AVFormatContext { 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 + * Forced Data codec_id. + * 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; + enum AVCodecID data_codec_id; /** * Metadata that applies to the whole file. @@ -1490,6 +1535,31 @@ typedef struct AVFormatContext { int debug; #define FF_FDEBUG_TS 0x0001 + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; + + /** + * 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; + /** * Maximum buffering duration for interleaving. * @@ -1508,6 +1578,35 @@ typedef struct AVFormatContext { */ int64_t max_interleave_delta; + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * 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; + + /** + * Maximum number of packets that can be probed + * - encoding: unused + * - decoding: set by user + */ + int max_probe_packets; + /** * Allow non-standard and experimental extension * @see AVCodecContext.strict_std_compliance @@ -1534,11 +1633,6 @@ typedef struct AVFormatContext { */ #define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 - /** - * Maximum number of packets to read while waiting for the first timestamp. - * Decoding only. - */ - int max_ts_probe; /** * Avoid negative timestamps during muxing. @@ -1553,12 +1647,6 @@ typedef struct AVFormatContext { #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. @@ -1567,22 +1655,6 @@ typedef struct AVFormatContext { */ 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. @@ -1591,6 +1663,13 @@ typedef struct AVFormatContext { */ int use_wallclock_as_timestamps; + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; + /** * avio flags, used to force AVIO_FLAG_DIRECT. * - encoding: unused @@ -1670,6 +1749,20 @@ typedef struct AVFormatContext { */ char *format_whitelist; + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + /** * IO repositioned flag. * This is set by avformat when the underlaying IO context read pointer @@ -1684,7 +1777,7 @@ typedef struct AVFormatContext { * the same codec_id. * Demuxing: Set by user */ - const AVCodec *video_codec; + const struct AVCodec *video_codec; /** * Forced audio codec. @@ -1692,7 +1785,7 @@ typedef struct AVFormatContext { * the same codec_id. * Demuxing: Set by user */ - const AVCodec *audio_codec; + const struct AVCodec *audio_codec; /** * Forced subtitle codec. @@ -1700,7 +1793,7 @@ typedef struct AVFormatContext { * the same codec_id. * Demuxing: Set by user */ - const AVCodec *subtitle_codec; + const struct AVCodec *subtitle_codec; /** * Forced data codec. @@ -1708,12 +1801,12 @@ typedef struct AVFormatContext { * the same codec_id. * Demuxing: Set by user */ - const AVCodec *data_codec; + const struct 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. + * Muxing: Set by user. */ int metadata_header_padding; @@ -1742,19 +1835,6 @@ typedef struct AVFormatContext { */ uint8_t *dump_separator; - /** - * Forced Data codec_id. - * Demuxing: Set by user. - */ - enum AVCodecID data_codec_id; - - /** - * ',' separated list of allowed protocols. - * - encoding: unused - * - decoding: set by user - */ - char *protocol_whitelist; - /** * A callback for opening new IO streams. * @@ -1778,39 +1858,6 @@ typedef struct AVFormatContext { 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; - - /** - * Maximum number of packets that can be probed - * - encoding: unused - * - decoding: set by user - */ - int max_probe_packets; - /** * A callback for closing the streams opened with AVFormatContext.io_open(). * @@ -1828,15 +1875,25 @@ typedef struct AVFormatContext { /** * This function will cause global side data to be injected in the next packet * of each stream as well as after any subsequent seek. + * + * @note global side data is always available in every AVStream's + * @ref AVCodecParameters.coded_side_data "codecpar side data" array, and + * in a @ref AVCodecContext.coded_side_data "decoder's side data" array if + * initialized with said stream's codecpar. + * @see av_packet_side_data_get() */ void av_format_inject_global_side_data(AVFormatContext *s); +#if FF_API_GET_DUR_ESTIMATE_METHOD /** * Returns the method used to set ctx->duration. * * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + * @deprecated duration_estimation_method is public and can be read directly. */ +attribute_deprecated enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); +#endif /** * @defgroup lavf_core Core functions @@ -1935,6 +1992,42 @@ const AVClass *avformat_get_class(void); */ const AVClass *av_stream_get_class(void); +/** + * Get the AVClass for AVStreamGroup. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_stream_group_get_class(void); + +/** + * @return a string identifying the stream group type, or NULL if unknown + */ +const char *avformat_stream_group_name(enum AVStreamGroupParamsType type); + +/** + * Add a new empty stream group to a media file. + * + * When demuxing, it may be 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, may be called by the user before avformat_write_header(). + * + * User is required to call avformat_free_context() to clean up the allocation + * by avformat_stream_group_create(). + * + * New streams can be added to the group with avformat_stream_group_add_stream(). + * + * @param s media file handle + * + * @return newly created group or NULL on error. + * @see avformat_new_stream, avformat_stream_group_add_stream. + */ +AVStreamGroup *avformat_stream_group_create(AVFormatContext *s, + enum AVStreamGroupParamsType type, + AVDictionary **options); + /** * Add a new stream to a media file. * @@ -1952,8 +2045,34 @@ const AVClass *av_stream_get_class(void); * * @return newly created stream or NULL on error. */ -AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); +AVStream *avformat_new_stream(AVFormatContext *s, const struct AVCodec *c); +/** + * Add an already allocated stream to a stream group. + * + * When demuxing, it may be 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, may be called by the user before avformat_write_header() after + * having allocated a new group with avformat_stream_group_create() and stream with + * avformat_new_stream(). + * + * User is required to call avformat_free_context() to clean up the allocation + * by avformat_stream_group_add_stream(). + * + * @param stg stream group belonging to a media file. + * @param st stream in the media file to add to the group. + * + * @retval 0 success + * @retval AVERROR(EEXIST) the stream was already in the group + * @retval "another negative error code" legitimate errors + * + * @see avformat_new_stream, avformat_stream_group_create. + */ +int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st); + +#if FF_API_AVSTREAM_SIDE_DATA /** * Wrap an existing array as stream side data. * @@ -1966,7 +2085,10 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); * * @return zero on success, a negative AVERROR code on failure. On failure, * the stream is unchanged and the data remains owned by the caller. + * @deprecated use av_packet_side_data_add() with the stream's + * @ref AVCodecParameters.coded_side_data "codecpar side data" */ +attribute_deprecated int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size); @@ -1978,7 +2100,10 @@ int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, * @param size side information size * * @return pointer to fresh allocated data or NULL otherwise + * @deprecated use av_packet_side_data_new() with the stream's + * @ref AVCodecParameters.coded_side_data "codecpar side data" */ +attribute_deprecated uint8_t *av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, size_t size); /** @@ -1990,9 +2115,13 @@ uint8_t *av_stream_new_side_data(AVStream *stream, * or to zero if the desired side data is not present. * * @return pointer to data if present or NULL otherwise + * @deprecated use av_packet_side_data_get() with the stream's + * @ref AVCodecParameters.coded_side_data "codecpar side data" */ +attribute_deprecated uint8_t *av_stream_get_side_data(const AVStream *stream, enum AVPacketSideDataType type, size_t *size); +#endif AVProgram *av_new_program(AVFormatContext *s, int id); @@ -2186,7 +2315,7 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, - const AVCodec **decoder_ret, + const struct AVCodec **decoder_ret, int flags); /** @@ -2462,7 +2591,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); * See av_interleaved_write_uncoded_frame() for details. */ int av_write_uncoded_frame(AVFormatContext *s, int stream_index, - AVFrame *frame); + struct AVFrame *frame); /** * Write an uncoded frame to an output media file. @@ -2481,7 +2610,7 @@ int av_write_uncoded_frame(AVFormatContext *s, int stream_index, * @return >=0 for success, a negative code on error */ int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, - AVFrame *frame); + struct AVFrame *frame); /** * Test whether a muxer supports uncoded frame. @@ -2869,7 +2998,8 @@ const struct AVCodecTag *avformat_get_mov_audio_tags(void); * @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); +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, + struct AVFrame *frame); /** * Guess the frame rate, based on both the container and codec information. @@ -2879,7 +3009,8 @@ AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *strea * @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); +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, + struct AVFrame *frame); /** * Check if the stream st contained in s is matched by the stream specifier diff --git a/ThirdParty/ffmpeg/include/libavformat/avio.h b/ThirdParty/ffmpeg/include/libavformat/avio.h index 4bf6b1fbd..ebf611187 100644 --- a/ThirdParty/ffmpeg/include/libavformat/avio.h +++ b/ThirdParty/ffmpeg/include/libavformat/avio.h @@ -101,13 +101,7 @@ typedef struct AVIODirEntry { int64_t filemode; /**< Unix file mode, -1 if unknown. */ } AVIODirEntry; -#if FF_API_AVIODIRCONTEXT -typedef struct AVIODirContext { - struct URLContext *url_context; -} AVIODirContext; -#else typedef struct AVIODirContext AVIODirContext; -#endif /** * Different data types that can be returned via the AVIO @@ -238,7 +232,7 @@ typedef struct AVIOContext { 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); + int (*write_packet)(void *opaque, const 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 */ @@ -286,7 +280,7 @@ typedef struct AVIOContext { /** * A callback that is used instead of write_packet. */ - int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + int (*write_data_type)(void *opaque, const 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, @@ -295,16 +289,6 @@ typedef struct AVIOContext { */ int ignore_boundary_point; -#if FF_API_AVIOCONTEXT_WRITTEN - /** - * @deprecated field utilized privately by libavformat. For a public - * statistic of how many bytes were written out, see - * AVIOContext::bytes_written. - */ - attribute_deprecated - int64_t written; -#endif - /** * Maximum reached position before a backward seek in the write buffer, * used keeping track of already written data for a later flush. @@ -417,7 +401,7 @@ AVIOContext *avio_alloc_context( 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), + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), int64_t (*seek)(void *opaque, int64_t offset, int whence)); /** @@ -541,7 +525,7 @@ int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); * 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[]); +void avio_print_string_array(AVIOContext *s, const char * const strings[]); /** * Write strings (const char *) to the context. diff --git a/ThirdParty/ffmpeg/include/libavformat/version.h b/ThirdParty/ffmpeg/include/libavformat/version.h index 7c9d50b7b..a7c80dc56 100644 --- a/ThirdParty/ffmpeg/include/libavformat/version.h +++ b/ThirdParty/ffmpeg/include/libavformat/version.h @@ -31,8 +31,8 @@ #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 34 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 1 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ diff --git a/ThirdParty/ffmpeg/include/libavformat/version_major.h b/ThirdParty/ffmpeg/include/libavformat/version_major.h index 86af3ee4a..44ad23c6b 100644 --- a/ThirdParty/ffmpeg/include/libavformat/version_major.h +++ b/ThirdParty/ffmpeg/include/libavformat/version_major.h @@ -29,7 +29,7 @@ // 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 59 +#define LIBAVFORMAT_VERSION_MAJOR 61 /** * FF_API_* defines may be placed below to indicate public API that will be @@ -41,14 +41,12 @@ * at once through the bump. This improves the git bisect-ability of the change. * */ -#define FF_API_LAVF_PRIV_OPT (LIBAVFORMAT_VERSION_MAJOR < 60) -#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 60) -#define FF_API_AVIOCONTEXT_WRITTEN (LIBAVFORMAT_VERSION_MAJOR < 60) -#define FF_HLS_TS_OPTIONS (LIBAVFORMAT_VERSION_MAJOR < 60) -#define FF_API_AVSTREAM_CLASS (LIBAVFORMAT_VERSION_MAJOR > 59) -#define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 60) -#define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 60) +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 62) +#define FF_API_LAVF_SHORTEST (LIBAVFORMAT_VERSION_MAJOR < 62) +#define FF_API_ALLOW_FLUSH (LIBAVFORMAT_VERSION_MAJOR < 62) +#define FF_API_AVSTREAM_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 62) +#define FF_API_GET_DUR_ESTIMATE_METHOD (LIBAVFORMAT_VERSION_MAJOR < 62) #define FF_API_R_FRAME_RATE 1 diff --git a/ThirdParty/ffmpeg/include/libavutil/ambient_viewing_environment.h b/ThirdParty/ffmpeg/include/libavutil/ambient_viewing_environment.h new file mode 100644 index 000000000..e5e4ac217 --- /dev/null +++ b/ThirdParty/ffmpeg/include/libavutil/ambient_viewing_environment.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2023 Jan Ekström + * + * 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_AMBIENT_VIEWING_ENVIRONMENT_H +#define AVUTIL_AMBIENT_VIEWING_ENVIRONMENT_H + +#include +#include "frame.h" +#include "rational.h" + +/** + * Ambient viewing environment metadata as defined by H.274. The values are + * saved in AVRationals so that they keep their exactness, while allowing for + * easy access to a double value with f.ex. av_q2d. + * + * @note sizeof(AVAmbientViewingEnvironment) is not part of the public ABI, and + * it must be allocated using av_ambient_viewing_environment_alloc. + */ +typedef struct AVAmbientViewingEnvironment { + /** + * Environmental illuminance of the ambient viewing environment in lux. + */ + AVRational ambient_illuminance; + + /** + * Normalized x chromaticity coordinate of the environmental ambient light + * in the nominal viewing environment according to the CIE 1931 definition + * of x and y as specified in ISO/CIE 11664-1. + */ + AVRational ambient_light_x; + + /** + * Normalized y chromaticity coordinate of the environmental ambient light + * in the nominal viewing environment according to the CIE 1931 definition + * of x and y as specified in ISO/CIE 11664-1. + */ + AVRational ambient_light_y; +} AVAmbientViewingEnvironment; + +/** + * Allocate an AVAmbientViewingEnvironment structure. + * + * @return the newly allocated struct or NULL on failure + */ +AVAmbientViewingEnvironment *av_ambient_viewing_environment_alloc(size_t *size); + +/** + * Allocate and add an AVAmbientViewingEnvironment structure to an existing + * AVFrame as side data. + * + * @return the newly allocated struct, or NULL on failure + */ +AVAmbientViewingEnvironment *av_ambient_viewing_environment_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_AMBIENT_VIEWING_ENVIRONMENT_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/audio_fifo.h b/ThirdParty/ffmpeg/include/libavutil/audio_fifo.h index d1e4c856d..fa5f59a2b 100644 --- a/ThirdParty/ffmpeg/include/libavutil/audio_fifo.h +++ b/ThirdParty/ffmpeg/include/libavutil/audio_fifo.h @@ -91,7 +91,7 @@ int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); * 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); +int av_audio_fifo_write(AVAudioFifo *af, void * const *data, int nb_samples); /** * Peek data from an AVAudioFifo. @@ -107,7 +107,7 @@ int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); * 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); +int av_audio_fifo_peek(const AVAudioFifo *af, void * const *data, int nb_samples); /** * Peek data from an AVAudioFifo. @@ -124,7 +124,8 @@ int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); * 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); +int av_audio_fifo_peek_at(const AVAudioFifo *af, void * const *data, + int nb_samples, int offset); /** * Read data from an AVAudioFifo. @@ -140,7 +141,7 @@ int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offs * 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); +int av_audio_fifo_read(AVAudioFifo *af, void * const *data, int nb_samples); /** * Drain data from an AVAudioFifo. diff --git a/ThirdParty/ffmpeg/include/libavutil/avassert.h b/ThirdParty/ffmpeg/include/libavutil/avassert.h index 51e462bba..1895fb755 100644 --- a/ThirdParty/ffmpeg/include/libavutil/avassert.h +++ b/ThirdParty/ffmpeg/include/libavutil/avassert.h @@ -28,6 +28,9 @@ #define AVUTIL_AVASSERT_H #include +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +#endif #include "log.h" #include "macros.h" diff --git a/ThirdParty/ffmpeg/include/libavutil/avstring.h b/ThirdParty/ffmpeg/include/libavutil/avstring.h index 74aa4cd0e..fc095349d 100644 --- a/ThirdParty/ffmpeg/include/libavutil/avstring.h +++ b/ThirdParty/ffmpeg/include/libavutil/avstring.h @@ -24,7 +24,6 @@ #include #include #include "attributes.h" -#include "version.h" /** * @addtogroup lavu_string @@ -157,15 +156,6 @@ static inline size_t av_strnlen(const char *s, size_t len) */ char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); -#if FF_API_D2STR -/** - * Convert a number to an av_malloced string. - * @deprecated use av_asprintf() with "%f" or a more specific format - */ -attribute_deprecated -char *av_d2str(double d); -#endif - /** * Unescape the given string until a non escaped terminating char, * and return the token corresponding to the unescaped string. @@ -274,7 +264,7 @@ 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 + * @note This means only ASCII-range characters are replaced. */ char *av_strireplace(const char *str, const char *from, const char *to); diff --git a/ThirdParty/ffmpeg/include/libavutil/avutil.h b/ThirdParty/ffmpeg/include/libavutil/avutil.h index 64b68bdbd..d2900dcb4 100644 --- a/ThirdParty/ffmpeg/include/libavutil/avutil.h +++ b/ThirdParty/ffmpeg/include/libavutil/avutil.h @@ -257,7 +257,12 @@ const char *av_get_media_type_string(enum AVMediaType media_type); * Internal time base represented as fractional value */ +#ifdef __cplusplus +/* ISO C++ forbids compound-literals. */ +#define AV_TIME_BASE_Q av_make_q(1, AV_TIME_BASE) +#else #define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE} +#endif /** * @} @@ -294,7 +299,6 @@ char av_get_picture_type_char(enum AVPictureType pict_type); */ #include "common.h" -#include "error.h" #include "rational.h" #include "version.h" #include "macros.h" @@ -331,19 +335,6 @@ unsigned av_int_list_length_for_size(unsigned elsize, #define av_int_list_length(list, term) \ av_int_list_length_for_size(sizeof(*(list)), list, term) -#if FF_API_AV_FOPEN_UTF8 -/** - * Open a file using a UTF-8 filename. - * The API of this function matches POSIX fopen(), errors are returned through - * errno. - * @deprecated Avoid using it, as on Windows, the FILE* allocated by this - * function may be allocated with a different CRT than the caller - * who uses the FILE*. No replacement provided in public API. - */ -attribute_deprecated -FILE *av_fopen_utf8(const char *path, const char *mode); -#endif - /** * Return the fractional representation of the internal time base. */ diff --git a/ThirdParty/ffmpeg/include/libavutil/bprint.h b/ThirdParty/ffmpeg/include/libavutil/bprint.h index f27d30f72..4ac857056 100644 --- a/ThirdParty/ffmpeg/include/libavutil/bprint.h +++ b/ThirdParty/ffmpeg/include/libavutil/bprint.h @@ -144,6 +144,9 @@ 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. + * In case size equals zero, the AVBPrint will be initialized to use + * the internal buffer as if using AV_BPRINT_SIZE_COUNT_ONLY with + * av_bprint_init(). * * @param buf buffer structure to init * @param buffer byte buffer to use for the string data @@ -169,9 +172,9 @@ 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 + * @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); @@ -179,9 +182,9 @@ 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 + * @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 diff --git a/ThirdParty/ffmpeg/include/libavutil/channel_layout.h b/ThirdParty/ffmpeg/include/libavutil/channel_layout.h index 059ff7084..8a078d160 100644 --- a/ThirdParty/ffmpeg/include/libavutil/channel_layout.h +++ b/ThirdParty/ffmpeg/include/libavutil/channel_layout.h @@ -119,7 +119,7 @@ enum AVChannelOrder { /** * The channel order does not correspond to any other predefined order and * is stored as an explicit map. For example, this could be used to support - * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_SILENCE) + * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_UNUSED) * channels at arbitrary positions. */ AV_CHANNEL_ORDER_CUSTOM, @@ -146,6 +146,10 @@ enum AVChannelOrder { * as defined in AmbiX format $ 2.1. */ AV_CHANNEL_ORDER_AMBISONIC, + /** + * Number of channel orders, not part of ABI/API + */ + FF_CHANNEL_ORDER_NB }; @@ -192,16 +196,6 @@ enum AVChannelOrder { #define AV_CH_BOTTOM_FRONT_LEFT (1ULL << AV_CHAN_BOTTOM_FRONT_LEFT ) #define AV_CH_BOTTOM_FRONT_RIGHT (1ULL << AV_CHAN_BOTTOM_FRONT_RIGHT ) -#if FF_API_OLD_CHANNEL_LAYOUT -/** 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. - @deprecated channel order is now indicated in a special field in - AVChannelLayout - */ -#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL -#endif - /** * @} * @defgroup channel_mask_c Audio channel layouts @@ -224,6 +218,7 @@ enum AVChannelOrder { #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_3POINT1POINT2 (AV_CH_LAYOUT_3POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) #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) @@ -232,10 +227,19 @@ enum AVChannelOrder { #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_5POINT1POINT2_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) #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_CUBE (AV_CH_LAYOUT_QUAD|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1POINT4_BACK (AV_CH_LAYOUT_5POINT1POINT2_BACK|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1POINT2 (AV_CH_LAYOUT_7POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_7POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT2POINT3 (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_CENTER|AV_CH_LOW_FREQUENCY_2) +#define AV_CH_LAYOUT_9POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT4_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) #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) -#define AV_CH_LAYOUT_22POINT2 (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_BACK_CENTER|AV_CH_LOW_FREQUENCY_2|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_CENTER|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_SIDE_LEFT|AV_CH_TOP_SIDE_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_BOTTOM_FRONT_CENTER|AV_CH_BOTTOM_FRONT_LEFT|AV_CH_BOTTOM_FRONT_RIGHT) +#define AV_CH_LAYOUT_22POINT2 (AV_CH_LAYOUT_7POINT1POINT4_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_BACK_CENTER|AV_CH_LOW_FREQUENCY_2|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_CENTER|AV_CH_TOP_SIDE_LEFT|AV_CH_TOP_SIDE_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_BOTTOM_FRONT_CENTER|AV_CH_BOTTOM_FRONT_LEFT|AV_CH_BOTTOM_FRONT_RIGHT) + +#define AV_CH_LAYOUT_7POINT1_TOP_BACK AV_CH_LAYOUT_5POINT1POINT2_BACK enum AVMatrixEncoding { AV_MATRIX_ENCODING_NONE, @@ -356,8 +360,16 @@ typedef struct AVChannelLayout { void *opaque; } AVChannelLayout; +/** + * Macro to define native channel layouts + * + * @note This doesn't use designated initializers for compatibility with C++ 17 and older. + */ #define AV_CHANNEL_LAYOUT_MASK(nb, m) \ - { .order = AV_CHANNEL_ORDER_NATIVE, .nb_channels = (nb), .u = { .mask = (m) }} + { /* .order */ AV_CHANNEL_ORDER_NATIVE, \ + /* .nb_channels */ (nb), \ + /* .u.mask */ { m }, \ + /* .opaque */ NULL } /** * @name Common pre-defined channel layouts @@ -379,6 +391,7 @@ typedef struct AVChannelLayout { #define AV_CHANNEL_LAYOUT_5POINT1_BACK AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1_BACK) #define AV_CHANNEL_LAYOUT_6POINT0 AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0) #define AV_CHANNEL_LAYOUT_6POINT0_FRONT AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0_FRONT) +#define AV_CHANNEL_LAYOUT_3POINT1POINT2 AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_3POINT1POINT2) #define AV_CHANNEL_LAYOUT_HEXAGONAL AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_HEXAGONAL) #define AV_CHANNEL_LAYOUT_6POINT1 AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1) #define AV_CHANNEL_LAYOUT_6POINT1_BACK AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_BACK) @@ -388,156 +401,29 @@ typedef struct AVChannelLayout { #define AV_CHANNEL_LAYOUT_7POINT1 AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1) #define AV_CHANNEL_LAYOUT_7POINT1_WIDE AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE) #define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE_BACK) +#define AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK) #define AV_CHANNEL_LAYOUT_OCTAGONAL AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_OCTAGONAL) +#define AV_CHANNEL_LAYOUT_CUBE AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_CUBE) +#define AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK) +#define AV_CHANNEL_LAYOUT_7POINT1POINT2 AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2) +#define AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK) +#define AV_CHANNEL_LAYOUT_7POINT2POINT3 AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3) +#define AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK) #define AV_CHANNEL_LAYOUT_HEXADECAGONAL AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL) #define AV_CHANNEL_LAYOUT_STEREO_DOWNMIX AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO_DOWNMIX) #define AV_CHANNEL_LAYOUT_22POINT2 AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2) + +#define AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK + #define AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER \ - { .order = AV_CHANNEL_ORDER_AMBISONIC, .nb_channels = 4, .u = { .mask = 0 }} + { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, \ + /* .nb_channels */ 4, \ + /* .u.mask */ { 0 }, \ + /* .opaque */ NULL } /** @} */ struct AVBPrint; -#if FF_API_OLD_CHANNEL_LAYOUT -/** - * @name Deprecated Functions - * @{ - */ - -/** - * 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" - * - * @deprecated use av_channel_layout_from_string() - */ -attribute_deprecated -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. - * @deprecated use av_channel_layout_from_string() - */ -attribute_deprecated -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 - * @param nb_channels number of channels - * @param channel_layout channel layout bitset - * @deprecated use av_channel_layout_describe() - */ -attribute_deprecated -void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); - -/** - * Append a description of a channel layout to a bprint buffer. - * @deprecated use av_channel_layout_describe() - */ -attribute_deprecated -void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); - -/** - * Return the number of channels in the channel layout. - * @deprecated use AVChannelLayout.nb_channels - */ -attribute_deprecated -int av_get_channel_layout_nb_channels(uint64_t channel_layout); - -/** - * Return default channel layout for a given number of channels. - * - * @deprecated use av_channel_layout_default() - */ -attribute_deprecated -int64_t av_get_default_channel_layout(int nb_channels); - -/** - * Get the index of a channel in channel_layout. - * - * @param channel_layout channel layout bitset - * @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. - * - * @deprecated use av_channel_layout_index_from_channel() - */ -attribute_deprecated -int av_get_channel_layout_channel_index(uint64_t channel_layout, - uint64_t channel); - -/** - * Get the channel with the given index in channel_layout. - * @deprecated use av_channel_layout_channel_from_index() - */ -attribute_deprecated -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. - * - * @deprecated use av_channel_name() - */ -attribute_deprecated -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 - * @deprecated use av_channel_description() - */ -attribute_deprecated -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 - * @deprecated use av_channel_layout_standard() - */ -attribute_deprecated -int av_get_standard_channel_layout(unsigned index, uint64_t *layout, - const char **name); -/** - * @} - */ -#endif - /** * Get a human readable string in an abbreviated form describing a given channel. * This is the inverse function of @ref av_channel_from_string(). @@ -585,6 +471,23 @@ void av_channel_description_bprint(struct AVBPrint *bp, enum AVChannel channel_i */ enum AVChannel av_channel_from_string(const char *name); +/** + * Initialize a custom channel layout with the specified number of channels. + * The channel map will be allocated and the designation of all channels will + * be set to AV_CHAN_UNKNOWN. + * + * This is only a convenience helper function, a custom channel layout can also + * be constructed without using this. + * + * @param channel_layout the layout structure to be initialized + * @param nb_channels the number of channels + * + * @return 0 on success + * AVERROR(EINVAL) if the number of channels <= 0 + * AVERROR(ENOMEM) if the channel map could not be allocated + */ +int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels); + /** * Initialize a native channel layout from a bitmask indicating which channels * are present. @@ -609,10 +512,14 @@ int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask); * - the number of unordered channels (eg. "4C" or "4 channels") * - the ambisonic order followed by optional non-diegetic channels (eg. * "ambisonic 2+stereo") + * On error, the channel layout will remain uninitialized, but not necessarily + * untouched. * - * @param channel_layout input channel layout + * @param channel_layout uninitialized channel layout for the result * @param str string describing the channel layout - * @return 0 channel layout was detected, AVERROR_INVALIDATATA otherwise + * @return 0 on success parsing the channel layout + * AVERROR(EINVAL) if an invalid channel layout string was provided + * AVERROR(ENOMEM) if there was not enough memory */ int av_channel_layout_from_string(AVChannelLayout *channel_layout, const char *str); @@ -772,6 +679,53 @@ int av_channel_layout_check(const AVChannelLayout *channel_layout); */ int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1); +/** + * The conversion must be lossless. + */ +#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS (1 << 0) + +/** + * The specified retype target order is ignored and the simplest possible + * (canonical) order is used for which the input layout can be losslessy + * represented. + */ +#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL (1 << 1) + +/** + * Change the AVChannelOrder of a channel layout. + * + * Change of AVChannelOrder can be either lossless or lossy. In case of a + * lossless conversion all the channel designations and the associated channel + * names (if any) are kept. On a lossy conversion the channel names and channel + * designations might be lost depending on the capabilities of the desired + * AVChannelOrder. Note that some conversions are simply not possible in which + * case this function returns AVERROR(ENOSYS). + * + * The following conversions are supported: + * + * Any -> Custom : Always possible, always lossless. + * Any -> Unspecified: Always possible, lossless if channel designations + * are all unknown and channel names are not used, lossy otherwise. + * Custom -> Ambisonic : Possible if it contains ambisonic channels with + * optional non-diegetic channels in the end. Lossy if the channels have + * custom names, lossless otherwise. + * Custom -> Native : Possible if it contains native channels in native + * order. Lossy if the channels have custom names, lossless otherwise. + * + * On error this function keeps the original channel layout untouched. + * + * @param channel_layout channel layout which will be changed + * @param order the desired channel layout order + * @param flags a combination of AV_CHANNEL_LAYOUT_RETYPE_FLAG_* constants + * @return 0 if the conversion was successful and lossless or if the channel + * layout was already in the desired order + * >0 if the conversion was successful but lossy + * AVERROR(ENOSYS) if the conversion was not possible (or would be + * lossy and AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS was specified) + * AVERROR(EINVAL), AVERROR(ENOMEM) on error + */ +int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags); + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/common.h b/ThirdParty/ffmpeg/include/libavutil/common.h index fd1404be6..57c87f191 100644 --- a/ThirdParty/ffmpeg/include/libavutil/common.h +++ b/ThirdParty/ffmpeg/include/libavutil/common.h @@ -40,7 +40,15 @@ #include #include "attributes.h" +#include "error.h" #include "macros.h" +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ //rounded division & shift #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) @@ -83,11 +91,6 @@ /* misc math functions */ -#ifdef HAVE_AV_CONFIG_H -# include "config.h" -# include "intmath.h" -#endif - #ifndef av_ceil_log2 # define av_ceil_log2 av_ceil_log2_c #endif @@ -567,12 +570,4 @@ static av_always_inline av_const int av_parity_c(uint32_t v) }\ }\ - - -#include "mem.h" - -#ifdef HAVE_AV_CONFIG_H -# include "internal.h" -#endif /* HAVE_AV_CONFIG_H */ - #endif /* AVUTIL_COMMON_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/cpu.h b/ThirdParty/ffmpeg/include/libavutil/cpu.h index 8fa5ea919..8dff34188 100644 --- a/ThirdParty/ffmpeg/include/libavutil/cpu.h +++ b/ThirdParty/ffmpeg/include/libavutil/cpu.h @@ -69,6 +69,8 @@ #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_DOTPROD (1 << 8) +#define AV_CPU_FLAG_I8MM (1 << 9) #define AV_CPU_FLAG_SETEND (1 <<16) #define AV_CPU_FLAG_MMI (1 << 0) @@ -87,6 +89,7 @@ #define AV_CPU_FLAG_RVV_I64 (1 << 5) ///< Vectors of 64-bit int's */ #define AV_CPU_FLAG_RVV_F64 (1 << 6) ///< Vectors of double's #define AV_CPU_FLAG_RVB_BASIC (1 << 7) ///< Basic bit-manipulations +#define AV_CPU_FLAG_RVB_ADDR (1 << 8) ///< Address bit-manipulations /** * Return the flags which specify extensions supported by the CPU. diff --git a/ThirdParty/ffmpeg/include/libavutil/csp.h b/ThirdParty/ffmpeg/include/libavutil/csp.h index 18ef208ad..73bce52bc 100644 --- a/ThirdParty/ffmpeg/include/libavutil/csp.h +++ b/ThirdParty/ffmpeg/include/libavutil/csp.h @@ -1,5 +1,8 @@ /* + * Copyright (c) 2015 Kevin Wheatley * Copyright (c) 2016 Ronald S. Bultje + * Copyright (c) 2023 Leo Izen + * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -29,6 +32,7 @@ * @ingroup lavu_math_csp * @author Ronald S. Bultje * @author Leo Izen + * @author Kevin Wheatley */ /** @@ -76,6 +80,12 @@ typedef struct AVColorPrimariesDesc { AVPrimaryCoefficients prim; } AVColorPrimariesDesc; +/** + * Function pointer representing a double -> double transfer function that performs + * an EOTF transfer inversion. This function outputs linear light. + */ +typedef double (*av_csp_trc_function)(double); + /** * Retrieves the Luma coefficients necessary to construct a conversion matrix * from an enum constant describing the colorspace. @@ -104,6 +114,35 @@ const AVColorPrimariesDesc *av_csp_primaries_desc_from_id(enum AVColorPrimaries */ enum AVColorPrimaries av_csp_primaries_id_from_desc(const AVColorPrimariesDesc *prm); +/** + * Determine a suitable 'gamma' value to match the supplied + * AVColorTransferCharacteristic. + * + * See Apple Technical Note TN2257 (https://developer.apple.com/library/mac/technotes/tn2257/_index.html) + * + * This function returns the gamma exponent for the OETF. For example, sRGB is approximated + * by gamma 2.2, not by gamma 0.45455. + * + * @return Will return an approximation to the simple gamma function matching + * the supplied Transfer Characteristic, Will return 0.0 for any + * we cannot reasonably match against. + */ +double av_csp_approximate_trc_gamma(enum AVColorTransferCharacteristic trc); + +/** + * Determine the function needed to apply the given + * AVColorTransferCharacteristic to linear input. + * + * The function returned should expect a nominal domain and range of [0.0-1.0] + * values outside of this range maybe valid depending on the chosen + * characteristic function. + * + * @return Will return pointer to the function matching the + * supplied Transfer Characteristic. If unspecified will + * return NULL: + */ +av_csp_trc_function av_csp_trc_func_from_id(enum AVColorTransferCharacteristic trc); + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/dict.h b/ThirdParty/ffmpeg/include/libavutil/dict.h index 0d1afc6c6..713c9e361 100644 --- a/ThirdParty/ffmpeg/include/libavutil/dict.h +++ b/ThirdParty/ffmpeg/include/libavutil/dict.h @@ -39,13 +39,15 @@ * @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. + * 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. + * - To **insert an entry**, use av_dict_set(). + * - Use av_dict_get() to **retrieve an entry**. + * - To **iterate over all entries**, use av_dict_iterate(). + * - In order to **free the dictionary and all its contents**, use av_dict_free(). * @code AVDictionary *d = NULL; // "create" an empty dictionary @@ -57,13 +59,18 @@ 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 + while ((t = av_dict_iterate(d, t))) { + <....> // iterate over all entries in d } av_dict_free(&d); @endcode */ +/** + * @name AVDictionary Flags + * Flags that influence behavior of the matching of keys or insertion to the dictionary. + * @{ + */ #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(). */ @@ -71,10 +78,13 @@ 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_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. */ + 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; @@ -89,18 +99,44 @@ typedef struct AVDictionary AVDictionary; * 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 * - * @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 + * @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); +/** + * Iterate over a dictionary + * + * Iterates through all entries in the dictionary. + * + * @warning The returned AVDictionaryEntry key/value must not be changed. + * + * @warning As av_dict_set() invalidates all previous entries returned + * by this function, it must not be called while iterating over the dict. + * + * Typical usage: + * @code + * const AVDictionaryEntry *e = NULL; + * while ((e = av_dict_iterate(m, e))) { + * // ... + * } + * @endcode + * + * @param m The dictionary to iterate over + * @param prev Pointer to the previous AVDictionaryEntry, NULL initially + * + * @retval AVDictionaryEntry* The next element in the dictionary + * @retval NULL No more elements in the dictionary + */ +const AVDictionaryEntry *av_dict_iterate(const AVDictionary *m, + const AVDictionaryEntry *prev); + /** * Get number of entries in dictionary. * @@ -115,23 +151,24 @@ int av_dict_count(const AVDictionary *m); * 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. + * @warning Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get() or av_dict_iterate(). * - * @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 + * @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 + * 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. + * 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); @@ -141,14 +178,15 @@ int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags * 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 + * @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 + * @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 + * @param flags Flags to use when adding to the 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, @@ -157,11 +195,14 @@ int av_dict_parse_string(AVDictionary **pm, const char *str, /** * 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 + * + * @note Metadata is read using the ::AV_DICT_IGNORE_SUFFIX flag + * + * @param dst Pointer to a pointer to a AVDictionary struct to copy into. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src Pointer to the source AVDictionary struct to copy items from. + * @param flags Flags to use when setting entries in *dst + * * @return 0 on success, negative AVERROR code on failure. If dst was allocated * by this function, callers should free the associated memory. */ @@ -180,13 +221,15 @@ void av_dict_free(AVDictionary **m); * Such string may be passed back to av_dict_parse_string(). * @note String is escaped with backslashes ('\'). * - * @param[in] m dictionary + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + * + * @param[in] m The 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 + * @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); diff --git a/ThirdParty/ffmpeg/include/libavutil/eval.h b/ThirdParty/ffmpeg/include/libavutil/eval.h index ee8cffb05..0d3eaeb3f 100644 --- a/ThirdParty/ffmpeg/include/libavutil/eval.h +++ b/ThirdParty/ffmpeg/include/libavutil/eval.h @@ -105,7 +105,7 @@ int av_expr_count_vars(AVExpr *e, unsigned *counter, int size); * @param e the AVExpr to track user provided functions in * @param counter a zero-initialized array where the count of each function will be stored * if you passed 5 functions with 2 arguments to av_expr_parse() - * then for arg=2 this will use upto 5 entries. + * then for arg=2 this will use up to 5 entries. * @param size size of array * @param arg number of arguments the counted functions have * @return 0 on success, a negative value indicates that no expression or array was passed diff --git a/ThirdParty/ffmpeg/include/libavutil/executor.h b/ThirdParty/ffmpeg/include/libavutil/executor.h new file mode 100644 index 000000000..c602bcb61 --- /dev/null +++ b/ThirdParty/ffmpeg/include/libavutil/executor.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2023 Nuo Mi + * + * 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_EXECUTOR_H +#define AVUTIL_EXECUTOR_H + +typedef struct AVExecutor AVExecutor; +typedef struct AVTask AVTask; + +struct AVTask { + AVTask *next; +}; + +typedef struct AVTaskCallbacks { + void *user_data; + + int local_context_size; + + // return 1 if a's priority > b's priority + int (*priority_higher)(const AVTask *a, const AVTask *b); + + // task is ready for run + int (*ready)(const AVTask *t, void *user_data); + + // run the task + int (*run)(AVTask *t, void *local_context, void *user_data); +} AVTaskCallbacks; + +/** + * Alloc executor + * @param callbacks callback structure for executor + * @param thread_count worker thread number + * @return return the executor + */ +AVExecutor* av_executor_alloc(const AVTaskCallbacks *callbacks, int thread_count); + +/** + * Free executor + * @param e pointer to executor + */ +void av_executor_free(AVExecutor **e); + +/** + * Add task to executor + * @param e pointer to executor + * @param t pointer to task. If NULL, it will wakeup one work thread + */ +void av_executor_execute(AVExecutor *e, AVTask *t); + +#endif //AVUTIL_EXECUTOR_H diff --git a/ThirdParty/ffmpeg/include/libavutil/ffversion.h b/ThirdParty/ffmpeg/include/libavutil/ffversion.h index 88befd374..296dc9117 100644 --- a/ThirdParty/ffmpeg/include/libavutil/ffversion.h +++ b/ThirdParty/ffmpeg/include/libavutil/ffversion.h @@ -1,5 +1,5 @@ /* Automatically generated by version.sh, do not manually edit! */ #ifndef AVUTIL_FFVERSION_H #define AVUTIL_FFVERSION_H -#define FFMPEG_VERSION "N-108709-g3bd0bf76fb" +#define FFMPEG_VERSION "7.0" #endif /* AVUTIL_FFVERSION_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/fifo.h b/ThirdParty/ffmpeg/include/libavutil/fifo.h index 70f9376d9..048298214 100644 --- a/ThirdParty/ffmpeg/include/libavutil/fifo.h +++ b/ThirdParty/ffmpeg/include/libavutil/fifo.h @@ -200,7 +200,7 @@ int av_fifo_read_to_cb(AVFifo *f, AVFifoCB write_cb, * * @return a non-negative number on success, a negative error code on failure */ -int av_fifo_peek(AVFifo *f, void *buf, size_t nb_elems, size_t offset); +int av_fifo_peek(const AVFifo *f, void *buf, size_t nb_elems, size_t offset); /** * Feed data from a FIFO into a user-provided callback. @@ -217,7 +217,7 @@ int av_fifo_peek(AVFifo *f, void *buf, size_t nb_elems, size_t offset); * * @return a non-negative number on success, a negative error code on failure */ -int av_fifo_peek_to_cb(AVFifo *f, AVFifoCB write_cb, void *opaque, +int av_fifo_peek_to_cb(const AVFifo *f, AVFifoCB write_cb, void *opaque, size_t *nb_elems, size_t offset); /** @@ -239,208 +239,6 @@ void av_fifo_reset2(AVFifo *f); */ void av_fifo_freep2(AVFifo **f); - -#if FF_API_FIFO_OLD_API -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 - * @deprecated use av_fifo_alloc2() - */ -attribute_deprecated -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 - * @deprecated use av_fifo_alloc2() - */ -attribute_deprecated -AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); - -/** - * Free an AVFifoBuffer. - * @param f AVFifoBuffer to free - * @deprecated use the AVFifo API with av_fifo_freep2() - */ -attribute_deprecated -void av_fifo_free(AVFifoBuffer *f); - -/** - * Free an AVFifoBuffer and reset pointer to NULL. - * @param f AVFifoBuffer to free - * @deprecated use the AVFifo API with av_fifo_freep2() - */ -attribute_deprecated -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 - * @deprecated use av_fifo_reset2() with the new AVFifo-API - */ -attribute_deprecated -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 - * @deprecated use av_fifo_can_read() with the new AVFifo-API - */ -attribute_deprecated -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 - * @deprecated use av_fifo_can_write() with the new AVFifo-API - */ -attribute_deprecated -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 - * - * @return a non-negative number on success, a negative error code on failure - * - * @deprecated use the new AVFifo-API with av_fifo_peek() when func == NULL, - * av_fifo_peek_to_cb() otherwise - */ -attribute_deprecated -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 - * - * @return a non-negative number on success, a negative error code on failure - * - * @deprecated use the new AVFifo-API with av_fifo_peek() when func == NULL, - * av_fifo_peek_to_cb() otherwise - */ -attribute_deprecated -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 - * - * @return a non-negative number on success, a negative error code on failure - * - * @deprecated use the new AVFifo-API with av_fifo_read() when func == NULL, - * av_fifo_read_to_cb() otherwise - */ -attribute_deprecated -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 or a negative error code on failure - * - * @deprecated use the new AVFifo-API with av_fifo_write() when func == NULL, - * av_fifo_write_from_cb() otherwise - */ -attribute_deprecated -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 - * - * @deprecated use the new AVFifo-API with av_fifo_grow2() to increase FIFO size, - * decreasing FIFO size is not supported - */ -attribute_deprecated -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 - * - * @deprecated use the new AVFifo-API with av_fifo_grow2(); note that unlike - * this function it adds to the allocated size, rather than to the used size - */ -attribute_deprecated -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 - * - * @deprecated use the new AVFifo-API with av_fifo_drain2() - */ -attribute_deprecated -void av_fifo_drain(AVFifoBuffer *f, int size); - -#if FF_API_FIFO_PEEK2 -/** - * 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(). - * @deprecated use the new AVFifo-API with av_fifo_peek() or av_fifo_peek_to_cb() - */ -attribute_deprecated -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 -#endif - /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/file.h b/ThirdParty/ffmpeg/include/libavutil/file.h index fc87a9cd6..b5a762c28 100644 --- a/ThirdParty/ffmpeg/include/libavutil/file.h +++ b/ThirdParty/ffmpeg/include/libavutil/file.h @@ -60,21 +60,4 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, */ void av_file_unmap(uint8_t *bufptr, size_t size); -#if FF_API_AV_FOPEN_UTF8 -/** - * 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 - */ -attribute_deprecated -int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); -#endif - #endif /* AVUTIL_FILE_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/film_grain_params.h b/ThirdParty/ffmpeg/include/libavutil/film_grain_params.h index f3bd0a4a6..ccacab88f 100644 --- a/ThirdParty/ffmpeg/include/libavutil/film_grain_params.h +++ b/ThirdParty/ffmpeg/include/libavutil/film_grain_params.h @@ -136,20 +136,42 @@ typedef struct AVFilmGrainH274Params { */ int model_id; - /** - * Specifies the bit depth used for the luma component. - */ +#if FF_API_H274_FILM_GRAIN_VCS + /** + * TODO: On this ABI bump, please also re-order the fields in + * AVFilmGrainParams (see below) + */ + + /** + * Specifies the bit depth used for the luma component. + * + * @deprecated use AVFilmGrainParams.bit_depth_luma. + */ + attribute_deprecated int bit_depth_luma; /** * Specifies the bit depth used for the chroma components. + * + * @deprecated use AVFilmGrainParams.bit_depth_chroma. */ + attribute_deprecated int bit_depth_chroma; + /** + * Specifies the video signal characteristics. + * + * @deprecated use AVFilmGrainParams.color_{range,primaries,trc,space}. + */ + attribute_deprecated enum AVColorRange color_range; + attribute_deprecated enum AVColorPrimaries color_primaries; + attribute_deprecated enum AVColorTransferCharacteristic color_trc; + attribute_deprecated enum AVColorSpace color_space; +#endif /** * Specifies the blending mode used to blend the simulated film grain @@ -231,11 +253,40 @@ typedef struct AVFilmGrainParams { * Additional fields may be added both here and in any structure included. * If a codec's film grain structure differs slightly over another * codec's, fields within may change meaning depending on the type. + * + * TODO: Move this to the end of the structure, at the next ABI bump. */ union { AVFilmGrainAOMParams aom; AVFilmGrainH274Params h274; } codec; + + /** + * Intended display resolution. May be 0 if the codec does not specify + * any restrictions. + */ + + int width, height; + + /** + * Intended subsampling ratio, or 0 for luma-only streams. + */ + int subsampling_x, subsampling_y; + + /** + * Intended video signal characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + + /** + * Intended bit depth, or 0 for unknown/unspecified. + */ + int bit_depth_luma; + int bit_depth_chroma; + } AVFilmGrainParams; /** @@ -257,4 +308,15 @@ AVFilmGrainParams *av_film_grain_params_alloc(size_t *size); */ AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame); +/** + * Select the most appropriate film grain parameters set for the frame, + * taking into account the frame's format, resolution and video signal + * characteristics. + * + * @note, for H.274, this may select a film grain parameter set with + * greater chroma resolution than the frame. Users should take care to + * correctly adjust the chroma grain frequency to the frame. + */ +const AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame); + #endif /* AVUTIL_FILM_GRAIN_PARAMS_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/frame.h b/ThirdParty/ffmpeg/include/libavutil/frame.h index e60a82f6c..8aa05ec12 100644 --- a/ThirdParty/ffmpeg/include/libavutil/frame.h +++ b/ThirdParty/ffmpeg/include/libavutil/frame.h @@ -180,6 +180,10 @@ enum AVFrameSideDataType { /** * Film grain parameters for a frame, described by AVFilmGrainParams. * Must be present for every frame which should have film grain applied. + * + * May be present multiple times, for example when there are multiple + * alternative parameter sets for different video signal characteristics. + * The user should select the most appropriate set for the application. */ AV_FRAME_DATA_FILM_GRAIN_PARAMS, @@ -209,6 +213,21 @@ enum AVFrameSideDataType { * volume transform - CUVA 005.1-2021. */ AV_FRAME_DATA_DYNAMIC_HDR_VIVID, + + /** + * Ambient viewing environment metadata, as defined by H.274. + */ + AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, + + /** + * Provide encoder-specific hinting information about changed/unchanged + * portions of a frame. It can be used to pass information about which + * macroblocks can be skipped because they didn't change from the + * corresponding ones in the previous frame. This could be useful for + * applications which know this information in advance to speed up + * encoding. + */ + AV_FRAME_DATA_VIDEO_HINT, }; enum AVActiveFormatDescription { @@ -411,10 +430,15 @@ typedef struct AVFrame { */ int format; +#if FF_API_FRAME_KEY /** * 1 -> keyframe, 0-> not + * + * @deprecated Use AV_FRAME_FLAG_KEY instead */ + attribute_deprecated int key_frame; +#endif /** * Picture type of the frame. @@ -446,70 +470,78 @@ typedef struct AVFrame { */ AVRational time_base; - /** - * 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 + * Frame owner's private data. + * + * This field may be set by the code that allocates/owns the frame data. + * It is then not touched by any library functions, except: + * - it is copied to other references by av_frame_copy_props() (and hence by + * av_frame_ref()); + * - it is set to NULL when the frame is cleared by av_frame_unref() + * - on the caller's explicit request. E.g. libavcodec encoders/decoders + * will copy this field to/from @ref AVPacket "AVPackets" if the caller sets + * @ref AV_CODEC_FLAG_COPY_OPAQUE. + * + * @see opaque_ref the reference-counted analogue */ void *opaque; /** - * When decoding, this signals how much the picture must be delayed. - * extra_delay = repeat_pict / (2*fps) + * Number of fields in this frame which should be repeated, i.e. the total + * duration of this frame should be repeat_pict + 2 normal field durations. + * + * For interlaced frames this field may be set to 1, which signals that this + * frame should be presented as 3 fields: beginning with the first field (as + * determined by AV_FRAME_FLAG_TOP_FIELD_FIRST being set or not), followed + * by the second field, and then the first field again. + * + * For progressive frames this field may be set to a multiple of 2, which + * signals that this frame's duration should be (repeat_pict + 2) / 2 + * normal frame durations. + * + * @note This field is computed from MPEG2 repeat_first_field flag and its + * associated flags, H.264 pic_struct from picture timing SEI, and + * their analogues in other codecs. Typically it should only be used when + * higher-layer timing information is not available. */ int repeat_pict; +#if FF_API_INTERLACED_FRAME /** * The content of the picture is interlaced. + * + * @deprecated Use AV_FRAME_FLAG_INTERLACED instead */ + attribute_deprecated int interlaced_frame; /** * If the content is interlaced, is top field displayed first. + * + * @deprecated Use AV_FRAME_FLAG_TOP_FIELD_FIRST instead */ + attribute_deprecated int top_field_first; +#endif +#if FF_API_PALETTE_HAS_CHANGED /** * Tell user application that palette has changed from previous frame. */ + attribute_deprecated 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; +#endif /** * Sample rate of the audio data. */ int sample_rate; -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * Channel layout of the audio data. - * @deprecated use ch_layout instead - */ - attribute_deprecated - uint64_t channel_layout; -#endif - /** * AVBuffer references backing the data for this frame. All the pointers in * data and extended_data must point inside one of the buffers in buf or @@ -557,10 +589,23 @@ typedef struct AVFrame { * The frame data may be corrupted, e.g. due to decoding errors. */ #define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark frames that are keyframes. + */ +#define AV_FRAME_FLAG_KEY (1 << 1) /** * A flag to mark the frames which need to be decoded, but shouldn't be output. */ #define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * A flag to mark frames whose content is interlaced. + */ +#define AV_FRAME_FLAG_INTERLACED (1 << 3) +/** + * A flag to mark frames where the top field is displayed first if the content + * is interlaced. + */ +#define AV_FRAME_FLAG_TOP_FIELD_FIRST (1 << 4) /** * @} */ @@ -597,24 +642,16 @@ typedef struct AVFrame { */ int64_t best_effort_timestamp; +#if FF_API_FRAME_PKT /** * reordered pos from the last AVPacket that has been input into the decoder * - encoding: unused * - decoding: Read by user. - */ - int64_t pkt_pos; - -#if FF_API_PKT_DURATION - /** - * duration of the corresponding packet, expressed in - * AVStream->time_base units, 0 if unknown. - * - encoding: unused - * - decoding: Read by user. - * - * @deprecated use duration instead + * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user + * data from packets to frames */ attribute_deprecated - int64_t pkt_duration; + int64_t pkt_pos; #endif /** @@ -637,25 +674,19 @@ typedef struct AVFrame { #define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 #define FF_DECODE_ERROR_DECODE_SLICES 8 -#if FF_API_OLD_CHANNEL_LAYOUT - /** - * number of audio channels, only used for audio. - * - encoding: unused - * - decoding: Read by user. - * @deprecated use ch_layout instead - */ - attribute_deprecated - int channels; -#endif - +#if FF_API_FRAME_PKT /** * 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. + * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user + * data from packets to frames */ + attribute_deprecated int pkt_size; +#endif /** * For hwaccel-format frames, this should be a reference to the @@ -664,13 +695,18 @@ typedef struct AVFrame { 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. + * Frame owner's private data. * - * This is unrelated to the opaque field, although it serves a similar - * purpose. + * This field may be set by the code that allocates/owns the frame data. + * It is then not touched by any library functions, except: + * - a new reference to the underlying buffer is propagated by + * av_frame_copy_props() (and hence by av_frame_ref()); + * - it is unreferenced in av_frame_unref(); + * - on the caller's explicit request. E.g. libavcodec encoders/decoders + * will propagate a new reference to/from @ref AVPacket "AVPackets" if the + * caller sets @ref AV_CODEC_FLAG_COPY_OPAQUE. + * + * @see opaque the plain pointer analogue */ AVBufferRef *opaque_ref; @@ -715,15 +751,6 @@ typedef struct AVFrame { } AVFrame; -#if FF_API_COLORSPACE_NAME -/** - * Get the name of a colorspace. - * @return a static string identifying the colorspace; can be NULL. - * @deprecated use av_color_space_name() - */ -attribute_deprecated -const char *av_get_colorspace_name(enum AVColorSpace val); -#endif /** * Allocate an AVFrame and set its fields to default values. The resulting * struct must be freed using av_frame_free(). @@ -762,6 +789,19 @@ void av_frame_free(AVFrame **frame); */ int av_frame_ref(AVFrame *dst, const AVFrame *src); +/** + * Ensure the destination frame refers to the same data described by the source + * frame, either by creating a new reference for each AVBufferRef from src if + * they differ from those in dst, by allocating new buffers and copying data if + * src is not reference counted, or by unrefencing it if src is empty. + * + * Frame properties on dst will be replaced by those from src. + * + * @return 0 on success, a negative AVERROR on error. On error, dst is + * unreferenced. + */ +int av_frame_replace(AVFrame *dst, const AVFrame *src); + /** * Create a new frame that references the same data as src. * @@ -870,7 +910,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src); * @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); +AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane); /** * Add a new side data to a frame. @@ -952,6 +992,88 @@ int av_frame_apply_cropping(AVFrame *frame, int flags); */ const char *av_frame_side_data_name(enum AVFrameSideDataType type); +/** + * Free all side data entries and their contents, then zeroes out the + * values which the pointers are pointing to. + * + * @param sd pointer to array of side data to free. Will be set to NULL + * upon return. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. Will be set to 0 upon return. + */ +void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd); + +#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0) + +/** + * Add new side data entry to an array. + * + * @param sd pointer to array of side data to which to add another entry, + * or to NULL in order to start a new array. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. + * @param type type of the added side data + * @param size size of the side data + * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. + * + * @return newly added side data on success, NULL on error. In case of + * AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching + * AVFrameSideDataType will be removed before the addition is + * attempted. + */ +AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, + enum AVFrameSideDataType type, + size_t size, unsigned int flags); + +/** + * Add a new side data entry to an array based on existing side data, taking + * a reference towards the contained AVBufferRef. + * + * @param sd pointer to array of side data to which to add another entry, + * or to NULL in order to start a new array. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. + * @param src side data to be cloned, with a new reference utilized + * for the buffer. + * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. + * + * @return negative error code on failure, >=0 on success. In case of + * AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching + * AVFrameSideDataType will be removed before the addition is + * attempted. + */ +int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, + const AVFrameSideData *src, unsigned int flags); + +/** + * Get a side data entry of a specific type from an array. + * + * @param sd array of side data. + * @param nb_sd integer containing the number of entries in the array. + * @param type type of side data to be queried + * + * @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 set. + */ +const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *sd, + const int nb_sd, + enum AVFrameSideDataType type); + +/** + * Wrapper around av_frame_side_data_get_c() to workaround the limitation + * that for any type T the conversion from T * const * to const T * const * + * is not performed automatically in C. + * @see av_frame_side_data_get_c() + */ +static inline +const AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd, + const int nb_sd, + enum AVFrameSideDataType type) +{ + return av_frame_side_data_get_c((const AVFrameSideData * const *)sd, + nb_sd, type); +} + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h b/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h index 2d72de56a..5100ed6f4 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h +++ b/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h @@ -340,4 +340,37 @@ AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); */ AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); +/** + * Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus). + * The T.35 buffer must begin with the application mode, skipping the + * country code, terminal provider codes, and application identifier. + * @param s A pointer containing the decoded AVDynamicHDRPlus structure. + * @param data The byte array containing the raw ITU-T T.35 data. + * @param size Size of the data array in bytes. + * + * @return >= 0 on success. Otherwise, returns the appropriate AVERROR. + */ +int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data, + size_t size); + +#define AV_HDR_PLUS_MAX_PAYLOAD_SIZE 907 + +/** + * Serialize dynamic HDR10+ metadata to a user data registered ITU-T T.35 buffer, + * excluding the first 48 bytes of the header, and beginning with the application mode. + * @param s A pointer containing the decoded AVDynamicHDRPlus structure. + * @param[in,out] data A pointer to pointer to a byte buffer to be filled with the + * serialized metadata. + * If *data is NULL, a buffer be will be allocated and a pointer to + * it stored in its place. The caller assumes ownership of the buffer. + * May be NULL, in which case the function will only store the + * required buffer size in *size. + * @param[in,out] size A pointer to a size to be set to the returned buffer's size. + * If *data is not NULL, *size must contain the size of the input + * buffer. May be NULL only if *data is NULL. + * + * @return >= 0 on success. Otherwise, returns the appropriate AVERROR. + */ +int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size); + #endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_vivid_metadata.h b/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_vivid_metadata.h index a34f83072..4524a8155 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_vivid_metadata.h +++ b/ThirdParty/ffmpeg/include/libavutil/hdr_dynamic_vivid_metadata.h @@ -24,6 +24,52 @@ #include "frame.h" #include "rational.h" +/** + * HDR Vivid three spline params. + */ +typedef struct AVHDRVivid3SplineParams { + /** + * The mode of three Spline. the value shall be in the range + * of 0 to 3, inclusive. + */ + int th_mode; + + /** + * three_Spline_TH_enable_MB is in the range of 0.0 to 1.0, inclusive + * and in multiples of 1.0/255. + * + */ + AVRational th_enable_mb; + + /** + * 3Spline_TH_enable of three Spline. + * The value shall be in the range of 0.0 to 1.0, inclusive. + * and in multiples of 1.0/4095. + */ + AVRational th_enable; + + /** + * 3Spline_TH_Delta1 of three Spline. + * The value shall be in the range of 0.0 to 0.25, inclusive, + * and in multiples of 0.25/1023. + */ + AVRational th_delta1; + + /** + * 3Spline_TH_Delta2 of three Spline. + * The value shall be in the range of 0.0 to 0.25, inclusive, + * and in multiples of 0.25/1023. + */ + AVRational th_delta2; + + /** + * 3Spline_enable_Strength of three Spline. + * The value shall be in the range of 0.0 to 1.0, inclusive, + * and in multiples of 1.0/255. + */ + AVRational enable_strength; +} AVHDRVivid3SplineParams; + /** * Color tone mapping parameters at a processing window in a dynamic metadata for * CUVA 005.1:2021. @@ -122,46 +168,61 @@ typedef struct AVHDRVividColorToneMappingParams { */ int three_Spline_num; +#if FF_API_HDR_VIVID_THREE_SPLINE /** * The mode of three Spline. the value shall be in the range * of 0 to 3, inclusive. + * @deprecated Use three_spline instead */ + attribute_deprecated int three_Spline_TH_mode; /** * three_Spline_TH_enable_MB is in the range of 0.0 to 1.0, inclusive * and in multiples of 1.0/255. - * + * @deprecated Use three_spline instead */ + attribute_deprecated AVRational three_Spline_TH_enable_MB; /** * 3Spline_TH_enable of three Spline. * The value shall be in the range of 0.0 to 1.0, inclusive. * and in multiples of 1.0/4095. + * @deprecated Use three_spline instead */ + attribute_deprecated AVRational three_Spline_TH_enable; /** * 3Spline_TH_Delta1 of three Spline. * The value shall be in the range of 0.0 to 0.25, inclusive, * and in multiples of 0.25/1023. + * @deprecated Use three_spline instead */ + attribute_deprecated AVRational three_Spline_TH_Delta1; /** * 3Spline_TH_Delta2 of three Spline. * The value shall be in the range of 0.0 to 0.25, inclusive, * and in multiples of 0.25/1023. + * @deprecated Use three_spline instead */ + attribute_deprecated AVRational three_Spline_TH_Delta2; /** * 3Spline_enable_Strength of three Spline. * The value shall be in the range of 0.0 to 1.0, inclusive, * and in multiples of 1.0/255. + * @deprecated Use three_spline instead */ + attribute_deprecated AVRational three_Spline_enable_Strength; +#endif + + AVHDRVivid3SplineParams three_spline[2]; } AVHDRVividColorToneMappingParams; diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext.h index 7ff08c860..bac30deba 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hwcontext.h +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext.h @@ -37,10 +37,9 @@ enum AVHWDeviceType { AV_HWDEVICE_TYPE_OPENCL, AV_HWDEVICE_TYPE_MEDIACODEC, AV_HWDEVICE_TYPE_VULKAN, + AV_HWDEVICE_TYPE_D3D12VA, }; -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. @@ -64,12 +63,6 @@ typedef struct AVHWDeviceContext { */ 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. * @@ -109,8 +102,6 @@ typedef struct AVHWDeviceContext { 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 @@ -127,12 +118,6 @@ typedef struct AVHWFramesContext { */ 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 @@ -152,9 +137,12 @@ typedef struct AVHWFramesContext { * 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(). + * The user shall ignore this field if the corresponding format-specific + * header (hwcontext_*.h) does not define a context to be used as + * AVHWFramesContext.hwctx. + * + * Otherwise, it should be cast by the user to said context 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. diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext_cuda.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext_cuda.h index cefbe0cea..cbad434fe 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hwcontext_cuda.h +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext_cuda.h @@ -62,6 +62,11 @@ typedef struct AVCUDADeviceContext { */ #define AV_CUDA_USE_PRIMARY_CONTEXT (1 << 0) +/** + * Use current device context instead of creating a new one. + */ +#define AV_CUDA_USE_CURRENT_CONTEXT (1 << 1) + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext_d3d12va.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext_d3d12va.h new file mode 100644 index 000000000..ff06e6f2e --- /dev/null +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext_d3d12va.h @@ -0,0 +1,134 @@ +/* + * Direct3D 12 HW acceleration. + * + * copyright (c) 2022-2023 Wu Jianhua + * + * 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_D3D12VA_H +#define AVUTIL_HWCONTEXT_D3D12VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D12VA. + * + * AVHWFramesContext.pool must contain AVBufferRefs whose + * data pointer points to an AVD3D12VAFrame struct. + */ +#include +#include +#include +#include +#include + +/** + * @brief This struct is allocated as AVHWDeviceContext.hwctx + * + */ +typedef struct AVD3D12VADeviceContext { + /** + * Device used for objects creation and access. This can also be + * used to set the libavcodec decoding device. + * + * Can 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. + */ + ID3D12Device *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. + */ + ID3D12VideoDevice *video_device; + + /** + * Callbacks for locking. They 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; +} AVD3D12VADeviceContext; + +/** + * @brief This struct is used to sync d3d12 execution + * + */ +typedef struct AVD3D12VASyncContext { + /** + * D3D12 fence object + */ + ID3D12Fence *fence; + + /** + * A handle to the event object that's raised when the fence + * reaches a certain value. + */ + HANDLE event; + + /** + * The fence value used for sync + */ + uint64_t fence_value; +} AVD3D12VASyncContext; + +/** + * @brief D3D12VA frame descriptor for pool allocation. + * + */ +typedef struct AVD3D12VAFrame { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + */ + ID3D12Resource *texture; + + /** + * The sync context for the texture + * + * @see: https://learn.microsoft.com/en-us/windows/win32/medfound/direct3d-12-video-overview#directx-12-fences + */ + AVD3D12VASyncContext sync_ctx; +} AVD3D12VAFrame; + +/** + * @brief This struct is allocated as AVHWFramesContext.hwctx + * + */ +typedef struct AVD3D12VAFramesContext { + /** + * DXGI_FORMAT format. MUST be compatible with the pixel format. + * If unset, will be automatically set. + */ + DXGI_FORMAT format; +} AVD3D12VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D12VA_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext_mediacodec.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext_mediacodec.h index 101a9806d..fc0263cab 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hwcontext_mediacodec.h +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext_mediacodec.h @@ -31,6 +31,31 @@ typedef struct AVMediaCodecDeviceContext { * This is the default surface used by decoders on this device. */ void *surface; + + /** + * Pointer to ANativeWindow. + * + * It both surface and native_window is NULL, try to create it + * automatically if create_window is true and OS support + * createPersistentInputSurface. + * + * It can be used as output surface for decoder and input surface for + * encoder. + */ + void *native_window; + + /** + * Enable createPersistentInputSurface automatically. + * + * Disabled by default. + * + * It can be enabled by setting this flag directly, or by setting + * AVDictionary of av_hwdevice_ctx_create(), with "create_window" as key. + * The second method is useful for ffmpeg cmdline, e.g., we can enable it + * via: + * -init_hw_device mediacodec=mediacodec,create_window=1 + */ + int create_window; } AVMediaCodecDeviceContext; #endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext_videotoolbox.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext_videotoolbox.h index 25dde85df..600e9f2c8 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hwcontext_videotoolbox.h +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext_videotoolbox.h @@ -39,10 +39,13 @@ * depending on application usage, so it is preferable to let CoreVideo manage * the pool using the default implementation. * - * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always - * NULL. + * Currently AVHWDeviceContext.hwctx are always NULL. */ +typedef struct AVVTFramesContext { + enum AVColorRange color_range; +} AVVTFramesContext; + /** * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. * Returns AV_PIX_FMT_NONE if no known equivalent was found. diff --git a/ThirdParty/ffmpeg/include/libavutil/hwcontext_vulkan.h b/ThirdParty/ffmpeg/include/libavutil/hwcontext_vulkan.h index df86c85b3..895794c86 100644 --- a/ThirdParty/ffmpeg/include/libavutil/hwcontext_vulkan.h +++ b/ThirdParty/ffmpeg/include/libavutil/hwcontext_vulkan.h @@ -27,6 +27,8 @@ #include "pixfmt.h" #include "frame.h" +typedef struct AVVkFrame AVVkFrame; + /** * @file * API-specific header for AV_HWDEVICE_TYPE_VULKAN. @@ -53,7 +55,7 @@ typedef struct AVVulkanDeviceContext { PFN_vkGetInstanceProcAddr get_proc_addr; /** - * Vulkan instance. Must be at least version 1.2. + * Vulkan instance. Must be at least version 1.3. */ VkInstance inst; @@ -135,6 +137,19 @@ typedef struct AVVulkanDeviceContext { */ int queue_family_decode_index; int nb_decode_queues; + + /** + * Locks a queue, preventing other threads from submitting any command + * buffers to this queue. + * If set to NULL, will be set to lavu-internal functions that utilize a + * mutex. + */ + void (*lock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index); + + /** + * Similar to lock_queue(), unlocks a queue. Must only be called after locking. + */ + void (*unlock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index); } AVVulkanDeviceContext; /** @@ -145,10 +160,14 @@ typedef enum AVVkFrameFlags { * device and tiling during av_hwframe_ctx_init(). */ AV_VK_FRAME_FLAG_NONE = (1ULL << 0), - /* Image planes will be allocated in a single VkDeviceMemory, rather - * than as per-plane VkDeviceMemory allocations. Required for exporting - * to VAAPI on Intel devices. */ +#if FF_API_VULKAN_CONTIGUOUS_MEMORY + /* DEPRECATED: does nothing. Replaced by multiplane images. */ AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY = (1ULL << 1), +#endif + + /* Disables multiplane images. + * This is required to export/import images from CUDA. */ + AV_VK_FRAME_FLAG_DISABLE_MULTIPLANE = (1ULL << 2), } AVVkFrameFlags; /** @@ -156,26 +175,32 @@ typedef enum AVVkFrameFlags { */ typedef struct AVVulkanFramesContext { /** - * Controls the tiling of allocated frames. If left as optimal tiling, - * then during av_hwframe_ctx_init() will decide based on whether the device - * supports DRM modifiers, or if the linear_images flag is set, otherwise - * will allocate optimally-tiled images. + * Controls the tiling of allocated frames. + * If left as VK_IMAGE_TILING_OPTIMAL (0), will use optimal tiling. + * Can be set to VK_IMAGE_TILING_LINEAR to force linear images, + * or VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT to force DMABUF-backed + * images. + * @note Imported frames from other APIs ignore this. */ VkImageTiling tiling; /** - * Defines extra usage of output frames. If left as 0, the following bits - * are set: TRANSFER_SRC, TRANSFER_DST. SAMPLED and STORAGE. + * Defines extra usage of output frames. If non-zero, all flags MUST be + * supported by the VkFormat. Otherwise, will use supported flags amongst: + * - VK_IMAGE_USAGE_SAMPLED_BIT + * - VK_IMAGE_USAGE_STORAGE_BIT + * - VK_IMAGE_USAGE_TRANSFER_SRC_BIT + * - VK_IMAGE_USAGE_TRANSFER_DST_BIT */ VkImageUsageFlagBits usage; /** * Extension data for image creation. - * If VkImageDrmFormatModifierListCreateInfoEXT is present in the chain, - * and the device supports DRM modifiers, then images will be allocated - * with the specific requested DRM modifiers. + * If DRM tiling is used, a VkImageDrmFormatModifierListCreateInfoEXT structure + * can be added to specify the exact modifier to use. + * * Additional structures may be added at av_hwframe_ctx_init() time, - * which will be freed automatically on uninit(), so users need only free + * which will be freed automatically on uninit(), so users must only free * any structures they've allocated themselves. */ void *create_pnext; @@ -195,36 +220,65 @@ typedef struct AVVulkanFramesContext { * av_hwframe_ctx_init(). */ AVVkFrameFlags flags; + + /** + * Flags to set during image creation. If unset, defaults to + * VK_IMAGE_CREATE_ALIAS_BIT. + */ + VkImageCreateFlags img_flags; + + /** + * Vulkan format for each image. MUST be compatible with the pixel format. + * If unset, will be automatically set. + * There are at most two compatible formats for a frame - a multiplane + * format, and a single-plane multi-image format. + */ + VkFormat format[AV_NUM_DATA_POINTERS]; + + /** + * Number of layers each image will have. + */ + int nb_layers; + + /** + * Locks a frame, preventing other threads from changing frame properties. + * Users SHOULD only ever lock just before command submission in order + * to get accurate frame properties, and unlock immediately after command + * submission without waiting for it to finish. + * + * If unset, will be set to lavu-internal functions that utilize a mutex. + */ + void (*lock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf); + + /** + * Similar to lock_frame(), unlocks a frame. Must only be called after locking. + */ + void (*unlock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf); } AVVulkanFramesContext; /* - * Frame structure, the VkFormat of the image will always match - * the pool's sw_format. - * All frames, imported or allocated, will be created with the - * VK_IMAGE_CREATE_ALIAS_BIT flag set, so the memory may be aliased if needed. - * - * If all queue family indices in the device context are the same, - * images will be created with the EXCLUSIVE sharing mode. Otherwise, all images - * will be created using the CONCURRENT sharing mode. + * Frame structure. * * @note the size of this structure is not part of the ABI, to allocate * you must use @av_vk_frame_alloc(). */ -typedef struct AVVkFrame { +struct AVVkFrame { /** * Vulkan images to which the memory is bound to. + * May be one for multiplane formats, or multiple. */ VkImage img[AV_NUM_DATA_POINTERS]; /** - * The same tiling must be used for all images in the frame. + * Tiling for the frame. */ VkImageTiling tiling; /** - * Memory backing the images. Could be less than the amount of planes, - * in which case the offset value will indicate the binding offset of - * each plane in the memory. + * Memory backing the images. Either one, or as many as there are planes + * in the sw_format. + * In case of having multiple VkImages, but one memory, the offset field + * will indicate the bound offset for each image. */ VkDeviceMemory mem[AV_NUM_DATA_POINTERS]; size_t size[AV_NUM_DATA_POINTERS]; @@ -235,13 +289,13 @@ typedef struct AVVkFrame { VkMemoryPropertyFlagBits flags; /** - * Updated after every barrier + * Updated after every barrier. One per VkImage. */ VkAccessFlagBits access[AV_NUM_DATA_POINTERS]; VkImageLayout layout[AV_NUM_DATA_POINTERS]; /** - * Synchronization timeline semaphores, one for each sw_format plane. + * Synchronization timeline semaphores, one for each VkImage. * Must not be freed manually. Must be waited on at every submission using * the value in sem_value, and must be signalled at every submission, * using an incremented value. @@ -250,6 +304,7 @@ typedef struct AVVkFrame { /** * Up to date semaphore value at which each image becomes accessible. + * One per VkImage. * Clients must wait on this value when submitting a command queue, * and increment it when signalling. */ @@ -261,10 +316,18 @@ typedef struct AVVkFrame { struct AVVkFrameInternal *internal; /** - * Describes the binding offset of each plane to the VkDeviceMemory. + * Describes the binding offset of each image to the VkDeviceMemory. + * One per VkImage. */ ptrdiff_t offset[AV_NUM_DATA_POINTERS]; -} AVVkFrame; + + /** + * Queue family of the images. Must be VK_QUEUE_FAMILY_IGNORED if + * the image was allocated with the CONCURRENT concurrency option. + * One per VkImage. + */ + uint32_t queue_family[AV_NUM_DATA_POINTERS]; +}; /** * Allocates a single AVVkFrame and initializes everything as 0. @@ -273,7 +336,8 @@ typedef struct AVVkFrame { AVVkFrame *av_vk_frame_alloc(void); /** - * Returns the format of each image up to the number of planes for a given sw_format. + * Returns the optimal per-plane Vulkan format for a given sw_format, + * one for each plane. * Returns NULL on unsupported formats. */ const VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p); diff --git a/ThirdParty/ffmpeg/include/libavutil/iamf.h b/ThirdParty/ffmpeg/include/libavutil/iamf.h new file mode 100644 index 000000000..93785d9fe --- /dev/null +++ b/ThirdParty/ffmpeg/include/libavutil/iamf.h @@ -0,0 +1,680 @@ +/* + * Immersive Audio Model and Formats helper functions and defines + * + * 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_IAMF_H +#define AVUTIL_IAMF_H + +/** + * @file + * Immersive Audio Model and Formats API header + * @see Immersive Audio Model and Formats + */ + +#include +#include + +#include "attributes.h" +#include "avassert.h" +#include "channel_layout.h" +#include "dict.h" +#include "rational.h" + +/** + * @defgroup lavu_iamf_params Parameter Definition + * @{ + * Parameters as defined in section 3.6.1 and 3.8 of IAMF. + * @} + * @defgroup lavu_iamf_audio Audio Element + * @{ + * Audio Elements as defined in section 3.6 of IAMF. + * @} + * @defgroup lavu_iamf_mix Mix Presentation + * @{ + * Mix Presentations as defined in section 3.7 of IAMF. + * @} + * + * @} + * @addtogroup lavu_iamf_params + * @{ + */ +enum AVIAMFAnimationType { + AV_IAMF_ANIMATION_TYPE_STEP, + AV_IAMF_ANIMATION_TYPE_LINEAR, + AV_IAMF_ANIMATION_TYPE_BEZIER, +}; + +/** + * Mix Gain Parameter Data as defined in section 3.8.1 of IAMF. + * + * @note This struct's size is not a part of the public ABI. + */ +typedef struct AVIAMFMixGain { + const AVClass *av_class; + + /** + * Duration for the given subblock, in units of + * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate". + * It must not be 0. + */ + unsigned int subblock_duration; + /** + * The type of animation applied to the parameter values. + */ + enum AVIAMFAnimationType animation_type; + /** + * Parameter value that is applied at the start of the subblock. + * Applies to all defined Animation Types. + * + * Valid range of values is -128.0 to 128.0 + */ + AVRational start_point_value; + /** + * Parameter value that is applied at the end of the subblock. + * Applies only to AV_IAMF_ANIMATION_TYPE_LINEAR and + * AV_IAMF_ANIMATION_TYPE_BEZIER Animation Types. + * + * Valid range of values is -128.0 to 128.0 + */ + AVRational end_point_value; + /** + * Parameter value of the middle control point of a quadratic Bezier + * curve, i.e., its y-axis value. + * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type. + * + * Valid range of values is -128.0 to 128.0 + */ + AVRational control_point_value; + /** + * Parameter value of the time of the middle control point of a + * quadratic Bezier curve, i.e., its x-axis value. + * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type. + * + * Valid range of values is 0.0 to 1.0 + */ + AVRational control_point_relative_time; +} AVIAMFMixGain; + +/** + * Demixing Info Parameter Data as defined in section 3.8.2 of IAMF. + * + * @note This struct's size is not a part of the public ABI. + */ +typedef struct AVIAMFDemixingInfo { + const AVClass *av_class; + + /** + * Duration for the given subblock, in units of + * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate". + * It must not be 0. + */ + unsigned int subblock_duration; + /** + * Pre-defined combination of demixing parameters. + */ + unsigned int dmixp_mode; +} AVIAMFDemixingInfo; + +/** + * Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF. + * + * @note This struct's size is not a part of the public ABI. + */ +typedef struct AVIAMFReconGain { + const AVClass *av_class; + + /** + * Duration for the given subblock, in units of + * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate". + * It must not be 0. + */ + unsigned int subblock_duration; + + /** + * Array of gain values to be applied to each channel for each layer + * defined in the Audio Element referencing the parent Parameter Definition. + * Values for layers where the AV_IAMF_LAYER_FLAG_RECON_GAIN flag is not set + * are undefined. + * + * Channel order is: FL, C, FR, SL, SR, TFL, TFR, BL, BR, TBL, TBR, LFE + */ + uint8_t recon_gain[6][12]; +} AVIAMFReconGain; + +enum AVIAMFParamDefinitionType { + /** + * Subblocks are of struct type AVIAMFMixGain + */ + AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN, + /** + * Subblocks are of struct type AVIAMFDemixingInfo + */ + AV_IAMF_PARAMETER_DEFINITION_DEMIXING, + /** + * Subblocks are of struct type AVIAMFReconGain + */ + AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN, +}; + +/** + * Parameters as defined in section 3.6.1 of IAMF. + * + * The struct is allocated by av_iamf_param_definition_alloc() along with an + * array of subblocks, its type depending on the value of type. + * This array is placed subblocks_offset bytes after the start of this struct. + * + * @note This struct's size is not a part of the public ABI. + */ +typedef struct AVIAMFParamDefinition { + const AVClass *av_class; + + /** + * Offset in bytes from the start of this struct, at which the subblocks + * array is located. + */ + size_t subblocks_offset; + /** + * Size in bytes of each element in the subblocks array. + */ + size_t subblock_size; + /** + * Number of subblocks in the array. + */ + unsigned int nb_subblocks; + + /** + * Parameters type. Determines the type of the subblock elements. + */ + enum AVIAMFParamDefinitionType type; + + /** + * Identifier for the paremeter substream. + */ + unsigned int parameter_id; + /** + * Sample rate for the paremeter substream. It must not be 0. + */ + unsigned int parameter_rate; + + /** + * The accumulated duration of all blocks in this parameter definition, + * in units of 1 / @ref parameter_rate. + * + * May be 0, in which case all duration values should be specified in + * another parameter definition referencing the same parameter_id. + */ + unsigned int duration; + /** + * The duration of every subblock in the case where all subblocks, with + * the optional exception of the last subblock, have equal durations. + * + * Must be 0 if subblocks have different durations. + */ + unsigned int constant_subblock_duration; +} AVIAMFParamDefinition; + +const AVClass *av_iamf_param_definition_get_class(void); + +/** + * Allocates memory for AVIAMFParamDefinition, plus an array of {@code nb_subblocks} + * amount of subblocks of the given type and initializes the variables. Can be + * freed with a normal av_free() call. + * + * @param size if non-NULL, the size in bytes of the resulting data array is written here. + */ +AVIAMFParamDefinition *av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type, + unsigned int nb_subblocks, size_t *size); + +/** + * Get the subblock at the specified {@code idx}. Must be between 0 and nb_subblocks - 1. + * + * The @ref AVIAMFParamDefinition.type "param definition type" defines + * the struct type of the returned pointer. + */ +static av_always_inline void* +av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx) +{ + av_assert0(idx < par->nb_subblocks); + return (void *)((uint8_t *)par + par->subblocks_offset + idx * par->subblock_size); +} + +/** + * @} + * @addtogroup lavu_iamf_audio + * @{ + */ + +enum AVIAMFAmbisonicsMode { + AV_IAMF_AMBISONICS_MODE_MONO, + AV_IAMF_AMBISONICS_MODE_PROJECTION, +}; + +/** + * Recon gain information for the layer is present in AVIAMFReconGain + */ +#define AV_IAMF_LAYER_FLAG_RECON_GAIN (1 << 0) + +/** + * A layer defining a Channel Layout in the Audio Element. + * + * When @ref AVIAMFAudioElement.audio_element_type "the parent's Audio Element type" + * is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, this corresponds to an Scalable Channel + * Layout layer as defined in section 3.6.2 of IAMF. + * For AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, it is an Ambisonics channel + * layout as defined in section 3.6.3 of IAMF. + * + * @note The struct should be allocated with av_iamf_audio_element_add_layer() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFLayer { + const AVClass *av_class; + + AVChannelLayout ch_layout; + + /** + * A bitmask which may contain a combination of AV_IAMF_LAYER_FLAG_* flags. + */ + unsigned int flags; + /** + * Output gain channel flags as defined in section 3.6.2 of IAMF. + * + * This field is defined only if @ref AVIAMFAudioElement.audio_element_type + * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, + * must be 0 otherwise. + */ + unsigned int output_gain_flags; + /** + * Output gain as defined in section 3.6.2 of IAMF. + * + * Must be 0 if @ref output_gain_flags is 0. + */ + AVRational output_gain; + /** + * Ambisonics mode as defined in section 3.6.3 of IAMF. + * + * This field is defined only if @ref AVIAMFAudioElement.audio_element_type + * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE. + * + * If AV_IAMF_AMBISONICS_MODE_MONO, channel_mapping is defined implicitly + * (Ambisonic Order) or explicitly (Custom Order with ambi channels) in + * @ref ch_layout. + * If AV_IAMF_AMBISONICS_MODE_PROJECTION, @ref demixing_matrix must be set. + */ + enum AVIAMFAmbisonicsMode ambisonics_mode; + + /** + * Demixing matrix as defined in section 3.6.3 of IAMF. + * + * The length of the array is ch_layout.nb_channels multiplied by the sum of + * the amount of streams in the group plus the amount of streams in the group + * that are stereo. + * + * May be set only if @ref ambisonics_mode == AV_IAMF_AMBISONICS_MODE_PROJECTION, + * must be NULL otherwise. + */ + AVRational *demixing_matrix; +} AVIAMFLayer; + + +enum AVIAMFAudioElementType { + AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, + AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, +}; + +/** + * Information on how to combine one or more audio streams, as defined in + * section 3.6 of IAMF. + * + * @note The struct should be allocated with av_iamf_audio_element_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFAudioElement { + const AVClass *av_class; + + AVIAMFLayer **layers; + /** + * Number of layers, or channel groups, in the Audio Element. + * There may be 6 layers at most, and for @ref audio_element_type + * AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, there may be exactly 1. + * + * Set by av_iamf_audio_element_add_layer(), must not be + * modified by any other code. + */ + unsigned int nb_layers; + + /** + * Demixing information used to reconstruct a scalable channel audio + * representation. + * The @ref AVIAMFParamDefinition.type "type" must be + * AV_IAMF_PARAMETER_DEFINITION_DEMIXING. + */ + AVIAMFParamDefinition *demixing_info; + /** + * Recon gain information used to reconstruct a scalable channel audio + * representation. + * The @ref AVIAMFParamDefinition.type "type" must be + * AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN. + */ + AVIAMFParamDefinition *recon_gain_info; + + /** + * Audio element type as defined in section 3.6 of IAMF. + */ + enum AVIAMFAudioElementType audio_element_type; + + /** + * Default weight value as defined in section 3.6 of IAMF. + */ + unsigned int default_w; +} AVIAMFAudioElement; + +const AVClass *av_iamf_audio_element_get_class(void); + +/** + * Allocates a AVIAMFAudioElement, and initializes its fields with default values. + * No layers are allocated. Must be freed with av_iamf_audio_element_free(). + * + * @see av_iamf_audio_element_add_layer() + */ +AVIAMFAudioElement *av_iamf_audio_element_alloc(void); + +/** + * Allocate a layer and add it to a given AVIAMFAudioElement. + * It is freed by av_iamf_audio_element_free() alongside the rest of the parent + * AVIAMFAudioElement. + * + * @return a pointer to the allocated layer. + */ +AVIAMFLayer *av_iamf_audio_element_add_layer(AVIAMFAudioElement *audio_element); + +/** + * Free an AVIAMFAudioElement and all its contents. + * + * @param audio_element pointer to pointer to an allocated AVIAMFAudioElement. + * upon return, *audio_element will be set to NULL. + */ +void av_iamf_audio_element_free(AVIAMFAudioElement **audio_element); + +/** + * @} + * @addtogroup lavu_iamf_mix + * @{ + */ + +enum AVIAMFHeadphonesMode { + /** + * The referenced Audio Element shall be rendered to stereo loudspeakers. + */ + AV_IAMF_HEADPHONES_MODE_STEREO, + /** + * The referenced Audio Element shall be rendered with a binaural renderer. + */ + AV_IAMF_HEADPHONES_MODE_BINAURAL, +}; + +/** + * Submix element as defined in section 3.7 of IAMF. + * + * @note The struct should be allocated with av_iamf_submix_add_element() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFSubmixElement { + const AVClass *av_class; + + /** + * The id of the Audio Element this submix element references. + */ + unsigned int audio_element_id; + + /** + * Information required required for applying any processing to the + * referenced and rendered Audio Element before being summed with other + * processed Audio Elements. + * The @ref AVIAMFParamDefinition.type "type" must be + * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN. + */ + AVIAMFParamDefinition *element_mix_config; + + /** + * Default mix gain value to apply when there are no AVIAMFParamDefinition + * with @ref element_mix_config "element_mix_config's" + * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a + * given audio frame. + */ + AVRational default_mix_gain; + + /** + * A value that indicates whether the referenced channel-based Audio Element + * shall be rendered to stereo loudspeakers or spatialized with a binaural + * renderer when played back on headphones. + * If the Audio Element is not of @ref AVIAMFAudioElement.audio_element_type + * "type" AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, then this field is undefined. + */ + enum AVIAMFHeadphonesMode headphones_rendering_mode; + + /** + * A dictionary of strings describing the submix in different languages. + * Must have the same amount of entries as + * @ref AVIAMFMixPresentation.annotations "the mix's annotations", stored + * in the same order, and with the same key strings. + * + * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47 that + * specifies the language for the string stored in + * @ref AVDictionaryEntry.value "value". + */ + AVDictionary *annotations; +} AVIAMFSubmixElement; + +enum AVIAMFSubmixLayoutType { + /** + * The layout follows the loudspeaker sound system convention of ITU-2051-3. + */ + AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS = 2, + /** + * The layout is binaural. + */ + AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL = 3, +}; + +/** + * Submix layout as defined in section 3.7.6 of IAMF. + * + * @note The struct should be allocated with av_iamf_submix_add_layout() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFSubmixLayout { + const AVClass *av_class; + + enum AVIAMFSubmixLayoutType layout_type; + + /** + * Channel layout matching one of Sound Systems A to J of ITU-2051-3, plus + * 7.1.2ch and 3.1.2ch + * If layout_type is not AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS, this field + * is undefined. + */ + AVChannelLayout sound_system; + /** + * The program integrated loudness information, as defined in + * ITU-1770-4. + */ + AVRational integrated_loudness; + /** + * The digital (sampled) peak value of the audio signal, as defined + * in ITU-1770-4. + */ + AVRational digital_peak; + /** + * The true peak of the audio signal, as defined in ITU-1770-4. + */ + AVRational true_peak; + /** + * The Dialogue loudness information, as defined in ITU-1770-4. + */ + AVRational dialogue_anchored_loudness; + /** + * The Album loudness information, as defined in ITU-1770-4. + */ + AVRational album_anchored_loudness; +} AVIAMFSubmixLayout; + +/** + * Submix layout as defined in section 3.7 of IAMF. + * + * @note The struct should be allocated with av_iamf_mix_presentation_add_submix() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFSubmix { + const AVClass *av_class; + + /** + * Array of submix elements. + * + * Set by av_iamf_submix_add_element(), must not be modified by any + * other code. + */ + AVIAMFSubmixElement **elements; + /** + * Number of elements in the submix. + * + * Set by av_iamf_submix_add_element(), must not be modified by any + * other code. + */ + unsigned int nb_elements; + + /** + * Array of submix layouts. + * + * Set by av_iamf_submix_add_layout(), must not be modified by any + * other code. + */ + AVIAMFSubmixLayout **layouts; + /** + * Number of layouts in the submix. + * + * Set by av_iamf_submix_add_layout(), must not be modified by any + * other code. + */ + unsigned int nb_layouts; + + /** + * Information required for post-processing the mixed audio signal to + * generate the audio signal for playback. + * The @ref AVIAMFParamDefinition.type "type" must be + * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN. + */ + AVIAMFParamDefinition *output_mix_config; + + /** + * Default mix gain value to apply when there are no AVIAMFParamDefinition + * with @ref output_mix_config "output_mix_config's" + * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a + * given audio frame. + */ + AVRational default_mix_gain; +} AVIAMFSubmix; + +/** + * Information on how to render and mix one or more AVIAMFAudioElement to generate + * the final audio output, as defined in section 3.7 of IAMF. + * + * @note The struct should be allocated with av_iamf_mix_presentation_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVIAMFMixPresentation { + const AVClass *av_class; + + /** + * Array of submixes. + * + * Set by av_iamf_mix_presentation_add_submix(), must not be modified + * by any other code. + */ + AVIAMFSubmix **submixes; + /** + * Number of submixes in the presentation. + * + * Set by av_iamf_mix_presentation_add_submix(), must not be modified + * by any other code. + */ + unsigned int nb_submixes; + + /** + * A dictionary of strings describing the mix in different languages. + * Must have the same amount of entries as every + * @ref AVIAMFSubmixElement.annotations "Submix element annotations", + * stored in the same order, and with the same key strings. + * + * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47 + * that specifies the language for the string stored in + * @ref AVDictionaryEntry.value "value". + */ + AVDictionary *annotations; +} AVIAMFMixPresentation; + +const AVClass *av_iamf_mix_presentation_get_class(void); + +/** + * Allocates a AVIAMFMixPresentation, and initializes its fields with default + * values. No submixes are allocated. + * Must be freed with av_iamf_mix_presentation_free(). + * + * @see av_iamf_mix_presentation_add_submix() + */ +AVIAMFMixPresentation *av_iamf_mix_presentation_alloc(void); + +/** + * Allocate a submix and add it to a given AVIAMFMixPresentation. + * It is freed by av_iamf_mix_presentation_free() alongside the rest of the + * parent AVIAMFMixPresentation. + * + * @return a pointer to the allocated submix. + */ +AVIAMFSubmix *av_iamf_mix_presentation_add_submix(AVIAMFMixPresentation *mix_presentation); + +/** + * Allocate a submix element and add it to a given AVIAMFSubmix. + * It is freed by av_iamf_mix_presentation_free() alongside the rest of the + * parent AVIAMFSubmix. + * + * @return a pointer to the allocated submix. + */ +AVIAMFSubmixElement *av_iamf_submix_add_element(AVIAMFSubmix *submix); + +/** + * Allocate a submix layout and add it to a given AVIAMFSubmix. + * It is freed by av_iamf_mix_presentation_free() alongside the rest of the + * parent AVIAMFSubmix. + * + * @return a pointer to the allocated submix. + */ +AVIAMFSubmixLayout *av_iamf_submix_add_layout(AVIAMFSubmix *submix); + +/** + * Free an AVIAMFMixPresentation and all its contents. + * + * @param mix_presentation pointer to pointer to an allocated AVIAMFMixPresentation. + * upon return, *mix_presentation will be set to NULL. + */ +void av_iamf_mix_presentation_free(AVIAMFMixPresentation **mix_presentation); +/** + * @} + */ + +#endif /* AVUTIL_IAMF_H */ diff --git a/ThirdParty/ffmpeg/include/libavutil/imgutils.h b/ThirdParty/ffmpeg/include/libavutil/imgutils.h index e10ac1495..123a9e5c0 100644 --- a/ThirdParty/ffmpeg/include/libavutil/imgutils.h +++ b/ThirdParty/ffmpeg/include/libavutil/imgutils.h @@ -170,10 +170,26 @@ void av_image_copy_plane_uc_from(uint8_t *dst, ptrdiff_t dst_linesize, * @param width width of the image in pixels * @param height height of the image in pixels */ -void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], - const uint8_t *src_data[4], const int src_linesizes[4], +void av_image_copy(uint8_t * const dst_data[4], const int dst_linesizes[4], + const uint8_t * const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height); +/** + * Wrapper around av_image_copy() to workaround the limitation + * that the conversion from uint8_t * const * to const uint8_t * const * + * is not performed automatically in C. + * @see av_image_copy() + */ +static inline +void av_image_copy2(uint8_t * const dst_data[4], const int dst_linesizes[4], + uint8_t * const src_data[4], const int src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height) +{ + av_image_copy(dst_data, dst_linesizes, + (const uint8_t * const *)src_data, src_linesizes, + pix_fmt, width, height); +} + /** * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where * available, this function will use special functionality for reading from such @@ -188,8 +204,8 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], * @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], +void av_image_copy_uc_from(uint8_t * const dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t * const src_data[4], const ptrdiff_t src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height); /** @@ -319,10 +335,40 @@ int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); * @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], +int av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4], enum AVPixelFormat pix_fmt, enum AVColorRange range, int width, int height); +/** + * Overwrite the image data with a color. 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, it is also replaced. Color component values + * are interpreted as native integers (or intfloats) regardless of actual pixel + * format endianness. + * + * 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 color the color components to be used for the fill + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param flags currently unused + * @return 0 if the image data was filled, a negative AVERROR code otherwise + */ +int av_image_fill_color(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, const uint32_t color[4], + int width, int height, int flags); + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/intreadwrite.h b/ThirdParty/ffmpeg/include/libavutil/intreadwrite.h index 4c8413a53..d0a5773b5 100644 --- a/ThirdParty/ffmpeg/include/libavutil/intreadwrite.h +++ b/ThirdParty/ffmpeg/include/libavutil/intreadwrite.h @@ -72,8 +72,6 @@ typedef union { # 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 @@ -215,7 +213,7 @@ typedef union { * by per-arch headers. */ -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; @@ -585,9 +583,7 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; #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. + * naturally aligned. */ #define AV_COPY(n, d, s) \ diff --git a/ThirdParty/ffmpeg/include/libavutil/mathematics.h b/ThirdParty/ffmpeg/include/libavutil/mathematics.h index e4aff1e97..e213bab68 100644 --- a/ThirdParty/ffmpeg/include/libavutil/mathematics.h +++ b/ThirdParty/ffmpeg/include/libavutil/mathematics.h @@ -36,30 +36,81 @@ #ifndef M_E #define M_E 2.7182818284590452354 /* e */ #endif +#ifndef M_Ef +#define M_Ef 2.7182818284590452354f /* e */ +#endif #ifndef M_LN2 #define M_LN2 0.69314718055994530942 /* log_e 2 */ #endif +#ifndef M_LN2f +#define M_LN2f 0.69314718055994530942f /* log_e 2 */ +#endif #ifndef M_LN10 #define M_LN10 2.30258509299404568402 /* log_e 10 */ #endif +#ifndef M_LN10f +#define M_LN10f 2.30258509299404568402f /* log_e 10 */ +#endif #ifndef M_LOG2_10 #define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ #endif +#ifndef M_LOG2_10f +#define M_LOG2_10f 3.32192809488736234787f /* log_2 10 */ +#endif #ifndef M_PHI #define M_PHI 1.61803398874989484820 /* phi / golden ratio */ #endif +#ifndef M_PHIf +#define M_PHIf 1.61803398874989484820f /* phi / golden ratio */ +#endif #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif +#ifndef M_PIf +#define M_PIf 3.14159265358979323846f /* pi */ +#endif #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 /* pi/2 */ #endif +#ifndef M_PI_2f +#define M_PI_2f 1.57079632679489661923f /* pi/2 */ +#endif +#ifndef M_PI_4 +#define M_PI_4 0.78539816339744830962 /* pi/4 */ +#endif +#ifndef M_PI_4f +#define M_PI_4f 0.78539816339744830962f /* pi/4 */ +#endif +#ifndef M_1_PI +#define M_1_PI 0.31830988618379067154 /* 1/pi */ +#endif +#ifndef M_1_PIf +#define M_1_PIf 0.31830988618379067154f /* 1/pi */ +#endif +#ifndef M_2_PI +#define M_2_PI 0.63661977236758134308 /* 2/pi */ +#endif +#ifndef M_2_PIf +#define M_2_PIf 0.63661977236758134308f /* 2/pi */ +#endif +#ifndef M_2_SQRTPI +#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ +#endif +#ifndef M_2_SQRTPIf +#define M_2_SQRTPIf 1.12837916709551257390f /* 2/sqrt(pi) */ +#endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif +#ifndef M_SQRT1_2f +#define M_SQRT1_2f 0.70710678118654752440f /* 1/sqrt(2) */ +#endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ #endif +#ifndef M_SQRT2f +#define M_SQRT2f 1.41421356237309504880f /* sqrt(2) */ +#endif #ifndef NAN #define NAN av_int2float(0x7fc00000) #endif @@ -237,6 +288,10 @@ int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int */ int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); +/** + * 0th order modified bessel function of the first kind. + */ +double av_bessel_i0(double x); /** * @} diff --git a/ThirdParty/ffmpeg/include/libavutil/mem.h b/ThirdParty/ffmpeg/include/libavutil/mem.h index c9c4fcf1f..ab7648ac5 100644 --- a/ThirdParty/ffmpeg/include/libavutil/mem.h +++ b/ThirdParty/ffmpeg/include/libavutil/mem.h @@ -27,12 +27,10 @@ #ifndef AVUTIL_MEM_H #define AVUTIL_MEM_H -#include +#include #include #include "attributes.h" -#include "avutil.h" -#include "version.h" /** * @addtogroup lavu_mem @@ -51,86 +49,6 @@ * @{ */ -#if FF_API_DECLARE_ALIGNED -/** - * - * @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 - -/** - * @} - */ -#endif - /** * @defgroup lavu_mem_attrs Function Attributes * Function attributes applicable to memory handling functions. @@ -239,14 +157,6 @@ av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); */ void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2); -#if FF_API_AV_MALLOCZ_ARRAY -/** - * @deprecated use av_calloc() - */ -attribute_deprecated -void *av_mallocz_array(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2); -#endif - /** * Allocate, reallocate, or free a block of memory. * diff --git a/ThirdParty/ffmpeg/include/libavutil/opt.h b/ThirdParty/ffmpeg/include/libavutil/opt.h index 461b5d3b6..e6013662f 100644 --- a/ThirdParty/ffmpeg/include/libavutil/opt.h +++ b/ThirdParty/ffmpeg/include/libavutil/opt.h @@ -43,6 +43,16 @@ * ("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. * + * There are two modes of access to members of AVOption and its child structs. + * One is called 'native access', and refers to access from the code that + * declares the AVOption in question. The other is 'foreign access', and refers + * to access from other code. + * + * Certain struct members in this header are documented as 'native access only' + * or similar - it means that only the code that declared the AVOption in + * question is allowed to access the field. This allows us to extend the + * semantics of those fields without breaking API compatibility. + * * @section avoptions_implement Implementing AVOptions * This section describes how to add AVOptions capabilities to a struct. * @@ -221,7 +231,7 @@ */ enum AVOptionType{ - AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_FLAGS = 1, AV_OPT_TYPE_INT, AV_OPT_TYPE_INT64, AV_OPT_TYPE_DOUBLE, @@ -238,13 +248,98 @@ enum AVOptionType{ AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational AV_OPT_TYPE_DURATION, AV_OPT_TYPE_COLOR, -#if FF_API_OLD_CHANNEL_LAYOUT - AV_OPT_TYPE_CHANNEL_LAYOUT, -#endif AV_OPT_TYPE_BOOL, AV_OPT_TYPE_CHLAYOUT, + + /** + * May be combined with another regular option type to declare an array + * option. + * + * For array options, @ref AVOption.offset should refer to a pointer + * corresponding to the option type. The pointer should be immediately + * followed by an unsigned int that will store the number of elements in the + * array. + */ + AV_OPT_TYPE_FLAG_ARRAY = (1 << 16), }; +/** + * A generic parameter which can be set by the user for muxing or encoding. + */ +#define AV_OPT_FLAG_ENCODING_PARAM (1 << 0) +/** + * A generic parameter which can be set by the user for demuxing or decoding. + */ +#define AV_OPT_FLAG_DECODING_PARAM (1 << 1) +#define AV_OPT_FLAG_AUDIO_PARAM (1 << 3) +#define AV_OPT_FLAG_VIDEO_PARAM (1 << 4) +#define AV_OPT_FLAG_SUBTITLE_PARAM (1 << 5) +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT (1 << 6) +/** + * 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 (1 << 7) +/** + * A generic parameter which can be set by the user for bit stream filtering. + */ +#define AV_OPT_FLAG_BSF_PARAM (1 << 8) + +/** + * A generic parameter which can be set by the user at runtime. + */ +#define AV_OPT_FLAG_RUNTIME_PARAM (1 << 15) +/** + * A generic parameter which can be set by the user for filtering. + */ +#define AV_OPT_FLAG_FILTERING_PARAM (1 << 16) +/** + * Set if option is deprecated, users should refer to AVOption.help text for + * more information. + */ +#define AV_OPT_FLAG_DEPRECATED (1 << 17) +/** + * Set if option constants can also reside in child objects. + */ +#define AV_OPT_FLAG_CHILD_CONSTS (1 << 18) + +/** + * May be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options. + */ +typedef struct AVOptionArrayDef { + /** + * Native access only. + * + * Default value of the option, as would be serialized by av_opt_get() (i.e. + * using the value of sep as the separator). + */ + const char *def; + + /** + * Minimum number of elements in the array. When this field is non-zero, def + * must be non-NULL and contain at least this number of elements. + */ + unsigned size_min; + /** + * Maximum number of elements in the array, 0 when unlimited. + */ + unsigned size_max; + + /** + * Separator between array elements in string representations of this + * option, used by av_opt_set() and av_opt_get(). It must be a printable + * ASCII character, excluding alphanumeric and the backslash. A comma is + * used when sep=0. + * + * The separator and the backslash must be backslash-escaped in order to + * appear in string representations of the option value. + */ + char sep; +} AVOptionArrayDef; + /** * AVOption */ @@ -258,6 +353,8 @@ typedef struct AVOption { const char *help; /** + * Native access only. + * * The offset relative to the context structure where the option * value is stored. It should be 0 for named constants. */ @@ -265,6 +362,7 @@ typedef struct AVOption { enum AVOptionType type; /** + * Native access only, except when documented otherwise. * the default value for scalar options */ union { @@ -273,31 +371,22 @@ typedef struct AVOption { const char *str; /* TODO those are unused now */ AVRational q; + + /** + * Used for AV_OPT_TYPE_FLAG_ARRAY options. May be NULL. + * + * Foreign access to some members allowed, as noted in AVOptionArrayDef + * documentation. + */ + const AVOptionArrayDef *arr; } default_val; double min; ///< minimum valid value for the option double max; ///< maximum valid value for the option + /** + * A combination of AV_OPT_FLAG_*. + */ 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_RUNTIME_PARAM (1<<15) ///< a generic parameter which can be set by the user at runtime -#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 -#define AV_OPT_FLAG_CHILD_CONSTS (1<<18) ///< set if option constants can also reside in child objects -//FIXME think about enc-audio, ... style flags /** * The logical unit to which the option belongs. Non-constant @@ -376,15 +465,9 @@ typedef struct AVOptionRanges { } 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 + * @defgroup opt_mng AVOption (un)initialization and inspection. + * @{ */ -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. @@ -404,161 +487,37 @@ void av_opt_set_defaults(void *s); */ 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. + * Iterate over all AVOptions belonging to obj. * - * @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. + * @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 */ -int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); +const AVOption *av_opt_next(const void *obj, const AVOption *prev); /** - * Set all the options from a given dictionary on an object. + * Iterate over AVOptions-enabled children of obj. * - * @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() + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL */ -int av_opt_set_dict(void *obj, struct AVDictionary **options); - +void *av_opt_child_next(void *obj, void *prev); /** - * Set all the options from a given dictionary on an object. + * Iterate over potential AVOptions-enabled children of parent. * - * @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); -/** - * @} + * @param iter a pointer where iteration state is stored. + * @return AVClass corresponding to next potential child or NULL */ +const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter); #define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the given object first. */ @@ -633,31 +592,161 @@ 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. + * Show the obj options. * - * @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 + * @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 */ -const AVOption *av_opt_next(const void *obj, const AVOption *prev); +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); /** - * Iterate over AVOptions-enabled children of obj. + * 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 * - * @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); +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, +}; /** - * Iterate over potential AVOptions-enabled children of parent. - * - * @param iter a pointer where iteration state is stored. - * @return AVClass corresponding to next potential child or NULL + * @} */ -const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter); + +/** + * @defgroup opt_write Setting and modifying option values + * @{ + */ + +/** + * 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); + +/** + * 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); + +/** + * Copy options from src object into dest object. + * + * The underlying AVClass of both src and dest must coincide. The guarantee + * below does not apply if this is not fulfilled. + * + * 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. + * + * Even on error it is guaranteed that allocated options from src and dest + * no longer alias each other afterwards; in particular calling av_opt_free() + * on both src and dest is safe afterwards if dest has been memdup'ed from src. + * + * @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); /** * @defgroup opt_set_funcs Option setting functions @@ -697,10 +786,6 @@ int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_ 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); -#if FF_API_OLD_CHANNEL_LAYOUT -attribute_deprecated -int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); -#endif int av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *layout, int search_flags); /** * @note Any old dictionary present is discarded and replaced with a copy of the new one. The @@ -726,6 +811,12 @@ int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, in /** * @} + * @} + */ + +/** + * @defgroup opt_read Reading option values + * @{ */ /** @@ -756,10 +847,6 @@ int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_ 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); -#if FF_API_OLD_CHANNEL_LAYOUT -attribute_deprecated -int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); -#endif int av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *layout); /** * @param[out] out_val The returned dictionary is a copy of the actual value and must @@ -769,6 +856,31 @@ int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDiction /** * @} */ + +/** + * @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); +/** + * @} + */ + /** * Gets a pointer to the requested field in a struct. * This function allows accessing a struct even when its fields are moved or @@ -779,61 +891,6 @@ int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDiction */ 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. - * - * The underlying AVClass of both src and dest must coincide. The guarantee - * below does not apply if this is not fulfilled. - * - * 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. - * - * Even on error it is guaranteed that allocated options from src and dest - * no longer alias each other afterwards; in particular calling av_opt_free() - * on both src and dest is safe afterwards if dest has been memdup'ed from src. - * - * @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. * @@ -860,6 +917,15 @@ int av_opt_is_set_to_default(void *obj, const AVOption *o); */ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); +/** + * 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); #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. @@ -884,6 +950,47 @@ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_fla */ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +/** + * 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); + +/** + * 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); + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/pixdesc.h b/ThirdParty/ffmpeg/include/libavutil/pixdesc.h index 0df73e6ef..ba2f63281 100644 --- a/ThirdParty/ffmpeg/include/libavutil/pixdesc.h +++ b/ThirdParty/ffmpeg/include/libavutil/pixdesc.h @@ -157,6 +157,11 @@ typedef struct AVPixFmtDescriptor { */ #define AV_PIX_FMT_FLAG_FLOAT (1 << 9) +/** + * The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale). + */ +#define AV_PIX_FMT_FLAG_XYZ (1 << 10) + /** * 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 diff --git a/ThirdParty/ffmpeg/include/libavutil/pixfmt.h b/ThirdParty/ffmpeg/include/libavutil/pixfmt.h index 224670a73..4aa20e4e5 100644 --- a/ThirdParty/ffmpeg/include/libavutil/pixfmt.h +++ b/ThirdParty/ffmpeg/include/libavutil/pixfmt.h @@ -32,6 +32,13 @@ #define AVPALETTE_SIZE 1024 #define AVPALETTE_COUNT 256 +/** + * Maximum number of planes in any pixel format. + * This should be used when a maximum is needed, but code should not + * be written to require a maximum for no good reason. + */ +#define AV_VIDEO_MAX_PLANES 4 + /** * Pixel format. * @@ -83,7 +90,7 @@ enum AVPixelFormat { 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_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)3R 3G 2B(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) @@ -206,8 +213,36 @@ enum AVPixelFormat { 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. + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + * + * Before FFmpeg 5.0: + * mfxFrameSurface1.Data.MemId contains a pointer when importing + * the following frames as QSV frames: + * + * VAAPI: + * mfxFrameSurface1.Data.MemId contains a pointer to VASurfaceID + * + * DXVA2: + * mfxFrameSurface1.Data.MemId contains a pointer to IDirect3DSurface9 + * + * FFmpeg 5.0 and above: + * mfxFrameSurface1.Data.MemId contains a pointer to the mfxHDLPair + * structure when importing the following frames as QSV frames: + * + * VAAPI: + * mfxHDLPair.first contains a VASurfaceID pointer. + * mfxHDLPair.second is always MFX_INFINITE. + * + * DXVA2: + * mfxHDLPair.first contains IDirect3DSurface9 pointer. + * mfxHDLPair.second is always MFX_INFINITE. + * + * D3D11: + * mfxHDLPair.first contains a ID3D11Texture2D pointer. + * mfxHDLPair.second contains the texture array index of the frame if the + * ID3D11Texture2D is an array texture, or always MFX_INFINITE if it is a + * normal texture. */ AV_PIX_FMT_QSV, /** @@ -260,10 +295,6 @@ enum AVPixelFormat { 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 -#if FF_API_XVMC - AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing -#endif - 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 @@ -392,6 +423,22 @@ enum AVPixelFormat { AV_PIX_FMT_RGBAF32BE, ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., big-endian AV_PIX_FMT_RGBAF32LE, ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., little-endian + AV_PIX_FMT_P212BE, ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, big-endian + AV_PIX_FMT_P212LE, ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, little-endian + + AV_PIX_FMT_P412BE, ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, big-endian + AV_PIX_FMT_P412LE, ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, little-endian + + AV_PIX_FMT_GBRAP14BE, ///< planar GBR 4:4:4:4 56bpp, big-endian + AV_PIX_FMT_GBRAP14LE, ///< planar GBR 4:4:4:4 56bpp, little-endian + + /** + * Hardware surfaces for Direct3D 12. + * + * data[0] points to an AVD3D12VAFrame + */ + AV_PIX_FMT_D3D12, + 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 }; @@ -450,6 +497,7 @@ enum AVPixelFormat { #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_GBRAP14 AV_PIX_FMT_NE(GBRAP14BE, GBRAP14LE) #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) @@ -490,6 +538,8 @@ enum AVPixelFormat { #define AV_PIX_FMT_P210 AV_PIX_FMT_NE(P210BE, P210LE) #define AV_PIX_FMT_P410 AV_PIX_FMT_NE(P410BE, P410LE) +#define AV_PIX_FMT_P212 AV_PIX_FMT_NE(P212BE, P212LE) +#define AV_PIX_FMT_P412 AV_PIX_FMT_NE(P412BE, P412LE) #define AV_PIX_FMT_P216 AV_PIX_FMT_NE(P216BE, P216LE) #define AV_PIX_FMT_P416 AV_PIX_FMT_NE(P416BE, P416LE) diff --git a/ThirdParty/ffmpeg/include/libavutil/random_seed.h b/ThirdParty/ffmpeg/include/libavutil/random_seed.h index 0462a048e..8a47be967 100644 --- a/ThirdParty/ffmpeg/include/libavutil/random_seed.h +++ b/ThirdParty/ffmpeg/include/libavutil/random_seed.h @@ -21,6 +21,7 @@ #ifndef AVUTIL_RANDOM_SEED_H #define AVUTIL_RANDOM_SEED_H +#include #include /** * @addtogroup lavu_crypto @@ -36,6 +37,19 @@ */ uint32_t av_get_random_seed(void); +/** + * Generate cryptographically secure random data, i.e. suitable for use as + * encryption keys and similar. + * + * @param buf buffer into which the random data will be written + * @param len size of buf in bytes + * + * @retval 0 success, len bytes of random data was written + * into buf + * @retval "a negative AVERROR code" random data could not be generated + */ +int av_random_bytes(uint8_t *buf, size_t len); + /** * @} */ diff --git a/ThirdParty/ffmpeg/include/libavutil/rational.h b/ThirdParty/ffmpeg/include/libavutil/rational.h index 8cbfc8e06..849f47f38 100644 --- a/ThirdParty/ffmpeg/include/libavutil/rational.h +++ b/ThirdParty/ffmpeg/include/libavutil/rational.h @@ -168,6 +168,10 @@ static av_always_inline AVRational av_inv_q(AVRational q) * In case of infinity, the returned value is expressed as `{1, 0}` or * `{-1, 0}` depending on the sign. * + * In general rational numbers with |num| <= 1<<26 && |den| <= 1<<26 + * can be recovered exactly from their double representation. + * (no exceptions were found within 1B random ones) + * * @param d `double` to convert * @param max Maximum allowed numerator and denominator * @return `d` in AVRational form diff --git a/ThirdParty/ffmpeg/include/libavutil/samplefmt.h b/ThirdParty/ffmpeg/include/libavutil/samplefmt.h index 6bad0e254..43a57a422 100644 --- a/ThirdParty/ffmpeg/include/libavutil/samplefmt.h +++ b/ThirdParty/ffmpeg/include/libavutil/samplefmt.h @@ -246,7 +246,7 @@ int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int * @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 av_samples_copy(uint8_t * const *dst, uint8_t * const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt); @@ -259,7 +259,7 @@ int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, * @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 av_samples_set_silence(uint8_t * const *audio_data, int offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt); /** diff --git a/ThirdParty/ffmpeg/include/libavutil/timecode.h b/ThirdParty/ffmpeg/include/libavutil/timecode.h index 060574a17..fe0fc8357 100644 --- a/ThirdParty/ffmpeg/include/libavutil/timecode.h +++ b/ThirdParty/ffmpeg/include/libavutil/timecode.h @@ -98,8 +98,8 @@ uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss /** * 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 buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long * @param framenum frame number * @return the buf parameter * @@ -149,13 +149,13 @@ 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 + * @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) * @return 0 on success, AVERROR otherwise */ int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); @@ -163,8 +163,6 @@ int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start /** * Init a timecode struct from the passed timecode components. * - * @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, ... @@ -173,6 +171,8 @@ int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start * @param mm minutes * @param ss seconds * @param ff frames + * @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) * @return 0 on success, AVERROR otherwise */ int av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, int hh, int mm, int ss, int ff, void *log_ctx); @@ -180,11 +180,11 @@ int av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, /** * 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 + * @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). * @return 0 on success, AVERROR otherwise */ int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); diff --git a/ThirdParty/ffmpeg/include/libavutil/timestamp.h b/ThirdParty/ffmpeg/include/libavutil/timestamp.h index e082f01b4..fa53a46b9 100644 --- a/ThirdParty/ffmpeg/include/libavutil/timestamp.h +++ b/ThirdParty/ffmpeg/include/libavutil/timestamp.h @@ -24,7 +24,7 @@ #ifndef AVUTIL_TIMESTAMP_H #define AVUTIL_TIMESTAMP_H -#include "common.h" +#include "avutil.h" #if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) #error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS @@ -62,11 +62,18 @@ static inline char *av_ts_make_string(char *buf, int64_t ts) * @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) +char *av_ts_make_time_string2(char *buf, int64_t ts, AVRational tb); + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @see av_ts_make_time_string2 + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, + const 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; + return av_ts_make_time_string2(buf, ts, *tb); } /** diff --git a/ThirdParty/ffmpeg/include/libavutil/tx.h b/ThirdParty/ffmpeg/include/libavutil/tx.h index 3de2f7231..4696988ca 100644 --- a/ThirdParty/ffmpeg/include/libavutil/tx.h +++ b/ThirdParty/ffmpeg/include/libavutil/tx.h @@ -75,7 +75,9 @@ enum AVTXType { * the double variant, it's a 'double'. If scale is NULL, 1.0 will be used * as a default. * - * The stride parameter must be set to the size of a single sample in bytes. + * For forward transforms (R2C), stride must be the spacing between two + * samples in bytes. For inverse transforms, the stride must be set + * to the spacing between two complex values in bytes. * * The forward transform performs a real-to-complex DFT of N samples to * N/2+1 complex values. @@ -89,6 +91,44 @@ enum AVTXType { AV_TX_DOUBLE_RDFT = 7, AV_TX_INT32_RDFT = 8, + /** + * Real to real (DCT) transforms. + * + * The forward transform is a DCT-II. + * The inverse transform is a DCT-III. + * + * The input array is always overwritten. DCT-III requires that the + * input be padded with 2 extra samples. Stride must be set to the + * spacing between two samples in bytes. + */ + AV_TX_FLOAT_DCT = 9, + AV_TX_DOUBLE_DCT = 10, + AV_TX_INT32_DCT = 11, + + /** + * Discrete Cosine Transform I + * + * The forward transform is a DCT-I. + * The inverse transform is a DCT-I multiplied by 2/(N + 1). + * + * The input array is always overwritten. + */ + AV_TX_FLOAT_DCT_I = 12, + AV_TX_DOUBLE_DCT_I = 13, + AV_TX_INT32_DCT_I = 14, + + /** + * Discrete Sine Transform I + * + * The forward transform is a DST-I. + * The inverse transform is a DST-I multiplied by 2/(N + 1). + * + * The input array is always overwritten. + */ + AV_TX_FLOAT_DST_I = 15, + AV_TX_DOUBLE_DST_I = 16, + AV_TX_INT32_DST_I = 17, + /* Not part of the API, do not use */ AV_TX_NB, }; @@ -115,9 +155,8 @@ typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); */ enum AVTXFlags { /** - * Performs an in-place transformation on the input. The output argument - * of av_tn_fn() MUST match the input. May be unsupported or slower for some - * transform types. + * Allows for in-place transformations, where input == output. + * May be unsupported or slower for some transform types. */ AV_TX_INPLACE = 1ULL << 0, @@ -134,6 +173,16 @@ enum AVTXFlags { * Ignored for all transforms but inverse MDCTs. */ AV_TX_FULL_IMDCT = 1ULL << 2, + + /** + * Perform a real to half-complex RDFT. + * Only the real, or imaginary coefficients will + * be output, depending on the flag used. Only available for forward RDFTs. + * Output array must have enough space to hold N complex values + * (regular size for a real to complex transform). + */ + AV_TX_REAL_TO_REAL = 1ULL << 3, + AV_TX_REAL_TO_IMAGINARY = 1ULL << 4, }; /** diff --git a/ThirdParty/ffmpeg/include/libavutil/version.h b/ThirdParty/ffmpeg/include/libavutil/version.h index cb0c928bd..0a3f5dd0c 100644 --- a/ThirdParty/ffmpeg/include/libavutil/version.h +++ b/ThirdParty/ffmpeg/include/libavutil/version.h @@ -78,9 +78,9 @@ * @{ */ -#define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 39 -#define LIBAVUTIL_VERSION_MICRO 101 +#define LIBAVUTIL_VERSION_MAJOR 59 +#define LIBAVUTIL_VERSION_MINOR 8 +#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ @@ -105,16 +105,13 @@ * @{ */ -#define FF_API_D2STR (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_DECLARE_ALIGNED (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_COLORSPACE_NAME (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_AV_FOPEN_UTF8 (LIBAVUTIL_VERSION_MAJOR < 58) -#define FF_API_PKT_DURATION (LIBAVUTIL_VERSION_MAJOR < 58) +#define FF_API_HDR_VIVID_THREE_SPLINE (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_FRAME_PKT (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_INTERLACED_FRAME (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_FRAME_KEY (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_PALETTE_HAS_CHANGED (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_VULKAN_CONTIGUOUS_MEMORY (LIBAVUTIL_VERSION_MAJOR < 60) +#define FF_API_H274_FILM_GRAIN_VCS (LIBAVUTIL_VERSION_MAJOR < 60) /** * @} diff --git a/ThirdParty/ffmpeg/include/libavutil/video_enc_params.h b/ThirdParty/ffmpeg/include/libavutil/video_enc_params.h index fc0c3bc1a..62265a5c0 100644 --- a/ThirdParty/ffmpeg/include/libavutil/video_enc_params.h +++ b/ThirdParty/ffmpeg/include/libavutil/video_enc_params.h @@ -136,8 +136,8 @@ typedef struct AVVideoBlockParams { int32_t delta_qp; } AVVideoBlockParams; -/* - * Get the block at the specified {@code idx}. Must be between 0 and nb_blocks. +/** + * Get the block at the specified {@code idx}. Must be between 0 and nb_blocks - 1. */ static av_always_inline AVVideoBlockParams* av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx) diff --git a/ThirdParty/ffmpeg/include/libavutil/video_hint.h b/ThirdParty/ffmpeg/include/libavutil/video_hint.h new file mode 100644 index 000000000..1b2196093 --- /dev/null +++ b/ThirdParty/ffmpeg/include/libavutil/video_hint.h @@ -0,0 +1,107 @@ +/** + * Copyright 2023 Elias Carotti + * + * 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_VIDEO_HINT_H +#define AVUTIL_VIDEO_HINT_H + +#include +#include +#include "libavutil/avassert.h" +#include "libavutil/frame.h" + +typedef struct AVVideoRect { + uint32_t x, y; + uint32_t width, height; +} AVVideoRect; + +typedef enum AVVideoHintType { + /* rectangled delimit the constant areas (unchanged), default is changed */ + AV_VIDEO_HINT_TYPE_CONSTANT, + + /* rectangled delimit the constant areas (changed), default is not changed */ + AV_VIDEO_HINT_TYPE_CHANGED, +} AVVideoHintType; + +typedef struct AVVideoHint { + /** + * Number of AVVideoRect present. + * + * May be 0, in which case no per-rectangle information is present. In this + * case the values of rect_offset / rect_size are unspecified and should + * not be accessed. + */ + size_t nb_rects; + + /** + * Offset in bytes from the beginning of this structure at which the array + * of AVVideoRect starts. + */ + size_t rect_offset; + + /** + * Size in bytes of AVVideoRect. + */ + size_t rect_size; + + AVVideoHintType type; +} AVVideoHint; + +static av_always_inline AVVideoRect * +av_video_hint_rects(const AVVideoHint *hints) { + return (AVVideoRect *)((uint8_t *)hints + hints->rect_offset); +} + +static av_always_inline AVVideoRect * +av_video_hint_get_rect(const AVVideoHint *hints, size_t idx) { + return (AVVideoRect *)((uint8_t *)hints + hints->rect_offset + idx * hints->rect_size); +} + +/** + * Allocate memory for the AVVideoHint struct along with an nb_rects-sized + * arrays of AVVideoRect. + * + * The side data contains a list of rectangles for the portions of the frame + * which changed from the last encoded one (and the remainder are assumed to be + * changed), or, alternately (depending on the type parameter) the unchanged + * ones (and the remanining ones are those which changed). + * Macroblocks will thus be hinted either to be P_SKIP-ped or go through the + * regular encoding procedure. + * + * It's responsibility of the caller to fill the AVRects accordingly, and to set + * the proper AVVideoHintType field. + * + * @param out_size if non-NULL, the size in bytes of the resulting data array is + * written here + * + * @return newly allocated AVVideoHint struct (must be freed by the caller using + * av_free()) on success, NULL on memory allocation failure + */ +AVVideoHint *av_video_hint_alloc(size_t nb_rects, + size_t *out_size); + +/** + * Same as av_video_hint_alloc(), except newly-allocated AVVideoHint is attached + * as side data of type AV_FRAME_DATA_VIDEO_HINT_INFO to frame. + */ +AVVideoHint *av_video_hint_create_side_data(AVFrame *frame, + size_t nb_rects); + + +#endif /* AVUTIL_VIDEO_HINT_H */ diff --git a/ThirdParty/ffmpeg/include/libswresample/swresample.h b/ThirdParty/ffmpeg/include/libswresample/swresample.h index d4dcaebdc..217e5461b 100644 --- a/ThirdParty/ffmpeg/include/libswresample/swresample.h +++ b/ThirdParty/ffmpeg/include/libswresample/swresample.h @@ -234,35 +234,6 @@ int swr_init(struct SwrContext *s); */ int swr_is_initialized(struct SwrContext *s); -#if FF_API_OLD_CHANNEL_LAYOUT -/** - * 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 - * @deprecated use @ref swr_alloc_set_opts2() - */ -attribute_deprecated -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); -#endif - /** * Allocate SwrContext if needed and set/reset common parameters. * @@ -340,8 +311,8 @@ void swr_close(struct SwrContext *s); * * @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); +int swr_convert(struct SwrContext *s, uint8_t * const *out, int out_count, + const uint8_t * const *in , int in_count); /** * Convert the next timestamp from input to output @@ -399,40 +370,6 @@ int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensatio */ int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); -#if FF_API_OLD_CHANNEL_LAYOUT -/** - * 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 - * @deprecated use @ref swr_build_matrix2() - */ -attribute_deprecated -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); -#endif - /** * Generate a channel mixing matrix. * diff --git a/ThirdParty/ffmpeg/include/libswresample/version.h b/ThirdParty/ffmpeg/include/libswresample/version.h index 4b9952d91..9c223e142 100644 --- a/ThirdParty/ffmpeg/include/libswresample/version.h +++ b/ThirdParty/ffmpeg/include/libswresample/version.h @@ -30,7 +30,7 @@ #include "version_major.h" -#define LIBSWRESAMPLE_VERSION_MINOR 9 +#define LIBSWRESAMPLE_VERSION_MINOR 1 #define LIBSWRESAMPLE_VERSION_MICRO 100 #define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ diff --git a/ThirdParty/ffmpeg/include/libswresample/version_major.h b/ThirdParty/ffmpeg/include/libswresample/version_major.h index 7f265c207..dd13f2bbe 100644 --- a/ThirdParty/ffmpeg/include/libswresample/version_major.h +++ b/ThirdParty/ffmpeg/include/libswresample/version_major.h @@ -26,6 +26,6 @@ * Libswresample version macros */ -#define LIBSWRESAMPLE_VERSION_MAJOR 4 +#define LIBSWRESAMPLE_VERSION_MAJOR 5 #endif /* SWRESAMPLE_VERSION_MAJOR_H */ diff --git a/ThirdParty/libraries-debug-overlay.tar.xz b/ThirdParty/libraries-debug-overlay.tar.xz index 595091bc85f0459ab78b199eabbcd197ed9bff77..dc472eb0e918895d78e902acf245aff61b7afa24 100644 GIT binary patch literal 2760352 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 wh*>!O$Jk-iQmgb(c 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

U$GC0!2vRvLNmgBTR7gbX81Vf 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%0Dtec&v_ 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 z%0A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

$J*dY4V4dA>)N*Z)?JBX%OS6BxDyQ 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­oF#&&c(U#d|>_m!;v) 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 z zuCTs+n`rF{=AiD+HI9}UQ#HW9#}DyBpuTWLXg?5NzDfD24j?Ig2Y+G|5fKf)|nTwYTiZmtnI)X$k#%l=};`RN?@x3ix}CPnrZE z5N5Y!siv_Ly-0DE?Q2jx#)=tRqIO<3mPM{Rn35rxU?lYx-~Z#dy@ki+Jf;sZ)sB|| zJybC}+V;V2AdpBiL|r52W5Q@#n7cD48&?;zRv@66c>q0BO)iLWi$|VxZ_774>!!&h zg^9uzyBIA=lUqXT`A=XBxx8@XhJ?z#Xjr{Ql|_+M*rFy+tCdJ5WDMg|h|EP8io?YK zWba;#;??3_R+b{(yqlcNUYf9L(TJ?WX<>s+q9-US+v#mWV6=jCaCbFBvj;jsb9hYP z>>isYXo_SC@Ng^JRa7Ra6JFyV=wGScF1^mq8lml17>-Nd-=;%x4C6)r&*}Gt|36Tx z|Ls@&?;D7(%)NE{g^G=o!S=`T0Nou6?_&=2@&`-b}&s;%}(h^aoFZJtO7s z0BvsgJ%7RmS-B+ta(hI0?3TM~*Dqrq*%HF2RZWct`e*__KnYd+v?VY8rB|)>87Fa22rW5Q^CX9cJC90S+Pb7DG{jO zW!^QH^WJBxG<9dol2*nIob^VsCv|M92o*xb1YPLvwx~oa4PTN_!B@>%o|AH~O`9l3 zX7Qzz1X67J5v&XX8qoSPShc({>c&OW+BG=&f2l<=hphC#B|sutu})72Cl1ltRdduw zYWP~0lP>ZgWL6iN$c*?`lbhs+QMF{ zVGtBx5^P4IPbZ$qfqb}h)5&N?L!eN#9zkTK`Ye(XRPp9Q_EkPxqpa)LGaI2Q#BPao z{rK+AY;c1Fqy6|uq-~vd2SaRAcvajz$;nzzu)~>%S_HLk-P=hG&QA>Ng2tK-l${?7 z_kHw}fB!_t=Vo{Pb0*j8*9v6SlYNsTu@JWRXFRh+_Vo_QZUfnw>{ZHjF=%j198K59 zpyYW_b`Yv+D+|nupE{~*T>-$QP8AX3w{K}WF5LWG%6>#QCcLrN5R*rK z?K)_;=}x`DlafoNgmjc2&0j-K)Ht$p5-hAOOaE#EIzTK4@uiBQ0 zN@E9n5U=pyuZ^TfpJI-MKhMR+E-bP>`P_{1x)M;KTB5dW5sRe;#-KJ2j$Ky7tFJ3`CUa`WcVm$rZBUyq%sAGhh0R)TA8hu|UJ@waBVcYwFcTmzm_; zbKK72%TNU#JDkCCw!NJ3s_CPKEtnVr@x6oNMq6xq-yYU{2-^PN+*(ps>-f4CmyEhG z%8GsCgQ1cK1<#awxgZ#TliBuM6b8qWAy-U_oR)-Sm-NeobK9^K8qBKjVWP#SE4pqCbOLU>q! zv^Uc=48T*u!sZrU-TJopJ6~2=nPDp>9-;XgkuIFuJg_MU2pAatb)>wh0jH8&x0)Xl zMb3iOfQ4eMQ+;3D=hZ9UsG8WE2}5c)j?Smlj1?>u3 z=0D%E#>T79MuQQCFkO@20^D!DCZNZz#TU$*&0oz%`NRr2O z2!CIzhP!JHw0O%acMi>uH%?6~oED^s4NcwF^&+l62Nhw?#!s8}44t_OwC;~xA2F>P z8j9(4D>XIY6f8aDYAyf|+!m>+Id7mgu;rE7IpH3@U{duoR?~w~=8Eu~sdPFTTQl>k zo|J&k972OTt;c!4%3Gva+0hP`fzT<=H|NSHRDiSSzS`U~%6%%2e;5lBfT#UW95Ouq z!Y=H^-fSPdaM-vYg9%`Ig-;#fe*&+ao!}eGw67Us{{ylZPG6`WDq~8mFgkJzHr}m? z%Qe_!+x&k#)@_jQFbV`H8GC=CW5ffc8jW z;*ob{f=0*Jz&CB7SNuTj!tU8X#hi8-&1_yYAe4a~9>$L1Tp5f0na|v+#sIWYG4-*t zE1KYQwyn?>9QP23X%O~no@>tjX9Mz;Rh>k6R}Er9rs+}f=-6(Wpcn*Fi1gRAMer=n z&_!&{b^D-!{ux$14DK+1t7omNJZ{)=8eakyzBu&13(EWcnIz5(1nU4ur~PM)y8iJ8 zLo$Tilaqy`jP%++(X?@Xne@avhtsM;oSF zndSr~l2oQ1#YSs;tpvfR$qFT@6(o}u+fBRf-M60W${AXWs+qEo>Za#~NNOZ?K4Z@Cl`H zOmKn^34FT+;=e+ZGfSa??(dgnTuc4S46p4OzDV|5-B6h&N#!-#q<>t;*(0tC6M0qOK9Ar$lB%!0xa_+s&^rTbo#r|fK^l~@;%pG%6Ti+GO*IYvihk1 z*hUbBf?*bggsLUxD@Tlntf*gYfl@$HFJVBZeSZ_w9#m_f3>Gb6yN?_TOQ!4NR@w30 zXaePXK&xK}J2BLJ}gZq9~aAyChbh7sas~nCZrmh79(M6UT}* z;>e`3H}5@?O^GZ6eh7OggK7^Ac@&>3z@g79`aFpIpr;yZ29Qd61V|mM?8CteDl-m7 zE#oa>lG+j8|i|8#kZ$y*uR&I*CAe>B*3x6~KNrNxnNad`(vzO$L(!EWRGE9lZlw*Cq5$ z(CK1p{pzqPuA?qK z)jN~6?d%CpuVtJ-$b(pWl6V;1md*iSPOe&*R)dzCxg$?&DVY<^b~#X{inY4btKy0y zLhdnms$kzHuz_-SeL*pv{o+zyb=ueNt63S9U&Ro=rZ4%Oim60cjw#C~${i#a6mCz1 z5Pehof*k}l{#k)qcJQdsKu-+;_LHj;)8>M2rRsodmCCGT(W$B#8HYV1ic8XaY_)xhO$ z)w6e&#hzKLKY}ASB+-!xtpXZBPe)~y#c|@^(o*=RRis^Kd}Ou$@atfNRC0P~CU2bK z$FcN~G-@%?E97yO1^YV>Of89A!66W8SsZ72q7&vqRq*xE5r7@v%TvM|9Jk32PLMF-j~@Xm3Dr&II2Ad@$&+WZ04i zy%j#v>hwUp7@ls2#pBmUj4?63uSMwBhl@4QeXPnTA^5~n7B)*a`E|cboMEty_g*Y; zBRZNR&CQ$EA65I?l0nOiJmq789!RvY&}YckAvsB;z4IXQ$V`r*2zJSM{!|j?;B2HKIr$dyf`6# z_e58p?`K0K%}L1C=^4vms!{b=*c|d|FXMk{kVPj4zCvij#?1CpXP3=x)4)ngA7TGz zaMsUA-DXIL&?Db~z@PT1SJ0y-;IlY@OaJTiZq_3D0{r{#Dt3kf9)c({d(9_oiF_=5(GVw{uulpZNo z@5yC_C9I0s>zM2(_THlxICz3p=vN_Kn(Q3~xq)~d#Ln7!z4c$v1`hzthJ-erl%>aE zZyRujPylxRK2G+;G9weoaGBGzAL&&4g>X3;1u-DneRN<9km+exPs&pN&c?L2Ef8Lg zY#|=}O%ZX8jb}Ev-XLPsBSDK^gl56D9+(zIcfxrRoKMwLSu?wNwvJCq$_*!VK#zB` zRS4?;N;HivJ9G}knC;Gt7qRCcq|!qxkNZL&c4r<;eZaMm#@R(-DYabzvMMOFaoLhn zK<8J)z8F^~Pk9%?FFu1D-m)-|=t%NzMXIh|&=KwQ1@0q-Nha`9P8ys*t=ptG=xl${ zbNF|_zEU$HBm7+fCgzh*KHGna!@F8?;@U=wU&|be^$g3}*1_5(&W*(ZD4MDGTtjo9 zM=L2OgY_?;);ksFcx`PSOAs3FX>bfD^N$_=**49XDH29!wyA2IVYDl7xzF&dQeFwq zBoQfy^U@Dv70d(I7D?J06yR}D)dLL8XNr?leSGeBl}w!;#%oe1M#9vE2&J5{WN^A; z4oR=e6U$GeJk+e4Eo_sYsZ3(Ck*JCzd^!M?T|LI+xi9L;!GvsD$1yX#2U_yi*caFSxa#*FZljqwxo)HOkv8=2`!XT-~mWV3A8HZ z6UTRfGP4SpmwpEUid;RIka@T_^xEqM0vcnh>sWek!HY&~E{L}~R$V<)+4Nng@Pz@wt5{aFLO#SePa&sH@z$CZG|-3RA&e8Tt(UKhGd zhgObt8`Je(g9J2m$C%;CU9|1lsOk?otJg}0le1B~(bp<;s{b#a^Bw4@)Fl1im^Hhx z6Uj&0@yos%k(NX}jTjJ^S}z$Dt$Ld_$xAxoWGDJ`xw zCsuMAdtWxVAcu{45yt6diKtQ(;~JG6fi$m~l<@4(rwI9nOD4fiQM|*CX485WH^pYN z6%cfV5zFxY*dS4~3cTdo+CWI^?2xdxN3@YC%0DfN3qLQQwF$>>%)?@|(kd^!q~=kI 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