From 548a1e4e885090bbab31913e98f6d0b5fb7098a8 Mon Sep 17 00:00:00 2001 From: Gangphon Date: Sun, 23 Apr 2023 10:04:49 +0800 Subject: [PATCH] ledok --- .gitignore | 1 + LedOK/LedOK.pro | 74 +- LedOK/base/aboutdlg.cpp | 43 - LedOK/base/aboutdlg.h | 12 - LedOK/device/ctrlnetworkpanel.cpp | 2 +- LedOK/ffmpeg-mac/COPYING.GPLv2 | 339 ++ LedOK/ffmpeg-mac/COPYING.GPLv3 | 674 ++++ LedOK/ffmpeg-mac/COPYING.LGPLv2.1 | 502 +++ LedOK/ffmpeg-mac/COPYING.LGPLv3 | 165 + LedOK/ffmpeg-mac/Changelog | 2070 +++++++++++ LedOK/ffmpeg-mac/INSTALL_RECEIPT.json | 492 +++ LedOK/ffmpeg-mac/LICENSE.md | 129 + LedOK/ffmpeg-mac/README.md | 46 + LedOK/ffmpeg-mac/bin/aviocat | Bin 0 -> 99728 bytes LedOK/ffmpeg-mac/bin/bisect-create | 46 + LedOK/ffmpeg-mac/bin/cl2c | 36 + LedOK/ffmpeg-mac/bin/clean-diff | 11 + LedOK/ffmpeg-mac/bin/crypto_bench | Bin 0 -> 53952 bytes LedOK/ffmpeg-mac/bin/cws2fws | Bin 0 -> 50232 bytes LedOK/ffmpeg-mac/bin/dvd2concat | 161 + LedOK/ffmpeg-mac/bin/enum_options | Bin 0 -> 132064 bytes LedOK/ffmpeg-mac/bin/ffescape | Bin 0 -> 50440 bytes LedOK/ffmpeg-mac/bin/ffeval | Bin 0 -> 50344 bytes LedOK/ffmpeg-mac/bin/ffhash | Bin 0 -> 50584 bytes LedOK/ffmpeg-mac/bin/ffmpeg | Bin 0 -> 364800 bytes LedOK/ffmpeg-mac/bin/ffplay | Bin 0 -> 220800 bytes LedOK/ffmpeg-mac/bin/ffprobe | Bin 0 -> 265568 bytes LedOK/ffmpeg-mac/bin/fourcc2pixfmt | Bin 0 -> 83016 bytes LedOK/ffmpeg-mac/bin/gen-rc | 120 + LedOK/ffmpeg-mac/bin/graph2dot | Bin 0 -> 116384 bytes LedOK/ffmpeg-mac/bin/ismindex | Bin 0 -> 100896 bytes LedOK/ffmpeg-mac/bin/libav-merge-next-commit | 22 + LedOK/ffmpeg-mac/bin/loudnorm.rb | 61 + LedOK/ffmpeg-mac/bin/make_chlayout_test | 114 + LedOK/ffmpeg-mac/bin/missing_codec_desc | 36 + LedOK/ffmpeg-mac/bin/murge | 11 + LedOK/ffmpeg-mac/bin/normalize.py | 33 + LedOK/ffmpeg-mac/bin/patcheck | 180 + LedOK/ffmpeg-mac/bin/pktdumper | Bin 0 -> 99944 bytes LedOK/ffmpeg-mac/bin/plotframes | 164 + LedOK/ffmpeg-mac/bin/probetest | Bin 0 -> 99256 bytes LedOK/ffmpeg-mac/bin/qt-faststart | Bin 0 -> 50384 bytes LedOK/ffmpeg-mac/bin/scale_slice_test | Bin 0 -> 133568 bytes LedOK/ffmpeg-mac/bin/seek_print | Bin 0 -> 99656 bytes LedOK/ffmpeg-mac/bin/sidxindex | Bin 0 -> 100104 bytes LedOK/ffmpeg-mac/bin/target_dec_fate.sh | 83 + LedOK/ffmpeg-mac/bin/trasher | Bin 0 -> 49824 bytes LedOK/ffmpeg-mac/bin/uncoded_frame | Bin 0 -> 134408 bytes LedOK/ffmpeg-mac/bin/unwrap-diff | 2 + LedOK/ffmpeg-mac/bin/venc_data_dump | Bin 0 -> 100112 bytes LedOK/ffmpeg-mac/bin/zmqsend | Bin 0 -> 116584 bytes LedOK/ffmpeg-mac/bin/zmqshell.py | 26 + .../include/libavcodec/ac3_parser.h | 36 + .../include/libavcodec/adts_parser.h | 37 + LedOK/ffmpeg-mac/include/libavcodec/avcodec.h | 3192 +++++++++++++++++ LedOK/ffmpeg-mac/include/libavcodec/avdct.h | 88 + LedOK/ffmpeg-mac/include/libavcodec/avfft.h | 118 + LedOK/ffmpeg-mac/include/libavcodec/bsf.h | 332 ++ LedOK/ffmpeg-mac/include/libavcodec/codec.h | 375 ++ .../include/libavcodec/codec_desc.h | 128 + .../ffmpeg-mac/include/libavcodec/codec_id.h | 661 ++++ .../ffmpeg-mac/include/libavcodec/codec_par.h | 247 ++ LedOK/ffmpeg-mac/include/libavcodec/d3d11va.h | 112 + LedOK/ffmpeg-mac/include/libavcodec/defs.h | 192 + LedOK/ffmpeg-mac/include/libavcodec/dirac.h | 131 + .../include/libavcodec/dv_profile.h | 82 + LedOK/ffmpeg-mac/include/libavcodec/dxva2.h | 93 + LedOK/ffmpeg-mac/include/libavcodec/jni.h | 46 + .../include/libavcodec/mediacodec.h | 103 + LedOK/ffmpeg-mac/include/libavcodec/packet.h | 731 ++++ LedOK/ffmpeg-mac/include/libavcodec/qsv.h | 109 + LedOK/ffmpeg-mac/include/libavcodec/vdpau.h | 157 + LedOK/ffmpeg-mac/include/libavcodec/version.h | 45 + .../include/libavcodec/version_major.h | 52 + .../include/libavcodec/videotoolbox.h | 150 + .../include/libavcodec/vorbis_parser.h | 74 + LedOK/ffmpeg-mac/include/libavcodec/xvmc.h | 171 + .../ffmpeg-mac/include/libavdevice/avdevice.h | 397 ++ .../ffmpeg-mac/include/libavdevice/version.h | 45 + .../include/libavdevice/version_major.h | 36 + .../ffmpeg-mac/include/libavfilter/avfilter.h | 1491 ++++++++ .../include/libavfilter/buffersink.h | 173 + .../include/libavfilter/buffersrc.h | 218 ++ .../ffmpeg-mac/include/libavfilter/version.h | 48 + .../include/libavfilter/version_major.h | 38 + .../ffmpeg-mac/include/libavformat/avformat.h | 2826 +++++++++++++++ LedOK/ffmpeg-mac/include/libavformat/avio.h | 837 +++++ .../ffmpeg-mac/include/libavformat/version.h | 47 + .../include/libavformat/version_major.h | 52 + LedOK/ffmpeg-mac/include/libavutil/adler32.h | 63 + LedOK/ffmpeg-mac/include/libavutil/aes.h | 69 + LedOK/ffmpeg-mac/include/libavutil/aes_ctr.h | 99 + .../libavutil/ambient_viewing_environment.h | 72 + .../ffmpeg-mac/include/libavutil/attributes.h | 173 + .../ffmpeg-mac/include/libavutil/audio_fifo.h | 186 + LedOK/ffmpeg-mac/include/libavutil/avassert.h | 75 + LedOK/ffmpeg-mac/include/libavutil/avconfig.h | 6 + LedOK/ffmpeg-mac/include/libavutil/avstring.h | 429 +++ LedOK/ffmpeg-mac/include/libavutil/avutil.h | 371 ++ LedOK/ffmpeg-mac/include/libavutil/base64.h | 72 + LedOK/ffmpeg-mac/include/libavutil/blowfish.h | 82 + LedOK/ffmpeg-mac/include/libavutil/bprint.h | 251 ++ LedOK/ffmpeg-mac/include/libavutil/bswap.h | 111 + LedOK/ffmpeg-mac/include/libavutil/buffer.h | 322 ++ LedOK/ffmpeg-mac/include/libavutil/camellia.h | 70 + LedOK/ffmpeg-mac/include/libavutil/cast5.h | 80 + .../include/libavutil/channel_layout.h | 783 ++++ LedOK/ffmpeg-mac/include/libavutil/common.h | 578 +++ LedOK/ffmpeg-mac/include/libavutil/cpu.h | 134 + LedOK/ffmpeg-mac/include/libavutil/crc.h | 102 + LedOK/ffmpeg-mac/include/libavutil/csp.h | 150 + LedOK/ffmpeg-mac/include/libavutil/des.h | 81 + .../include/libavutil/detection_bbox.h | 108 + LedOK/ffmpeg-mac/include/libavutil/dict.h | 241 ++ LedOK/ffmpeg-mac/include/libavutil/display.h | 109 + .../ffmpeg-mac/include/libavutil/dovi_meta.h | 236 ++ .../include/libavutil/downmix_info.h | 115 + .../include/libavutil/encryption_info.h | 205 ++ LedOK/ffmpeg-mac/include/libavutil/error.h | 128 + LedOK/ffmpeg-mac/include/libavutil/eval.h | 140 + .../ffmpeg-mac/include/libavutil/ffversion.h | 5 + LedOK/ffmpeg-mac/include/libavutil/fifo.h | 448 +++ LedOK/ffmpeg-mac/include/libavutil/file.h | 80 + .../include/libavutil/film_grain_params.h | 260 ++ LedOK/ffmpeg-mac/include/libavutil/frame.h | 964 +++++ LedOK/ffmpeg-mac/include/libavutil/hash.h | 264 ++ .../include/libavutil/hdr_dynamic_metadata.h | 343 ++ .../libavutil/hdr_dynamic_vivid_metadata.h | 285 ++ LedOK/ffmpeg-mac/include/libavutil/hmac.h | 99 + .../ffmpeg-mac/include/libavutil/hwcontext.h | 610 ++++ .../include/libavutil/hwcontext_cuda.h | 69 + .../include/libavutil/hwcontext_d3d11va.h | 178 + .../include/libavutil/hwcontext_drm.h | 169 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../include/libavutil/hwcontext_mediacodec.h | 61 + .../include/libavutil/hwcontext_opencl.h | 100 + .../include/libavutil/hwcontext_qsv.h | 64 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 96 + .../include/libavutil/hwcontext_vulkan.h | 281 ++ LedOK/ffmpeg-mac/include/libavutil/imgutils.h | 331 ++ LedOK/ffmpeg-mac/include/libavutil/intfloat.h | 77 + .../include/libavutil/intreadwrite.h | 644 ++++ LedOK/ffmpeg-mac/include/libavutil/lfg.h | 81 + LedOK/ffmpeg-mac/include/libavutil/log.h | 387 ++ LedOK/ffmpeg-mac/include/libavutil/lzo.h | 66 + LedOK/ffmpeg-mac/include/libavutil/macros.h | 80 + .../libavutil/mastering_display_metadata.h | 128 + .../include/libavutil/mathematics.h | 245 ++ LedOK/ffmpeg-mac/include/libavutil/md5.h | 89 + LedOK/ffmpeg-mac/include/libavutil/mem.h | 609 ++++ .../include/libavutil/motion_vector.h | 57 + LedOK/ffmpeg-mac/include/libavutil/murmur3.h | 115 + LedOK/ffmpeg-mac/include/libavutil/opt.h | 891 +++++ .../ffmpeg-mac/include/libavutil/parseutils.h | 197 + LedOK/ffmpeg-mac/include/libavutil/pixdesc.h | 435 +++ .../ffmpeg-mac/include/libavutil/pixelutils.h | 51 + LedOK/ffmpeg-mac/include/libavutil/pixfmt.h | 691 ++++ .../include/libavutil/random_seed.h | 43 + LedOK/ffmpeg-mac/include/libavutil/rational.h | 221 ++ LedOK/ffmpeg-mac/include/libavutil/rc4.h | 69 + .../ffmpeg-mac/include/libavutil/replaygain.h | 50 + LedOK/ffmpeg-mac/include/libavutil/ripemd.h | 83 + .../ffmpeg-mac/include/libavutil/samplefmt.h | 269 ++ LedOK/ffmpeg-mac/include/libavutil/sha.h | 90 + LedOK/ffmpeg-mac/include/libavutil/sha512.h | 92 + .../ffmpeg-mac/include/libavutil/spherical.h | 227 ++ LedOK/ffmpeg-mac/include/libavutil/stereo3d.h | 229 ++ LedOK/ffmpeg-mac/include/libavutil/tea.h | 71 + .../include/libavutil/threadmessage.h | 115 + LedOK/ffmpeg-mac/include/libavutil/time.h | 56 + LedOK/ffmpeg-mac/include/libavutil/timecode.h | 199 + .../ffmpeg-mac/include/libavutil/timestamp.h | 78 + LedOK/ffmpeg-mac/include/libavutil/tree.h | 137 + LedOK/ffmpeg-mac/include/libavutil/twofish.h | 70 + LedOK/ffmpeg-mac/include/libavutil/tx.h | 176 + LedOK/ffmpeg-mac/include/libavutil/uuid.h | 146 + LedOK/ffmpeg-mac/include/libavutil/version.h | 122 + .../include/libavutil/video_enc_params.h | 171 + LedOK/ffmpeg-mac/include/libavutil/xtea.h | 94 + .../include/libpostproc/postprocess.h | 107 + .../ffmpeg-mac/include/libpostproc/version.h | 46 + .../include/libpostproc/version_major.h | 31 + .../include/libswresample/swresample.h | 650 ++++ .../include/libswresample/version.h | 46 + .../include/libswresample/version_major.h | 31 + LedOK/ffmpeg-mac/include/libswscale/swscale.h | 436 +++ LedOK/ffmpeg-mac/include/libswscale/version.h | 44 + .../include/libswscale/version_major.h | 35 + LedOK/ffmpeg-mac/lib/pkgconfig/libavcodec.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libavdevice.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libavfilter.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libavformat.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libavutil.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libpostproc.pc | 14 + .../ffmpeg-mac/lib/pkgconfig/libswresample.pc | 14 + LedOK/ffmpeg-mac/lib/pkgconfig/libswscale.pc | 14 + LedOK/gutil/qgui.h | 6 - LedOK/mainwindow.cpp | 40 +- LedOK/program/eaclock.cpp | 11 +- LedOK/program/edclock.cpp | 9 +- LedOK/program/eenviron.cpp | 8 +- LedOK/program/etimer.cpp | 9 +- LedOK/program/gentmpthread.cpp | 2 +- LedOK/program/pageeditor.cpp | 44 +- LedOK/program/pageeditor.h | 3 +- LedOK/program/pagelistitem.cpp | 1 - LedOK/test.cpp | 93 - 209 files changed, 39077 insertions(+), 247 deletions(-) delete mode 100644 LedOK/base/aboutdlg.cpp delete mode 100644 LedOK/base/aboutdlg.h create mode 100644 LedOK/ffmpeg-mac/COPYING.GPLv2 create mode 100644 LedOK/ffmpeg-mac/COPYING.GPLv3 create mode 100644 LedOK/ffmpeg-mac/COPYING.LGPLv2.1 create mode 100644 LedOK/ffmpeg-mac/COPYING.LGPLv3 create mode 100644 LedOK/ffmpeg-mac/Changelog create mode 100644 LedOK/ffmpeg-mac/INSTALL_RECEIPT.json create mode 100644 LedOK/ffmpeg-mac/LICENSE.md create mode 100644 LedOK/ffmpeg-mac/README.md create mode 100755 LedOK/ffmpeg-mac/bin/aviocat create mode 100755 LedOK/ffmpeg-mac/bin/bisect-create create mode 100755 LedOK/ffmpeg-mac/bin/cl2c create mode 100755 LedOK/ffmpeg-mac/bin/clean-diff create mode 100755 LedOK/ffmpeg-mac/bin/crypto_bench create mode 100755 LedOK/ffmpeg-mac/bin/cws2fws create mode 100755 LedOK/ffmpeg-mac/bin/dvd2concat create mode 100755 LedOK/ffmpeg-mac/bin/enum_options create mode 100755 LedOK/ffmpeg-mac/bin/ffescape create mode 100755 LedOK/ffmpeg-mac/bin/ffeval create mode 100755 LedOK/ffmpeg-mac/bin/ffhash create mode 100755 LedOK/ffmpeg-mac/bin/ffmpeg create mode 100755 LedOK/ffmpeg-mac/bin/ffplay create mode 100755 LedOK/ffmpeg-mac/bin/ffprobe create mode 100755 LedOK/ffmpeg-mac/bin/fourcc2pixfmt create mode 100755 LedOK/ffmpeg-mac/bin/gen-rc create mode 100755 LedOK/ffmpeg-mac/bin/graph2dot create mode 100755 LedOK/ffmpeg-mac/bin/ismindex create mode 100755 LedOK/ffmpeg-mac/bin/libav-merge-next-commit create mode 100755 LedOK/ffmpeg-mac/bin/loudnorm.rb create mode 100755 LedOK/ffmpeg-mac/bin/make_chlayout_test create mode 100755 LedOK/ffmpeg-mac/bin/missing_codec_desc create mode 100755 LedOK/ffmpeg-mac/bin/murge create mode 100755 LedOK/ffmpeg-mac/bin/normalize.py create mode 100755 LedOK/ffmpeg-mac/bin/patcheck create mode 100755 LedOK/ffmpeg-mac/bin/pktdumper create mode 100755 LedOK/ffmpeg-mac/bin/plotframes create mode 100755 LedOK/ffmpeg-mac/bin/probetest create mode 100755 LedOK/ffmpeg-mac/bin/qt-faststart create mode 100755 LedOK/ffmpeg-mac/bin/scale_slice_test create mode 100755 LedOK/ffmpeg-mac/bin/seek_print create mode 100755 LedOK/ffmpeg-mac/bin/sidxindex create mode 100755 LedOK/ffmpeg-mac/bin/target_dec_fate.sh create mode 100755 LedOK/ffmpeg-mac/bin/trasher create mode 100755 LedOK/ffmpeg-mac/bin/uncoded_frame create mode 100755 LedOK/ffmpeg-mac/bin/unwrap-diff create mode 100755 LedOK/ffmpeg-mac/bin/venc_data_dump create mode 100755 LedOK/ffmpeg-mac/bin/zmqsend create mode 100755 LedOK/ffmpeg-mac/bin/zmqshell.py create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/ac3_parser.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/adts_parser.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/avcodec.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/avdct.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/avfft.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/bsf.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/codec.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/codec_desc.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/codec_id.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/codec_par.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/d3d11va.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/defs.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/dirac.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/dv_profile.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/dxva2.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/jni.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/mediacodec.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/packet.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/qsv.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/vdpau.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/version.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/videotoolbox.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/vorbis_parser.h create mode 100644 LedOK/ffmpeg-mac/include/libavcodec/xvmc.h create mode 100644 LedOK/ffmpeg-mac/include/libavdevice/avdevice.h create mode 100644 LedOK/ffmpeg-mac/include/libavdevice/version.h create mode 100644 LedOK/ffmpeg-mac/include/libavdevice/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libavfilter/avfilter.h create mode 100644 LedOK/ffmpeg-mac/include/libavfilter/buffersink.h create mode 100644 LedOK/ffmpeg-mac/include/libavfilter/buffersrc.h create mode 100644 LedOK/ffmpeg-mac/include/libavfilter/version.h create mode 100644 LedOK/ffmpeg-mac/include/libavfilter/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libavformat/avformat.h create mode 100644 LedOK/ffmpeg-mac/include/libavformat/avio.h create mode 100644 LedOK/ffmpeg-mac/include/libavformat/version.h create mode 100644 LedOK/ffmpeg-mac/include/libavformat/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/adler32.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/aes.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/aes_ctr.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/ambient_viewing_environment.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/attributes.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/audio_fifo.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/avassert.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/avconfig.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/avstring.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/avutil.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/base64.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/blowfish.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/bprint.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/bswap.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/buffer.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/camellia.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/cast5.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/channel_layout.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/common.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/cpu.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/crc.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/csp.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/des.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/detection_bbox.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/dict.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/display.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/dovi_meta.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/downmix_info.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/encryption_info.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/error.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/eval.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/ffversion.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/fifo.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/file.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/film_grain_params.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/frame.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hash.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_metadata.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_vivid_metadata.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hmac.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_cuda.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_d3d11va.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_drm.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_dxva2.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_mediacodec.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_opencl.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_qsv.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_vaapi.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_vdpau.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_videotoolbox.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/hwcontext_vulkan.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/imgutils.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/intfloat.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/intreadwrite.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/lfg.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/log.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/lzo.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/macros.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/mastering_display_metadata.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/mathematics.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/md5.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/mem.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/motion_vector.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/murmur3.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/opt.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/parseutils.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/pixdesc.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/pixelutils.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/pixfmt.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/random_seed.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/rational.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/rc4.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/replaygain.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/ripemd.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/samplefmt.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/sha.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/sha512.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/spherical.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/stereo3d.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/tea.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/threadmessage.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/time.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/timecode.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/timestamp.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/tree.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/twofish.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/tx.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/uuid.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/version.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/video_enc_params.h create mode 100644 LedOK/ffmpeg-mac/include/libavutil/xtea.h create mode 100644 LedOK/ffmpeg-mac/include/libpostproc/postprocess.h create mode 100644 LedOK/ffmpeg-mac/include/libpostproc/version.h create mode 100644 LedOK/ffmpeg-mac/include/libpostproc/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libswresample/swresample.h create mode 100644 LedOK/ffmpeg-mac/include/libswresample/version.h create mode 100644 LedOK/ffmpeg-mac/include/libswresample/version_major.h create mode 100644 LedOK/ffmpeg-mac/include/libswscale/swscale.h create mode 100644 LedOK/ffmpeg-mac/include/libswscale/version.h create mode 100644 LedOK/ffmpeg-mac/include/libswscale/version_major.h create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libavcodec.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libavdevice.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libavfilter.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libavformat.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libavutil.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libpostproc.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libswresample.pc create mode 100644 LedOK/ffmpeg-mac/lib/pkgconfig/libswscale.pc delete mode 100644 LedOK/test.cpp diff --git a/.gitignore b/.gitignore index 03e9bf1..8fa0293 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ build-* *.autosave *-old/* +*.DS_Store diff --git a/LedOK/LedOK.pro b/LedOK/LedOK.pro index 8b7649c..fe363fb 100644 --- a/LedOK/LedOK.pro +++ b/LedOK/LedOK.pro @@ -33,21 +33,25 @@ msvc { CONFIG += force_debug_info CONFIG += separate_debug_info - -# QMAKE_LFLAGS_RELEASE += /MAP -# QMAKE_CFLAGS_RELEASE += /Zi -# QMAKE_LFLAGS_RELEASE += /debug /opt:ref - -# QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -# QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO } -win* { +win32 { + CONFIG -= debug_and_release LIBS += -lwinmm LIBS += -lDbghelp } +RESOURCES += res.qrc + +win32:RC_ICONS = res/Logo.ico +osx:ICON = res/Logo.icns + + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + SOURCES += \ - base/aboutdlg.cpp \ base/changepasswordform.cpp \ base/customprogressindicator.cpp \ base/loemptydialog.cpp \ @@ -100,7 +104,6 @@ SOURCES += \ player/posdlg.cpp \ progpanel.cpp \ synctimer.cpp \ - test.cpp \ tools.cpp \ device/controlpowerschedule.cpp \ device/controlpowerwidget.cpp \ @@ -141,7 +144,6 @@ SOURCES += \ program/wprogrampublishitem.cpp \ HEADERS += \ - base/aboutdlg.h \ base/changepasswordform.h \ base/customprogressindicator.h \ base/loemptydialog.h \ @@ -253,19 +255,13 @@ EXTRA_TRANSLATIONS += \ translations/qt_ja.ts \ translations/qt_en.ts -RESOURCES += res.qrc - -win32:RC_ICONS = res/Logo.ico -osx:ICON = res/Logo.icns - - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target +include(./xlsx/qtxlsx.pri) +include(./QSimpleUpdater/QSimpleUpdater.pri) +copy.files += $$quote(y50 param) +win32 { INCLUDEPATH += $$PWD/ffmpeg/include LIBS += -L$$PWD/ffmpeg/lib/\ -lavcodec \ @@ -276,25 +272,27 @@ LIBS += -L$$PWD/ffmpeg/lib/\ -lswresample \ -lswscale +CONFIG += file_copies +copy.path = $$OUT_PWD copy.files += $$files(ffmpeg/bin/*.dll) copy.files += ffmpeg/bin/ffmpeg.exe - -include(./xlsx/qtxlsx.pri) -include(./QSimpleUpdater/QSimpleUpdater.pri) - -# for https requests -copy2.files += $$files(OpenSSL/*.dll) - copy.files += 7z/7z.dll copy.files += 7z/7z.exe - -copy.path = $$OUT_PWD -copy2.path = $$OUT_PWD/release - -copy3.files += $$quote(y50 param) -copy3.path = $$OUT_PWD/release - -CONFIG += file_copies +# for https requests +copy.files += $$files(OpenSSL/*.dll) COPIES += copy -COPIES += copy2 -COPIES += copy3 +} +osx { +INCLUDEPATH += $$PWD/ffmpeg-mac/include +LIBS += -L$$PWD/ffmpeg-mac/lib/\ + -lavcodec \ + -lavdevice \ + -lavfilter \ + -lavformat \ + -lavutil \ + -lswresample \ + -lswscale + +copy.path = Contents/MacOS +QMAKE_BUNDLE_DATA += copy +} diff --git a/LedOK/base/aboutdlg.cpp b/LedOK/base/aboutdlg.cpp deleted file mode 100644 index 6361d3c..0000000 --- a/LedOK/base/aboutdlg.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "aboutdlg.h" -#include "globaldefine.h" -#include -#include -#include - -AboutDlg::AboutDlg(QWidget *parent) : QDialog(parent) { - setWindowFlag(Qt::WindowContextHelpButtonHint, false); - setWindowTitle(tr("About")); - - auto hBox = new QHBoxLayout(this); - hBox->setContentsMargins(24,24,24,24); - hBox->setSpacing(24); - auto label_4 = new QLabel(); - label_4->setPixmap(QPixmap(":/res/Logo.png")); - hBox->addWidget(label_4); - - auto vBox = new QVBoxLayout(); - auto label = new QLabel("LedOK Express"); - QFont font; - font.setPointSize(24); - label->setFont(font); - label->setTextFormat(Qt::AutoText); - label->setAlignment(Qt::AlignCenter); - vBox->addWidget(label); - - auto label_2 = new QLabel(APP_VERSION); - QFont font1; - font1.setPointSize(14); - label_2->setFont(font1); - label_2->setAlignment(Qt::AlignCenter); - vBox->addWidget(label_2); - - auto label_3 = new QLabel("www.ledok.cn"); - QFont font2; - font2.setPointSize(15); - label_3->setFont(font2); - label_3->setAlignment(Qt::AlignCenter); - label_3->setOpenExternalLinks(true); - vBox->addWidget(label_3); - - hBox->addLayout(vBox); -} diff --git a/LedOK/base/aboutdlg.h b/LedOK/base/aboutdlg.h deleted file mode 100644 index 566056d..0000000 --- a/LedOK/base/aboutdlg.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef ABOUTDLG_H -#define ABOUTDLG_H - -#include - -class AboutDlg : public QDialog { - Q_OBJECT -public: - explicit AboutDlg(QWidget *parent = nullptr); -}; - -#endif // ABOUTDLG_H diff --git a/LedOK/device/ctrlnetworkpanel.cpp b/LedOK/device/ctrlnetworkpanel.cpp index 19e0185..678d26a 100644 --- a/LedOK/device/ctrlnetworkpanel.cpp +++ b/LedOK/device/ctrlnetworkpanel.cpp @@ -13,7 +13,7 @@ CtrlNetworkPanel::CtrlNetworkPanel(QWidget *parent) : QWidget(parent) { lbLanCfg = new QLabel; QFont font = lbLanCfg->font(); - font.setPointSize(12); + font.setPixelSize(16); lbLanCfg->setFont(font); lbLanCfg->setAlignment(Qt::AlignCenter); vBox->addWidget(lbLanCfg); diff --git a/LedOK/ffmpeg-mac/COPYING.GPLv2 b/LedOK/ffmpeg-mac/COPYING.GPLv2 new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LedOK/ffmpeg-mac/COPYING.GPLv2 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/LedOK/ffmpeg-mac/COPYING.GPLv3 b/LedOK/ffmpeg-mac/COPYING.GPLv3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LedOK/ffmpeg-mac/COPYING.GPLv3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LedOK/ffmpeg-mac/COPYING.LGPLv2.1 b/LedOK/ffmpeg-mac/COPYING.LGPLv2.1 new file mode 100644 index 0000000..58af0d3 --- /dev/null +++ b/LedOK/ffmpeg-mac/COPYING.LGPLv2.1 @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/LedOK/ffmpeg-mac/COPYING.LGPLv3 b/LedOK/ffmpeg-mac/COPYING.LGPLv3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LedOK/ffmpeg-mac/COPYING.LGPLv3 @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/LedOK/ffmpeg-mac/Changelog b/LedOK/ffmpeg-mac/Changelog new file mode 100644 index 0000000..1d5810e --- /dev/null +++ b/LedOK/ffmpeg-mac/Changelog @@ -0,0 +1,2070 @@ +Entries are sorted chronologically from oldest to youngest within each release, +releases are sorted from youngest to oldest. + +version 6.0: +- Radiance HDR image support +- ddagrab (Desktop Duplication) video capture filter +- ffmpeg -shortest_buf_duration option +- ffmpeg now requires threading to be built +- ffmpeg now runs every muxer in a separate thread +- Add new mode to cropdetect filter to detect crop-area based on motion vectors and edges +- VAAPI decoding and encoding for 10/12bit 422, 10/12bit 444 HEVC and VP9 +- WBMP (Wireless Application Protocol Bitmap) image format +- a3dscope filter +- bonk decoder and demuxer +- Micronas SC-4 audio decoder +- LAF demuxer +- APAC decoder and demuxer +- Media 100i decoders +- DTS to PTS reorder bsf +- ViewQuest VQC decoder +- backgroundkey filter +- nvenc AV1 encoding support +- MediaCodec decoder via NDKMediaCodec +- MediaCodec encoder +- oneVPL support for QSV +- QSV AV1 encoder +- QSV decoding and encoding for 10/12bit 422, 10/12bit 444 HEVC and VP9 +- showcwt multimedia filter +- corr video filter +- adrc audio filter +- afdelaysrc audio filter +- WADY DPCM decoder and demuxer +- CBD2 DPCM decoder +- ssim360 video filter +- ffmpeg CLI new options: -stats_enc_pre[_fmt], -stats_enc_post[_fmt], + -stats_mux_pre[_fmt] +- hstack_vaapi, vstack_vaapi and xstack_vaapi filters +- XMD ADPCM decoder and demuxer +- media100 to mjpegb bsf +- ffmpeg CLI new option: -fix_sub_duration_heartbeat +- WavArc decoder and demuxer +- CrystalHD decoders deprecated +- SDNS demuxer +- RKA decoder and demuxer +- filtergraph syntax in ffmpeg CLI now supports passing file contents + as option values, by prefixing option name with '/' +- hstack_qsv, vstack_qsv and xstack_qsv filters + + +version 5.1: +- add ipfs/ipns gateway support +- dialogue enhance audio filter +- dropped obsolete XvMC hwaccel +- pcm-bluray encoder +- DFPWM audio encoder/decoder and raw muxer/demuxer +- SITI filter +- Vizrt Binary Image encoder/decoder +- avsynctest source filter +- feedback video filter +- pixelize video filter +- colormap video filter +- colorchart video source filter +- multiply video filter +- PGS subtitle frame merge bitstream filter +- blurdetect filter +- tiltshelf audio filter +- QOI image format support +- ffprobe -o option +- virtualbass audio filter +- VDPAU AV1 hwaccel +- PHM image format support +- remap_opencl filter +- added chromakey_cuda filter +- added bilateral_cuda filter + + +version 5.0: +- ADPCM IMA Westwood encoder +- Westwood AUD muxer +- ADPCM IMA Acorn Replay decoder +- Argonaut Games CVG demuxer +- Argonaut Games CVG muxer +- Concatf protocol +- afwtdn audio filter +- audio and video segment filters +- Apple Graphics (SMC) encoder +- hsvkey and hsvhold video filters +- adecorrelate audio filter +- atilt audio filter +- grayworld video filter +- AV1 Low overhead bitstream format muxer +- swscale slice threading +- MSN Siren decoder +- scharr video filter +- apsyclip audio filter +- morpho video filter +- amr parser +- (a)latency filters +- GEM Raster image decoder +- asdr audio filter +- speex decoder +- limitdiff video filter +- xcorrelate video filter +- varblur video filter +- huesaturation video filter +- colorspectrum source video filter +- RTP packetizer for uncompressed video (RFC 4175) +- bitpacked encoder +- VideoToolbox VP9 hwaccel +- VideoToolbox ProRes hwaccel +- support loongarch. +- aspectralstats audio filter +- adynamicsmooth audio filter +- libplacebo filter +- vflip_vulkan, hflip_vulkan and flip_vulkan filters +- adynamicequalizer audio filter +- yadif_videotoolbox filter +- VideoToolbox ProRes encoder +- anlmf audio filter +- IMF demuxer (experimental) + + +version 4.4: +- AudioToolbox output device +- MacCaption demuxer +- PGX decoder +- chromanr video filter +- VDPAU accelerated HEVC 10/12bit decoding +- ADPCM IMA Ubisoft APM encoder +- Rayman 2 APM muxer +- AV1 encoding support SVT-AV1 +- Cineform HD encoder +- ADPCM Argonaut Games encoder +- Argonaut Games ASF muxer +- AV1 Low overhead bitstream format demuxer +- RPZA video encoder +- ADPCM IMA MOFLEX decoder +- MobiClip FastAudio decoder +- MobiClip video decoder +- MOFLEX demuxer +- MODS demuxer +- PhotoCD decoder +- MCA demuxer +- AV1 decoder (Hardware acceleration used only) +- SVS demuxer +- Argonaut Games BRP demuxer +- DAT demuxer +- aax demuxer +- IPU decoder, parser and demuxer +- Intel QSV-accelerated AV1 decoding +- Argonaut Games Video decoder +- libwavpack encoder removed +- ACE demuxer +- AVS3 demuxer +- AVS3 video decoder via libuavs3d +- Cintel RAW decoder +- VDPAU accelerated VP9 10/12bit decoding +- afreqshift and aphaseshift filters +- High Voltage Software ADPCM encoder +- LEGO Racers ALP (.tun & .pcm) muxer +- AV1 VAAPI decoder +- adenorm filter +- ADPCM IMA AMV encoder +- AMV muxer +- NVDEC AV1 hwaccel +- DXVA2/D3D11VA hardware accelerated AV1 decoding +- speechnorm filter +- SpeedHQ encoder +- asupercut filter +- asubcut filter +- Microsoft Paint (MSP) version 2 decoder +- Microsoft Paint (MSP) demuxer +- AV1 monochrome encoding support via libaom >= 2.0.1 +- asuperpass and asuperstop filter +- shufflepixels filter +- tmidequalizer filter +- estdif filter +- epx filter +- Dolby E parser +- shear filter +- kirsch filter +- colortemperature filter +- colorcontrast filter +- PFM encoder +- colorcorrect filter +- binka demuxer +- XBM parser +- xbm_pipe demuxer +- colorize filter +- CRI parser +- aexciter audio filter +- exposure video filter +- monochrome video filter +- setts bitstream filter +- vif video filter +- OpenEXR image encoder +- Simbiosis IMX decoder +- Simbiosis IMX demuxer +- Digital Pictures SGA demuxer and decoders +- TTML subtitle encoder and muxer +- identity video filter +- msad video filter +- gophers protocol +- RIST protocol via librist + + +version 4.3: +- v360 filter +- Intel QSV-accelerated MJPEG decoding +- Intel QSV-accelerated VP9 decoding +- Support for TrueHD in mp4 +- Support AMD AMF encoder on Linux (via Vulkan) +- IMM5 video decoder +- ZeroMQ protocol +- support Sipro ACELP.KELVIN decoding +- streamhash muxer +- sierpinski video source +- scroll video filter +- photosensitivity filter +- anlms filter +- arnndn filter +- bilateral filter +- maskedmin and maskedmax filters +- VDPAU VP9 hwaccel +- median filter +- QSV-accelerated VP9 encoding +- AV1 encoding support via librav1e +- AV1 frame merge bitstream filter +- AV1 Annex B demuxer +- axcorrelate filter +- mvdv decoder +- mvha decoder +- MPEG-H 3D Audio support in mp4 +- thistogram filter +- freezeframes filter +- Argonaut Games ADPCM decoder +- Argonaut Games ASF demuxer +- xfade video filter +- xfade_opencl filter +- afirsrc audio filter source +- pad_opencl filter +- Simon & Schuster Interactive ADPCM decoder +- Real War KVAG demuxer +- CDToons video decoder +- siren audio decoder +- Rayman 2 ADPCM decoder +- Rayman 2 APM demuxer +- cas video filter +- High Voltage Software ADPCM decoder +- LEGO Racers ALP (.tun & .pcm) demuxer +- AMQP 0-9-1 protocol (RabbitMQ) +- Vulkan support +- avgblur_vulkan, overlay_vulkan, scale_vulkan and chromaber_vulkan filters +- ADPCM IMA MTF decoder +- FWSE demuxer +- DERF DPCM decoder +- DERF demuxer +- CRI HCA decoder +- CRI HCA demuxer +- overlay_cuda filter +- switch from AvxSynth to AviSynth+ on Linux +- mv30 decoder +- Expanded styling support for 3GPP Timed Text Subtitles (movtext) +- WebP parser +- tmedian filter +- maskedthreshold filter +- Support for muxing pcm and pgs in m2ts +- Cunning Developments ADPCM decoder +- asubboost filter +- Pro Pinball Series Soundbank demuxer +- pcm_rechunk bitstream filter +- scdet filter +- NotchLC decoder +- gradients source video filter +- MediaFoundation encoder wrapper +- untile filter +- Simon & Schuster Interactive ADPCM encoder +- PFM decoder +- dblur video filter +- Real War KVAG muxer + + +version 4.2: +- tpad filter +- AV1 decoding support through libdav1d +- dedot filter +- chromashift and rgbashift filters +- freezedetect filter +- truehd_core bitstream filter +- dhav demuxer +- PCM-DVD encoder +- GIF parser +- vividas demuxer +- hymt decoder +- anlmdn filter +- maskfun filter +- hcom demuxer and decoder +- ARBC decoder +- libaribb24 based ARIB STD-B24 caption support (profiles A and C) +- Support decoding of HEVC 4:4:4 content in nvdec and cuviddec +- removed libndi-newtek +- agm decoder +- KUX demuxer +- AV1 frame split bitstream filter +- lscr decoder +- lagfun filter +- asoftclip filter +- Support decoding of HEVC 4:4:4 content in vdpau +- colorhold filter +- xmedian filter +- asr filter +- showspatial multimedia filter +- VP4 video decoder +- IFV demuxer +- derain filter +- deesser filter +- mov muxer writes tracks with unspecified language instead of English by default +- add support for using clang to compile CUDA kernels + + +version 4.1: +- deblock filter +- tmix filter +- amplify filter +- fftdnoiz filter +- aderivative and aintegral audio filters +- pal75bars and pal100bars video filter sources +- support mbedTLS based TLS +- adeclick filter +- adeclip filter +- libtensorflow backend for DNN based filters like srcnn +- vc1 decoder is now bit-exact +- ATRAC9 decoder +- lensfun wrapper filter +- colorconstancy filter +- AVS2 video decoder via libdavs2 +- IMM4 video decoder +- Brooktree ProSumer video decoder +- MatchWare Screen Capture Codec decoder +- WinCam Motion Video decoder +- 1D LUT filter (lut1d) +- RemotelyAnywhere Screen Capture decoder +- cue and acue filters +- support for AV1 in MP4 +- transpose_npp filter +- AVS2 video encoder via libxavs2 +- amultiply filter +- Block-Matching 3d (bm3d) denoising filter +- acrossover filter +- ilbc decoder +- audio denoiser as afftdn filter +- AV1 parser +- SER demuxer +- sinc audio filter source +- chromahold filter +- setparams filter +- vibrance filter +- decoding S12M timecode in h264 +- xstack filter +- pcm vidc decoder and encoder +- (a)graphmonitor filter +- yadif_cuda filter + + +version 4.0: +- Bitstream filters for editing metadata in H.264, HEVC and MPEG-2 streams +- Dropped support for OpenJPEG versions 2.0 and below. Using OpenJPEG now + requires 2.1 (or later) and pkg-config. +- VDA dropped (use VideoToolbox instead) +- MagicYUV encoder +- Raw AMR-NB and AMR-WB demuxers +- TiVo ty/ty+ demuxer +- Intel QSV-accelerated MJPEG encoding +- PCE support for extended channel layouts in the AAC encoder +- native aptX and aptX HD encoder and decoder +- Raw aptX and aptX HD muxer and demuxer +- NVIDIA NVDEC-accelerated H.264, HEVC, MJPEG, MPEG-1/2/4, VC1, VP8/9 hwaccel decoding +- Intel QSV-accelerated overlay filter +- mcompand audio filter +- acontrast audio filter +- OpenCL overlay filter +- video mix filter +- video normalize filter +- audio lv2 wrapper filter +- VAAPI MJPEG and VP8 decoding +- AMD AMF H.264 and HEVC encoders +- video fillborders filter +- video setrange filter +- nsp demuxer +- support LibreSSL (via libtls) +- AVX-512/ZMM support added +- Dropped support for building for Windows XP. The minimum supported Windows + version is Windows Vista. +- deconvolve video filter +- entropy video filter +- hilbert audio filter source +- aiir audio filter +- aiff: add support for CD-ROM XA ADPCM +- Removed the ffserver program +- Removed the ffmenc and ffmdec muxer and demuxer +- VideoToolbox HEVC encoder and hwaccel +- VAAPI-accelerated ProcAmp (color balance), denoise and sharpness filters +- Add android_camera indev +- codec2 en/decoding via libcodec2 +- muxer/demuxer for raw codec2 files and .c2 files +- Moved nvidia codec headers into an external repository. + They can be found at http://git.videolan.org/?p=ffmpeg/nv-codec-headers.git +- native SBC encoder and decoder +- drmeter audio filter +- hapqa_extract bitstream filter +- filter_units bitstream filter +- AV1 Support through libaom +- E-AC-3 dependent frames support +- bitstream filter for extracting E-AC-3 core +- Haivision SRT protocol via libsrt +- segafilm muxer +- vfrdet filter +- SRCNN filter + + +version 3.4: +- deflicker video filter +- doubleweave video filter +- lumakey video filter +- pixscope video filter +- oscilloscope video filter +- config.log and other configuration files moved into ffbuild/ directory +- update cuvid/nvenc headers to Video Codec SDK 8.0.14 +- afir audio filter +- scale_cuda CUDA based video scale filter +- librsvg support for svg rasterization +- crossfeed audio filter +- spec compliant VP9 muxing support in MP4 +- remove the libnut muxer/demuxer wrappers +- remove the libschroedinger encoder/decoder wrappers +- surround audio filter +- sofalizer filter switched to libmysofa +- Gremlin Digital Video demuxer and decoder +- headphone audio filter +- superequalizer audio filter +- roberts video filter +- The x86 assembler default switched from yasm to nasm, pass + --x86asmexe=yasm to configure to restore the old behavior. +- additional frame format support for Interplay MVE movies +- support for decoding through D3D11VA in ffmpeg +- limiter video filter +- libvmaf video filter +- Dolby E decoder and SMPTE 337M demuxer +- unpremultiply video filter +- tlut2 video filter +- floodfill video filter +- pseudocolor video filter +- raw G.726 muxer and demuxer, left- and right-justified +- NewTek NDI input/output device +- Some video filters with several inputs now use a common set of options: + blend, libvmaf, lut3d, overlay, psnr, ssim. + They must always be used by name. +- FITS demuxer and decoder +- FITS muxer and encoder +- add --disable-autodetect build switch +- drop deprecated qtkit input device (use avfoundation instead) +- despill video filter +- haas audio filter +- SUP/PGS subtitle muxer +- convolve video filter +- VP9 tile threading support +- KMS screen grabber +- CUDA thumbnail filter +- V4L2 mem2mem HW assisted codecs +- Rockchip MPP hardware decoding +- vmafmotion video filter +- use MIME type "G726" for little-endian G.726, "AAL2-G726" for big-endian G.726 + + +version 3.3: +- CrystalHD decoder moved to new decode API +- add internal ebur128 library, remove external libebur128 dependency +- Pro-MPEG CoP #3-R2 FEC protocol +- premultiply video filter +- Support for spherical videos +- configure now fails if autodetect-libraries are requested but not found +- PSD Decoder +- 16.8 floating point pcm decoder +- 24.0 floating point pcm decoder +- Apple Pixlet decoder +- QDMC audio decoder +- NewTek SpeedHQ decoder +- MIDI Sample Dump Standard demuxer +- readeia608 filter +- Sample Dump eXchange demuxer +- abitscope multimedia filter +- Scenarist Closed Captions demuxer and muxer +- threshold filter +- midequalizer filter +- Optimal Huffman tables for (M)JPEG encoding +- VAAPI-accelerated MPEG-2 and VP8 encoding +- FM Screen Capture Codec decoder +- native Opus encoder +- ScreenPressor decoder +- incomplete ClearVideo decoder +- Intel QSV video scaling and deinterlacing filters +- Support MOV with multiple sample description tables +- XPM decoder +- Removed the legacy X11 screen grabber, use XCB instead +- MPEG-7 Video Signature filter +- Removed asyncts filter (use af_aresample instead) +- Intel QSV-accelerated VP8 video decoding +- VAAPI-accelerated deinterlacing + + +version 3.2: +- libopenmpt demuxer +- tee protocol +- Changed metadata print option to accept general urls +- Alias muxer for Ogg Video (.ogv) +- VP8 in Ogg muxing +- curves filter doesn't automatically insert points at x=0 and x=1 anymore +- 16-bit support in curves filter and selectivecolor filter +- OpenH264 decoder wrapper +- MediaCodec H.264/HEVC/MPEG-4/VP8/VP9 hwaccel +- True Audio (TTA) muxer +- crystalizer audio filter +- acrusher audio filter +- bitplanenoise video filter +- floating point support in als decoder +- fifo muxer +- maskedclamp filter +- hysteresis filter +- lut2 filter +- yuvtestsrc filter +- CUDA CUVID H.263/VP8/VP9/10 bit HEVC (Dithered) Decoding +- vaguedenoiser filter +- added threads option per filter instance +- weave filter +- gblur filter +- avgblur filter +- sobel and prewitt filter +- MediaCodec HEVC/MPEG-4/VP8/VP9 decoding +- Meridian Lossless Packing (MLP) / TrueHD encoder +- Non-Local Means (nlmeans) denoising filter +- sdl2 output device and ffplay support +- sdl1 output device and sdl1 support removed +- extended mov edit list support +- libfaac encoder removed +- Matroska muxer now writes CRC32 elements by default in all Level 1 elements +- sidedata video and asidedata audio filter +- Changed mapping of rtp MIME type G726 to codec g726le. +- spec compliant VAAPI/DXVA2 VC-1 decoding of slices in frame-coded images + + +version 3.1: +- DXVA2-accelerated HEVC Main10 decoding +- fieldhint filter +- loop video filter and aloop audio filter +- Bob Weaver deinterlacing filter +- firequalizer filter +- datascope filter +- bench and abench filters +- ciescope filter +- protocol blacklisting API +- MediaCodec H264 decoding +- VC-2 HQ RTP payload format (draft v1) depacketizer and packetizer +- VP9 RTP payload format (draft v2) packetizer +- AudioToolbox audio decoders +- AudioToolbox audio encoders +- coreimage filter (GPU based image filtering on OSX) +- libdcadec removed +- bitstream filter for extracting DTS core +- ADPCM IMA DAT4 decoder +- musx demuxer +- aix demuxer +- remap filter +- hash and framehash muxers +- colorspace filter +- hdcd filter +- readvitc filter +- VAAPI-accelerated format conversion and scaling +- libnpp/CUDA-accelerated format conversion and scaling +- Duck TrueMotion 2.0 Real Time decoder +- Wideband Single-bit Data (WSD) demuxer +- VAAPI-accelerated H.264/HEVC/MJPEG encoding +- DTS Express (LBR) decoder +- Generic OpenMAX IL encoder with support for Raspberry Pi +- IFF ANIM demuxer & decoder +- Direct Stream Transfer (DST) decoder +- loudnorm filter +- MTAF demuxer and decoder +- MagicYUV decoder +- OpenExr improvements (tile data and B44/B44A support) +- BitJazz SheerVideo decoder +- CUDA CUVID H264/HEVC decoder +- 10-bit depth support in native utvideo decoder +- libutvideo wrapper removed +- YUY2 Lossless Codec decoder +- VideoToolbox H.264 encoder + + +version 3.0: +- Common Encryption (CENC) MP4 encoding and decoding support +- DXV decoding +- extrastereo filter +- ocr filter +- alimiter filter +- stereowiden filter +- stereotools filter +- rubberband filter +- tremolo filter +- agate filter +- chromakey filter +- maskedmerge filter +- Screenpresso SPV1 decoding +- chromaprint fingerprinting muxer +- ffplay dynamic volume control +- displace filter +- selectivecolor filter +- extensive native AAC encoder improvements and removal of experimental flag +- ADPCM PSX decoder +- 3dostr, dcstr, fsb, genh, vag, xvag, ads, msf, svag & vpk demuxer +- zscale filter +- wve demuxer +- zero-copy Intel QSV transcoding in ffmpeg +- shuffleframes filter +- SDX2 DPCM decoder +- vibrato filter +- innoHeim/Rsupport Screen Capture Codec decoder +- ADPCM AICA decoder +- Interplay ACM demuxer and audio decoder +- XMA1 & XMA2 decoder +- realtime filter +- anoisesrc audio filter source +- IVR demuxer +- compensationdelay filter +- acompressor filter +- support encoding 16-bit RLE SGI images +- apulsator filter +- sidechaingate audio filter +- mipsdspr1 option has been renamed to mipsdsp +- aemphasis filter +- mips32r5 option has been removed +- mips64r6 option has been removed +- DXVA2-accelerated VP9 decoding +- SOFAlizer: virtual binaural acoustics filter +- VAAPI VP9 hwaccel +- audio high-order multiband parametric equalizer +- automatic bitstream filtering +- showspectrumpic filter +- libstagefright support removed +- spectrumsynth filter +- ahistogram filter +- only seek with the right mouse button in ffplay +- toggle full screen when double-clicking with the left mouse button in ffplay +- afftfilt filter +- convolution filter +- libquvi support removed +- support for dvaudio in wav and avi +- libaacplus and libvo-aacenc support removed +- Cineform HD decoder +- new DCA decoder with full support for DTS-HD extensions +- significant performance improvements in Windows Television (WTV) demuxer +- nnedi deinterlacer +- streamselect video and astreamselect audio filter +- swaprect filter +- metadata video and ametadata audio filter +- SMPTE VC-2 HQ profile support for the Dirac decoder +- SMPTE VC-2 native encoder supporting the HQ profile + + +version 2.8: +- colorkey video filter +- BFSTM/BCSTM demuxer +- little-endian ADPCM_THP decoder +- Hap decoder and encoder +- DirectDraw Surface image/texture decoder +- ssim filter +- optional new ASF demuxer +- showvolume filter +- Many improvements to the JPEG 2000 decoder +- Go2Meeting decoding support +- adrawgraph audio and drawgraph video filter +- removegrain video filter +- Intel QSV-accelerated MPEG-2 video and HEVC encoding +- Intel QSV-accelerated MPEG-2 video and HEVC decoding +- Intel QSV-accelerated VC-1 video decoding +- libkvazaar HEVC encoder +- erosion, dilation, deflate and inflate video filters +- Dynamic Audio Normalizer as dynaudnorm filter +- Reverse video and areverse audio filter +- Random filter +- deband filter +- AAC fixed-point decoding +- sidechaincompress audio filter +- bitstream filter for converting HEVC from MP4 to Annex B +- acrossfade audio filter +- allyuv and allrgb video sources +- atadenoise video filter +- OS X VideoToolbox support +- aphasemeter filter +- showfreqs filter +- vectorscope filter +- waveform filter +- hstack and vstack filter +- Support DNx100 (1440x1080@8) +- VAAPI hevc hwaccel +- VDPAU hevc hwaccel +- framerate filter +- Switched default encoders for webm to VP9 and Opus +- Removed experimental flag from the JPEG 2000 encoder + + +version 2.7: +- FFT video filter +- TDSC decoder +- DTS lossless extension (XLL) decoding (not lossless, disabled by default) +- showwavespic filter +- DTS decoding through libdcadec +- Drop support for nvenc API before 5.0 +- nvenc HEVC encoder +- Detelecine filter +- Intel QSV-accelerated H.264 encoding +- MMAL-accelerated H.264 decoding +- basic APNG encoder and muxer with default extension "apng" +- unpack DivX-style packed B-frames in MPEG-4 bitstream filter +- WebM Live Chunk Muxer +- nvenc level and tier options +- chorus filter +- Canopus HQ/HQA decoder +- Automatically rotate videos based on metadata in ffmpeg +- improved Quickdraw compatibility +- VP9 high bit-depth and extended colorspaces decoding support +- WebPAnimEncoder API when available for encoding and muxing WebP +- Direct3D11-accelerated decoding +- Support Secure Transport +- Multipart JPEG demuxer + + +version 2.6: +- nvenc encoder +- 10bit spp filter +- colorlevels filter +- RIFX format for *.wav files +- RTP/mpegts muxer +- non continuous cache protocol support +- tblend filter +- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold +- Camellia symmetric block cipher +- OpenH264 encoder wrapper +- VOC seeking support +- Closed caption Decoder +- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters +- showpalette filter +- Twofish symmetric block cipher +- Support DNx100 (960x720@8) +- eq2 filter ported from libmpcodecs as eq filter +- removed libmpcodecs +- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range +- ported softpulldown filter from libmpcodecs as repeatfields filter +- dcshift filter +- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219) +- RTP depacketizer for AC3 payload format (RFC 4184) +- palettegen and paletteuse filters +- VP9 RTP payload format (draft 0) experimental depacketizer +- RTP depacketizer for DV (RFC 6469) +- DXVA2-accelerated HEVC decoding +- AAC ELD 480 decoding +- Intel QSV-accelerated H.264 decoding +- DSS SP decoder and DSS demuxer +- Fix stsd atom corruption in DNxHD QuickTimes +- Canopus HQX decoder +- RTP depacketization of T.140 text (RFC 4103) +- Port MIPS optimizations to 64-bit + + +version 2.5: +- HEVC/H.265 RTP payload format (draft v6) packetizer +- SUP/PGS subtitle demuxer +- ffprobe -show_pixel_formats option +- CAST128 symmetric block cipher, ECB mode +- STL subtitle demuxer and decoder +- libutvideo YUV 4:2:2 10bit support +- XCB-based screen-grabber +- UDP-Lite support (RFC 3828) +- xBR scaling filter +- AVFoundation screen capturing support +- ffserver supports codec private options +- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer +- WebP muxer with animated WebP support +- zygoaudio decoding support +- APNG demuxer +- postproc visualization support + + +version 2.4: +- Icecast protocol +- ported lenscorrection filter from frei0r filter +- large optimizations in dctdnoiz to make it usable +- ICY metadata are now requested by default with the HTTP protocol +- support for using metadata in stream specifiers in fftools +- LZMA compression support in TIFF decoder +- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer +- HEVC/H.265 RTP payload format (draft v6) depacketizer +- added codecview filter to visualize information exported by some codecs +- Matroska 3D support thorugh side data +- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any +- silenceremove filter + + +version 2.3: +- AC3 fixed-point decoding +- shuffleplanes filter +- subfile protocol +- Phantom Cine demuxer +- replaygain data export +- VP7 video decoder +- Alias PIX image encoder and decoder +- Improvements to the BRender PIX image decoder +- Improvements to the XBM decoder +- QTKit input device +- improvements to OpenEXR image decoder +- support decoding 16-bit RLE SGI images +- GDI screen grabbing for Windows +- alternative rendition support for HTTP Live Streaming +- AVFoundation input device +- Direct Stream Digital (DSD) decoder +- Magic Lantern Video (MLV) demuxer +- On2 AVC (Audio for Video) decoder +- support for decoding through DXVA2 in ffmpeg +- libbs2b-based stereo-to-binaural audio filter +- libx264 reference frames count limiting depending on level +- native Opus decoder +- display matrix export and rotation API +- WebVTT encoder +- showcqt multimedia filter +- zoompan filter +- signalstats filter +- hqx filter (hq2x, hq3x, hq4x) +- flanger filter +- Image format auto-detection +- LRC demuxer and muxer +- Samba protocol (via libsmbclient) +- WebM DASH Manifest muxer +- libfribidi support in drawtext + + +version 2.2: + +- HNM version 4 demuxer and video decoder +- Live HDS muxer +- setsar/setdar filters now support variables in ratio expressions +- elbg filter +- string validation in ffprobe +- support for decoding through VDPAU in ffmpeg (the -hwaccel option) +- complete Voxware MetaSound decoder +- remove mp3_header_compress bitstream filter +- Windows resource files for shared libraries +- aeval filter +- stereoscopic 3d metadata handling +- WebP encoding via libwebp +- ATRAC3+ decoder +- VP8 in Ogg demuxing +- side & metadata support in NUT +- framepack filter +- XYZ12 rawvideo support in NUT +- Exif metadata support in WebP decoder +- OpenGL device +- Use metadata_header_padding to control padding in ID3 tags (currently used in + MP3, AIFF, and OMA files), FLAC header, and the AVI "junk" block. +- Mirillis FIC video decoder +- Support DNx444 +- libx265 encoder +- dejudder filter +- Autodetect VDA like all other hardware accelerations +- aliases and defaults for Ogg subtypes (opus, spx) + + +version 2.1: + +- aecho filter +- perspective filter ported from libmpcodecs +- ffprobe -show_programs option +- compand filter +- RTMP seek support +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate + even when used as an input option. Previous behavior can be restored with + the -noaccurate_seek option. +- ffmpeg -t option can now be used for inputs, to limit the duration of + data read from an input file +- incomplete Voxware MetaSound decoder +- read EXIF metadata from JPEG +- DVB teletext decoder +- phase filter ported from libmpcodecs +- w3fdif filter +- Opus support in Matroska +- FFV1 version 1.3 is stable and no longer experimental +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be + more consistent with other muxers. +- adelay filter +- pullup filter ported from libmpcodecs +- ffprobe -read_intervals option +- Lossless and alpha support for WebP decoder +- Error Resilient AAC syntax (ER AAC LC) decoding +- Low Delay AAC (ER AAC LD) decoding +- mux chapters in ASF files +- SFTP protocol (via libssh) +- libx264: add ability to encode in YUVJ422P and YUVJ444P +- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does +- make decoding alpha optional for prores, ffv1 and vp6 by setting + the skip_alpha flag. +- ladspa wrapper filter +- native VP9 decoder +- dpx parser +- max_error_rate parameter in ffmpeg +- PulseAudio output device +- ReplayGain scanner +- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support) +- Linux framebuffer output device +- HEVC decoder +- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing +- mergeplanes filter + + +version 2.0: + +- curves filter +- reference-counting for AVFrame and AVPacket data +- ffmpeg now fails when input options are used for output file + or vice versa +- support for Monkey's Audio versions from 3.93 +- perms and aperms filters +- audio filtering support in ffplay +- 10% faster aac encoding on x86 and MIPS +- sine audio filter source +- WebP demuxing and decoding support +- ffmpeg options -filter_script and -filter_complex_script, which allow a + filtergraph description to be read from a file +- OpenCL support +- audio phaser filter +- separatefields filter +- libquvi demuxer +- uniform options syntax across all filters +- telecine filter +- interlace filter +- smptehdbars source +- inverse telecine filters (fieldmatch and decimate) +- colorbalance filter +- colorchannelmixer filter +- The matroska demuxer can now output proper verbatim ASS packets. It will + become the default at the next libavformat major bump. +- decent native animated GIF encoding +- asetrate filter +- interleave filter +- timeline editing with filters +- vidstabdetect and vidstabtransform filters for video stabilization using + the vid.stab library +- astats filter +- trim and atrim filters +- ffmpeg -t and -ss (output-only) options are now sample-accurate when + transcoding audio +- Matroska muxer can now put the index at the beginning of the file. +- extractplanes filter +- avectorscope filter +- ADPCM DTK decoder +- ADP demuxer +- RSD demuxer +- RedSpark demuxer +- ADPCM IMA Radical decoder +- zmq filters +- DCT denoiser filter (dctdnoiz) +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow") +- Apple Intermediate Codec decoder +- Escape 130 video decoder +- FTP protocol support +- V4L2 output device +- 3D LUT filter (lut3d) +- SMPTE 302M audio encoder +- support for slice multithreading in libavfilter +- Hald CLUT support (generation and filtering) +- VC-1 interlaced B-frame support +- support for WavPack muxing (raw and in Matroska) +- XVideo output device +- vignette filter +- True Audio (TTA) encoder +- Go2Webinar decoder +- mcdeint filter ported from libmpcodecs +- sab filter ported from libmpcodecs +- ffprobe -show_chapters option +- WavPack encoding through libwavpack +- rotate filter +- spp filter ported from libmpcodecs +- libgme support +- psnr filter + + +version 1.2: + +- VDPAU hardware acceleration through normal hwaccel +- SRTP support +- Error diffusion dither in Swscale +- Chained Ogg support +- Theora Midstream reconfiguration support +- EVRC decoder +- audio fade filter +- filtering audio with unknown channel layout +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass + and treble audio filter +- improved showspectrum filter, with multichannel support and sox-like colors +- histogram filter +- tee muxer +- il filter ported from libmpcodecs +- support ID3v2 tags in ASF files +- encrypted TTA stream decoding support +- RF64 support in WAV muxer +- noise filter ported from libmpcodecs +- Subtitles character encoding conversion +- blend filter +- stereo3d filter ported from libmpcodecs + + +version 1.1: + +- stream disposition information printing in ffprobe +- filter for loudness analysis following EBU R128 +- Opus encoder using libopus +- ffprobe -select_streams option +- Pinnacle TARGA CineWave YUV16 decoder +- TAK demuxer, decoder and parser +- DTS-HD demuxer +- remove -same_quant, it hasn't worked for years +- FFM2 support +- X-Face image encoder and decoder +- 24-bit FLAC encoding +- multi-channel ALAC encoding up to 7.1 +- metadata (INFO tag) support in WAV muxer +- subtitles raw text decoder +- support for building DLLs using MSVC +- LVF demuxer +- ffescape tool +- metadata (info chunk) support in CAF muxer +- field filter ported from libmpcodecs +- AVR demuxer +- geq filter ported from libmpcodecs +- remove ffserver daemon mode +- AST muxer/demuxer +- new expansion syntax for drawtext +- BRender PIX image decoder +- ffprobe -show_entries option +- ffprobe -sections option +- ADPCM IMA Dialogic decoder +- BRSTM demuxer +- animated GIF decoder and demuxer +- PVF demuxer +- subtitles filter +- IRCAM muxer/demuxer +- Paris Audio File demuxer +- Virtual concatenation demuxer +- VobSub demuxer +- JSON captions for TED talks decoding support +- SOX Resampler support in libswresample +- aselect filter +- SGI RLE 8-bit / Silicon Graphics RLE 8-bit video decoder +- Silicon Graphics Motion Video Compressor 1 & 2 decoder +- Silicon Graphics Movie demuxer +- apad filter +- Resolution & pixel format change support with multithreading for H.264 +- documentation split into per-component manuals +- pp (postproc) filter ported from MPlayer +- NIST Sphere demuxer +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders +- Sony Wave64 muxer +- adobe and limelight publisher authentication in RTMP +- data: URI scheme +- support building on the Plan 9 operating system +- kerndeint filter ported from MPlayer +- histeq filter ported from VirtualDub +- Megalux Frame demuxer +- 012v decoder +- Improved AVC Intra decoding support + + +version 1.0: + +- INI and flat output in ffprobe +- Scene detection in libavfilter +- Indeo Audio decoder +- channelsplit audio filter +- setnsamples audio filter +- atempo filter +- ffprobe -show_data option +- RTMPT protocol support +- iLBC encoding/decoding via libilbc +- Microsoft Screen 1 decoder +- join audio filter +- audio channel mapping filter +- Microsoft ATC Screen decoder +- RTSP listen mode +- TechSmith Screen Codec 2 decoder +- AAC encoding via libfdk-aac +- Microsoft Expression Encoder Screen decoder +- RTMPS protocol support +- RTMPTS protocol support +- RTMPE protocol support +- RTMPTE protocol support +- showwaves and showspectrum filter +- LucasArts SMUSH SANM playback support +- LucasArts SMUSH VIMA audio decoder (ADPCM) +- LucasArts SMUSH demuxer +- SAMI, RealText and SubViewer demuxers and decoders +- Heart Of Darkness PAF playback support +- iec61883 device +- asettb filter +- new option: -progress +- 3GPP Timed Text encoder/decoder +- GeoTIFF decoder support +- ffmpeg -(no)stdin option +- Opus decoder using libopus +- caca output device using libcaca +- alphaextract and alphamerge filters +- concat filter +- flite filter +- Canopus Lossless Codec decoder +- bitmap subtitles in filters (experimental and temporary) +- MP2 encoding via TwoLAME +- bmp parser +- smptebars source +- asetpts filter +- hue filter +- ICO muxer +- SubRip encoder and decoder without embedded timing +- edge detection filter +- framestep filter +- ffmpeg -shortest option is now per-output file + -pass and -passlogfile are now per-output stream +- volume measurement filter +- Ut Video encoder +- Microsoft Screen 2 decoder +- smartblur filter ported from MPlayer +- CPiA decoder +- decimate filter ported from MPlayer +- RTP depacketization of JPEG +- Smooth Streaming live segmenter muxer +- F4V muxer +- sendcmd and asendcmd filters +- WebVTT demuxer and decoder (simple tags supported) +- RTP packetization of JPEG +- faststart option in the MOV/MP4 muxer +- support for building with MSVC + + +version 0.11: + +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777, + CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785, + CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790, + CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795, + CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800, + CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804, +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder +- setfield filter +- CDXL demuxer and decoder +- Apple ProRes encoder +- ffprobe -count_packets and -count_frames options +- Sun Rasterfile Encoder +- ID3v2 attached pictures reading and writing +- WMA Lossless decoder +- bluray protocol +- blackdetect filter +- libutvideo encoder wrapper (--enable-libutvideo) +- swapuv filter +- bbox filter +- XBM encoder and decoder +- RealAudio Lossless decoder +- ZeroCodec decoder +- tile video filter +- Metal Gear Solid: The Twin Snakes demuxer +- OpenEXR image decoder +- removelogo filter +- drop support for ffmpeg without libavfilter +- drawtext video filter: fontconfig support +- ffmpeg -benchmark_all option +- super2xsai filter ported from libmpcodecs +- add libavresample audio conversion library for compatibility +- MicroDVD decoder +- Avid Meridien (AVUI) encoder and decoder +- accept + prefix to -pix_fmt option to disable automatic conversions. +- complete audio filtering in libavfilter and ffmpeg +- add fps filter +- vorbis parser +- png parser +- audio mix filter +- ffv1: support (draft) version 1.3 + + +version 0.10: + +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936, + CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944, + CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949, + CVE-2011-3950, CVE-2011-3951, CVE-2011-3952 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder +- SBaGen (SBG) binaural beats script demuxer +- OpenMG Audio muxer +- Timecode extraction in DV and MOV +- thumbnail video filter +- XML output in ffprobe +- asplit audio filter +- tinterlace video filter +- astreamsync audio filter +- amerge audio filter +- ISMV (Smooth Streaming) muxer +- GSM audio parser +- SMJPEG muxer +- XWD encoder and decoder +- Automatic thread count based on detection number of (available) CPU cores +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder +- ffprobe -show_error option +- Avid 1:1 10-bit RGB Packer codec +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder +- yuv4 libquicktime packed 4:2:0 encoder and decoder +- ffprobe -show_frames option +- silencedetect audio filter +- ffprobe -show_program_version, -show_library_versions, -show_versions options +- rv34: frame-level multi-threading +- optimized iMDCT transform on x86 using SSE for for mpegaudiodec +- Improved PGS subtitle decoder +- dumpgraph option to lavfi device +- r210 and r10k encoders +- ffwavesynth decoder +- aviocat tool +- ffeval tool +- support encoding and decoding 4-channel SGI images + + +version 0.9: + +- openal input device added +- boxblur filter added +- BWF muxer +- Flash Screen Video 2 decoder +- lavfi input device added +- added avconv, which is almost the same for now, except +for a few incompatible changes in the options, which will hopefully make them +easier to use. The changes are: + * The options placement is now strictly enforced! While in theory the + options for ffmpeg should be given in [input options] -i INPUT [output + options] OUTPUT order, in practice it was possible to give output options + before the -i and it mostly worked. Except when it didn't - the behavior was + a bit inconsistent. In avconv, it is not possible to mix input and output + options. All non-global options are reset after an input or output filename. + * All per-file options are now truly per-file - they apply only to the next + input or output file and specifying different values for different files + will now work properly (notably -ss and -t options). + * All per-stream options are now truly per-stream - it is possible to + specify which stream(s) should a given option apply to. See the Stream + specifiers section in the avconv manual for details. + * In ffmpeg some options (like -newvideo/-newaudio/...) are irregular in the + sense that they're specified after the output filename instead of before, + like all other options. In avconv this irregularity is removed, all options + apply to the next input or output file. + * -newvideo/-newaudio/-newsubtitle options were removed. Not only were they + irregular and highly confusing, they were also redundant. In avconv the -map + option will create new streams in the output file and map input streams to + them. E.g. avconv -i INPUT -map 0 OUTPUT will create an output stream for + each stream in the first input file. + * The -map option now has slightly different and more powerful syntax: + + Colons (':') are used to separate file index/stream type/stream index + instead of dots. Comma (',') is used to separate the sync stream instead + of colon.. This is done for consistency with other options. + + It's possible to specify stream type. E.g. -map 0:a:2 creates an + output stream from the third input audio stream. + + Omitting the stream index now maps all the streams of the given type, + not just the first. E.g. -map 0:s creates output streams for all the + subtitle streams in the first input file. + + Since -map can now match multiple streams, negative mappings were + introduced. Negative mappings disable some streams from an already + defined map. E.g. '-map 0 -map -0:a:1' means 'create output streams for + all the stream in the first input file, except for the second audio + stream'. + * There is a new option -c (or -codec) for choosing the decoder/encoder to + use, which makes it possible to precisely specify target stream(s) consistently with + other options. E.g. -c:v lib264 sets the codec for all video streams, -c:a:0 + libvorbis sets the codec for the first audio stream and -c copy copies all + the streams without reencoding. Old -vcodec/-acodec/-scodec options are now + aliases to -c:v/a/s + * It is now possible to precisely specify which stream should an AVOption + apply to. E.g. -b:v:0 2M sets the bitrate for the first video stream, while + -b:a 128k sets the bitrate for all audio streams. Note that the old -ab 128k + syntax is deprecated and will stop working soon. + * -map_chapters now takes only an input file index and applies to the next + output file. This is consistent with how all the other options work. + * -map_metadata now takes only an input metadata specifier and applies to + the next output file. Output metadata specifier is now part of the option + name, similarly to the AVOptions/map/codec feature above. + * -metadata can now be used to set metadata on streams and chapters, e.g. + -metadata:s:1 language=eng sets the language of the first stream to 'eng'. + This made -vlang/-alang/-slang options redundant, so they were removed. + * -qscale option now uses stream specifiers and applies to all streams, not + just video. I.e. plain -qscale number would now apply to all streams. To get + the old behavior, use -qscale:v. Also there is now a shortcut -q for -qscale + and -aq is now an alias for -q:a. + * -vbsf/-absf/-sbsf options were removed and replaced by a -bsf option which + uses stream specifiers. Use -bsf:v/a/s instead of the old options. + * -itsscale option now uses stream specifiers, so its argument is only the + scale parameter. + * -intra option was removed, use -g 0 for the same effect. + * -psnr option was removed, use -flags +psnr for the same effect. + * -vf option is now an alias to the new -filter option, which uses stream specifiers. + * -vframes/-aframes/-dframes options are now aliases to the new -frames option. + * -vtag/-atag/-stag options are now aliases to the new -tag option. +- XMV demuxer +- LOAS demuxer +- ashowinfo filter added +- Windows Media Image decoder +- amovie source added +- LATM muxer/demuxer +- Speex encoder via libspeex +- JSON output in ffprobe +- WTV muxer +- Optional C++ Support (needed for libstagefright) +- H.264 Decoding on Android via Stagefright +- Prores decoder +- BIN/XBIN/ADF/IDF text file decoder +- aconvert audio filter added +- audio support to lavfi input device added +- libcdio-paranoia input device for audio CD grabbing +- Apple ProRes decoder +- CELT in Ogg demuxing +- G.723.1 demuxer and decoder +- libmodplug support (--enable-libmodplug) +- VC-1 interlaced decoding +- libutvideo wrapper (--enable-libutvideo) +- aevalsrc audio source added +- Ut Video decoder +- Speex encoding via libspeex +- 4:2:2 H.264 decoding support +- 4:2:2 and 4:4:4 H.264 encoding with libx264 +- Pulseaudio input device +- Prores encoder +- Video Decoder Acceleration (VDA) HWAccel module. +- replacement Indeo 3 decoder +- new ffmpeg option: -map_channel +- volume audio filter added +- earwax audio filter added +- libv4l2 support (--enable-libv4l2) +- TLS/SSL and HTTPS protocol support +- AVOptions API rewritten and documented +- most of CODEC_FLAG2_*, some CODEC_FLAG_* and many codec-specific fields in + AVCodecContext deprecated. Codec private options should be used instead. +- Properly working defaults in libx264 wrapper, support for native presets. +- Encrypted OMA files support +- Discworld II BMV decoding support +- VBLE Decoder +- OS X Video Decoder Acceleration (VDA) support +- compact and csv output in ffprobe +- pan audio filter +- IFF Amiga Continuous Bitmap (ACBM) decoder +- ass filter +- CRI ADX audio format muxer and demuxer +- Playstation Portable PMP format demuxer +- Microsoft Windows ICO demuxer +- life source +- PCM format support in OMA demuxer +- CLJR encoder +- new option: -report +- Dxtory capture format decoder +- cellauto source +- Simple segmenting muxer +- Indeo 4 decoder +- SMJPEG demuxer + + +version 0.8: + +- many many things we forgot because we rather write code than changelogs +- WebM support in Matroska de/muxer +- low overhead Ogg muxing +- MMS-TCP support +- VP8 de/encoding via libvpx +- Demuxer for On2's IVF format +- Pictor/PC Paint decoder +- HE-AAC v2 decoder +- HE-AAC v2 encoding with libaacplus +- libfaad2 wrapper removed +- DTS-ES extension (XCh) decoding support +- native VP8 decoder +- RTSP tunneling over HTTP +- RTP depacketization of SVQ3 +- -strict inofficial replaced by -strict unofficial +- ffplay -exitonkeydown and -exitonmousedown options added +- native GSM / GSM MS decoder +- RTP depacketization of QDM2 +- ANSI/ASCII art playback system +- Lego Mindstorms RSO de/muxer +- libavcore added (and subsequently removed) +- SubRip subtitle file muxer and demuxer +- Chinese AVS encoding via libxavs +- ffprobe -show_packets option added +- RTP packetization of Theora and Vorbis +- RTP depacketization of MP4A-LATM +- RTP packetization and depacketization of VP8 +- hflip filter +- Apple HTTP Live Streaming demuxer +- a64 codec +- MMS-HTTP support +- G.722 ADPCM audio encoder/decoder +- R10k video decoder +- ocv_smooth filter +- frei0r wrapper filter +- change crop filter syntax to width:height:x:y +- make the crop filter accept parametric expressions +- make ffprobe accept AVFormatContext options +- yadif filter +- blackframe filter +- Demuxer for Leitch/Harris' VR native stream format (LXF) +- RTP depacketization of the X-QT QuickTime format +- SAP (Session Announcement Protocol, RFC 2974) muxer and demuxer +- cropdetect filter +- ffmpeg -crop* options removed +- transpose filter added +- ffmpeg -force_key_frames option added +- demuxer for receiving raw rtp:// URLs without an SDP description +- single stream LATM/LOAS decoder +- setpts filter added +- Win64 support for optimized x86 assembly functions +- MJPEG/AVI1 to JPEG/JFIF bitstream filter +- ASS subtitle encoder and decoder +- IEC 61937 encapsulation for E-AC-3, TrueHD, DTS-HD (for HDMI passthrough) +- overlay filter added +- rename aspect filter to setdar, and pixelaspect to setsar +- IEC 61937 demuxer +- Mobotix .mxg demuxer +- frei0r source added +- hqdn3d filter added +- RTP depacketization of QCELP +- FLAC parser added +- gradfun filter added +- AMR-WB decoder +- replace the ocv_smooth filter with a more generic ocv filter +- Windows Televison (WTV) demuxer +- FFmpeg metadata format muxer and demuxer +- SubRip (srt) subtitle encoder and decoder +- floating-point AC-3 encoder added +- Lagarith decoder +- ffmpeg -copytb option added +- IVF muxer added +- Wing Commander IV movies decoder added +- movie source added +- Bink version 'b' audio and video decoder +- Bitmap Brothers JV playback system +- Apple HTTP Live Streaming protocol handler +- sndio support for playback and record +- Linux framebuffer input device added +- Chronomaster DFA decoder +- DPX image encoder +- MicroDVD subtitle file muxer and demuxer +- Playstation Portable PMP format demuxer +- fieldorder video filter added +- AAC encoding via libvo-aacenc +- AMR-WB encoding via libvo-amrwbenc +- xWMA demuxer +- Mobotix MxPEG decoder +- VP8 frame-multithreading +- NEON optimizations for VP8 +- Lots of deprecated API cruft removed +- fft and imdct optimizations for AVX (Sandy Bridge) processors +- showinfo filter added +- SMPTE 302M AES3 audio decoder +- Apple Core Audio Format muxer +- 9 bits and 10 bits per sample support in the H.264 decoder +- 9 bits and 10 bits FFV1 encoding / decoding +- split filter added +- select filter added +- sdl output device added +- libmpcodecs video filter support (3 times as many filters than before) +- mpeg2 aspect ratio dection fixed +- libxvid aspect pickiness fixed +- Frame multithreaded decoding +- E-AC-3 audio encoder +- ac3enc: add channel coupling support +- floating-point sample format support to the ac3, eac3, dca, aac, and vorbis decoders. +- H264/MPEG frame-level multi-threading +- All av_metadata_* functions renamed to av_dict_* and moved to libavutil +- 4:4:4 H.264 decoding support +- 10-bit H.264 optimizations for x86 +- lut, lutrgb, and lutyuv filters added +- buffersink libavfilter sink added +- Bump libswscale for recently reported ABI break +- New J2K encoder (via OpenJPEG) + + +version 0.7: + +- all the changes for 0.8, but keeping API/ABI compatibility with the 0.6 release + + +version 0.6: + +- PB-frame decoding for H.263 +- deprecated vhook subsystem removed +- deprecated old scaler removed +- VQF demuxer +- Alpha channel scaler +- PCX encoder +- RTP packetization of H.263 +- RTP packetization of AMR +- RTP depacketization of Vorbis +- CorePNG decoding support +- Cook multichannel decoding support +- introduced avlanguage helpers in libavformat +- 8088flex TMV demuxer and decoder +- per-stream language-tags extraction in asfdec +- V210 decoder and encoder +- remaining GPL parts in AC-3 decoder converted to LGPL +- QCP demuxer +- SoX native format muxer and demuxer +- AMR-NB decoding/encoding, AMR-WB decoding via OpenCORE libraries +- DPX image decoder +- Electronic Arts Madcow decoder +- DivX (XSUB) subtitle encoder +- nonfree libamr support for AMR-NB/WB decoding/encoding removed +- experimental AAC encoder +- RTP depacketization of ASF and RTSP from WMS servers +- RTMP support in libavformat +- noX handling for OPT_BOOL X options +- Wave64 demuxer +- IEC-61937 compatible Muxer +- TwinVQ decoder +- Bluray (PGS) subtitle decoder +- LPCM support in MPEG-TS (HDMV RID as found on Blu-ray disks) +- WMA Pro decoder +- Core Audio Format demuxer +- ATRAC1 decoder +- MD STUDIO audio demuxer +- RF64 support in WAV demuxer +- MPEG-4 Audio Lossless Coding (ALS) decoder +- -formats option split into -formats, -codecs, -bsfs, and -protocols +- IV8 demuxer +- CDG demuxer and decoder +- R210 decoder +- Auravision Aura 1 and 2 decoders +- Deluxe Paint Animation playback system +- SIPR decoder +- Adobe Filmstrip muxer and demuxer +- RTP depacketization of H.263 +- Bink demuxer and audio/video decoders +- enable symbol versioning by default for linkers that support it +- IFF PBM/ILBM bitmap decoder +- concat protocol +- Indeo 5 decoder +- RTP depacketization of AMR +- WMA Voice decoder +- ffprobe tool +- AMR-NB decoder +- RTSP muxer +- HE-AAC v1 decoder +- Kega Game Video (KGV1) decoder +- VorbisComment writing for FLAC, Ogg FLAC and Ogg Speex files +- RTP depacketization of Theora +- HTTP Digest authentication +- RTMP/RTMPT/RTMPS/RTMPE/RTMPTE protocol support via librtmp +- Psygnosis YOP demuxer and video decoder +- spectral extension support in the E-AC-3 decoder +- unsharp video filter +- RTP hinting in the mov/3gp/mp4 muxer +- Dirac in Ogg demuxing +- seek to keyframes in Ogg +- 4:2:2 and 4:4:4 Theora decoding +- 35% faster VP3/Theora decoding +- faster AAC decoding +- faster H.264 decoding +- RealAudio 1.0 (14.4K) encoder + + +version 0.5: + +- DV50 AKA DVCPRO50 encoder, decoder, muxer and demuxer +- TechSmith Camtasia (TSCC) video decoder +- IBM Ultimotion (ULTI) video decoder +- Sierra Online audio file demuxer and decoder +- Apple QuickDraw (qdrw) video decoder +- Creative ADPCM audio decoder (16 bits as well as 8 bits schemes) +- Electronic Arts Multimedia (WVE/UV2/etc.) file demuxer +- Miro VideoXL (VIXL) video decoder +- H.261 video encoder +- QPEG video decoder +- Nullsoft Video (NSV) file demuxer +- Shorten audio decoder +- LOCO video decoder +- Apple Lossless Audio Codec (ALAC) decoder +- Winnov WNV1 video decoder +- Autodesk Animator Studio Codec (AASC) decoder +- Indeo 2 video decoder +- Fraps FPS1 video decoder +- Snow video encoder/decoder +- Sonic audio encoder/decoder +- Vorbis audio decoder +- Macromedia ADPCM decoder +- Duck TrueMotion 2 video decoder +- support for decoding FLX and DTA extensions in FLIC files +- H.264 custom quantization matrices support +- ffserver fixed, it should now be usable again +- QDM2 audio decoder +- Real Cooker audio decoder +- TrueSpeech audio decoder +- WMA2 audio decoder fixed, now all files should play correctly +- RealAudio 14.4 and 28.8 decoders fixed +- JPEG-LS decoder +- build system improvements +- tabs and trailing whitespace removed from the codebase +- CamStudio video decoder +- AIFF/AIFF-C audio format, encoding and decoding +- ADTS AAC file reading and writing +- Creative VOC file reading and writing +- American Laser Games multimedia (*.mm) playback system +- Zip Motion Blocks Video decoder +- improved Theora/VP3 decoder +- True Audio (TTA) decoder +- AVS demuxer and video decoder +- JPEG-LS encoder +- Smacker demuxer and decoder +- NuppelVideo/MythTV demuxer and RTjpeg decoder +- KMVC decoder +- MPEG-2 intra VLC support +- MPEG-2 4:2:2 encoder +- Flash Screen Video decoder +- GXF demuxer +- Chinese AVS decoder +- GXF muxer +- MXF demuxer +- VC-1/WMV3/WMV9 video decoder +- MacIntel support +- AviSynth support +- VMware video decoder +- VP5 video decoder +- VP6 video decoder +- WavPack lossless audio decoder +- Targa (.TGA) picture decoder +- Vorbis audio encoder +- Delphine Software .cin demuxer/audio and video decoder +- Tiertex .seq demuxer/video decoder +- MTV demuxer +- TIFF picture encoder and decoder +- GIF picture decoder +- Intel Music Coder decoder +- Zip Motion Blocks Video encoder +- Musepack decoder +- Flash Screen Video encoder +- Theora encoding via libtheora +- BMP encoder +- WMA encoder +- GSM-MS encoder and decoder +- DCA decoder +- DXA demuxer and decoder +- DNxHD decoder +- Gamecube movie (.THP) playback system +- Blackfin optimizations +- Interplay C93 demuxer and video decoder +- Bethsoft VID demuxer and video decoder +- CRYO APC demuxer +- ATRAC3 decoder +- V.Flash PTX decoder +- RoQ muxer, RoQ audio encoder +- Renderware TXD demuxer and decoder +- extern C declarations for C++ removed from headers +- sws_flags command line option +- codebook generator +- RoQ video encoder +- QTRLE encoder +- OS/2 support removed and restored again +- AC-3 decoder +- NUT muxer +- additional SPARC (VIS) optimizations +- Matroska muxer +- slice-based parallel H.264 decoding +- Monkey's Audio demuxer and decoder +- AMV audio and video decoder +- DNxHD encoder +- H.264 PAFF decoding +- Nellymoser ASAO decoder +- Beam Software SIFF demuxer and decoder +- libvorbis Vorbis decoding removed in favor of native decoder +- IntraX8 (J-Frame) subdecoder for WMV2 and VC-1 +- Ogg (Theora, Vorbis and FLAC) muxer +- The "device" muxers and demuxers are now in a new libavdevice library +- PC Paintbrush PCX decoder +- Sun Rasterfile decoder +- TechnoTrend PVA demuxer +- Linux Media Labs MPEG-4 (LMLM4) demuxer +- AVM2 (Flash 9) SWF muxer +- QT variant of IMA ADPCM encoder +- VFW grabber +- iPod/iPhone compatible mp4 muxer +- Mimic decoder +- MSN TCP Webcam stream demuxer +- RL2 demuxer / decoder +- IFF demuxer +- 8SVX audio decoder +- non-recursive Makefiles +- BFI demuxer +- MAXIS EA XA (.xa) demuxer / decoder +- BFI video decoder +- OMA demuxer +- MLP/TrueHD decoder +- Electronic Arts CMV decoder +- Motion Pixels Video decoder +- Motion Pixels MVI demuxer +- removed animated GIF decoder/demuxer +- D-Cinema audio muxer +- Electronic Arts TGV decoder +- Apple Lossless Audio Codec (ALAC) encoder +- AAC decoder +- floating point PCM encoder/decoder +- MXF muxer +- DV100 AKA DVCPRO HD decoder and demuxer +- E-AC-3 support added to AC-3 decoder +- Nellymoser ASAO encoder +- ASS and SSA demuxer and muxer +- liba52 wrapper removed +- SVQ3 watermark decoding support +- Speex decoding via libspeex +- Electronic Arts TGQ decoder +- RV40 decoder +- QCELP / PureVoice decoder +- RV30 decoder +- hybrid WavPack support +- R3D REDCODE demuxer +- ALSA support for playback and record +- Electronic Arts TQI decoder +- OpenJPEG based JPEG 2000 decoder +- NC (NC4600) camera file demuxer +- Gopher client support +- MXF D-10 muxer +- generic metadata API +- flash ScreenVideo2 encoder + + +version 0.4.9-pre1: + +- DV encoder, DV muxer +- Microsoft RLE video decoder +- Microsoft Video-1 decoder +- Apple Animation (RLE) decoder +- Apple Graphics (SMC) decoder +- Apple Video (RPZA) decoder +- Cinepak decoder +- Sega FILM (CPK) file demuxer +- Westwood multimedia support (VQA & AUD files) +- Id Quake II CIN playback support +- 8BPS video decoder +- FLIC playback support +- RealVideo 2.0 (RV20) decoder +- Duck TrueMotion v1 (DUCK) video decoder +- Sierra VMD demuxer and video decoder +- MSZH and ZLIB decoder support +- SVQ1 video encoder +- AMR-WB support +- PPC optimizations +- rate distortion optimal cbp support +- rate distorted optimal ac prediction for MPEG-4 +- rate distorted optimal lambda->qp support +- AAC encoding with libfaac +- Sunplus JPEG codec (SP5X) support +- use Lagrange multiplier instead of QP for ratecontrol +- Theora/VP3 decoding support +- XA and ADX ADPCM codecs +- export MPEG-2 active display area / pan scan +- Add support for configuring with IBM XLC +- floating point AAN DCT +- initial support for zygo video (not complete) +- RGB ffv1 support +- new audio/video parser API +- av_log() system +- av_read_frame() and av_seek_frame() support +- missing last frame fixes +- seek by mouse in ffplay +- noise reduction of DCT coefficients +- H.263 OBMC & 4MV support +- H.263 alternative inter vlc support +- H.263 loop filter +- H.263 slice structured mode +- interlaced DCT support for MPEG-2 encoding +- stuffing to stay above min_bitrate +- MB type & QP visualization +- frame stepping for ffplay +- interlaced motion estimation +- alternate scantable support +- SVCD scan offset support +- closed GOP support +- SSE2 FDCT +- quantizer noise shaping +- G.726 ADPCM audio codec +- MS ADPCM encoding +- multithreaded/SMP motion estimation +- multithreaded/SMP encoding for MPEG-1/MPEG-2/MPEG-4/H.263 +- multithreaded/SMP decoding for MPEG-2 +- FLAC decoder +- Metrowerks CodeWarrior suppport +- H.263+ custom pcf support +- nicer output for 'ffmpeg -formats' +- Matroska demuxer +- SGI image format, encoding and decoding +- H.264 loop filter support +- H.264 CABAC support +- nicer looking arrows for the motion vector visualization +- improved VCD support +- audio timestamp drift compensation +- MPEG-2 YUV 422/444 support +- polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample +- better image scaling +- H.261 support +- correctly interleave packets during encoding +- VIS optimized motion compensation +- intra_dc_precision>0 encoding support +- support reuse of motion vectors/MB types/field select values of the source video +- more accurate deblock filter +- padding support +- many optimizations and bugfixes +- FunCom ISS audio file demuxer and according ADPCM decoding + + +version 0.4.8: + +- MPEG-2 video encoding (Michael) +- Id RoQ playback subsystem (Mike Melanson and Tim Ferguson) +- Wing Commander III Movie (.mve) file playback subsystem (Mike Melanson + and Mario Brito) +- Xan DPCM audio decoder (Mario Brito) +- Interplay MVE playback subsystem (Mike Melanson) +- Duck DK3 and DK4 ADPCM audio decoders (Mike Melanson) + + +version 0.4.7: + +- RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from mplayerhq + (originally from public domain player for Amiga at http://www.honeypot.net/audio) +- current version now also compiles with older GCC (Fabrice) +- 4X multimedia playback system including 4xm file demuxer (Mike + Melanson), and 4X video and audio codecs (Michael) +- Creative YUV (CYUV) decoder (Mike Melanson) +- FFV1 codec (our very simple lossless intra only codec, compresses much better + than HuffYUV) (Michael) +- ASV1 (Asus), H.264, Intel indeo3 codecs have been added (various) +- tiny PNG encoder and decoder, tiny GIF decoder, PAM decoder (PPM with + alpha support), JPEG YUV colorspace support. (Fabrice Bellard) +- ffplay has been replaced with a newer version which uses SDL (optionally) + for multiplatform support (Fabrice) +- Sorenson Version 3 codec (SVQ3) support has been added (decoding only) - donated + by anonymous +- AMR format has been added (Johannes Carlsson) +- 3GP support has been added (Johannes Carlsson) +- VP3 codec has been added (Mike Melanson) +- more MPEG-1/2 fixes +- better multiplatform support, MS Visual Studio fixes (various) +- AltiVec optimizations (Magnus Damn and others) +- SH4 processor support has been added (BERO) +- new public interfaces (avcodec_get_pix_fmt) (Roman Shaposhnick) +- VOB streaming support (Brian Foley) +- better MP3 autodetection (Andriy Rysin) +- qpel encoding (Michael) +- 4mv+b frames encoding finally fixed (Michael) +- chroma ME (Michael) +- 5 comparison functions for ME (Michael) +- B-frame encoding speedup (Michael) +- WMV2 codec (unfinished - Michael) +- user specified diamond size for EPZS (Michael) +- Playstation STR playback subsystem, still experimental (Mike and Michael) +- ASV2 codec (Michael) +- CLJR decoder (Alex) + +.. And lots more new enhancements and fixes. + + +version 0.4.6: + +- completely new integer only MPEG audio layer 1/2/3 decoder rewritten + from scratch +- Recoded DCT and motion vector search with gcc (no longer depends on nasm) +- fix quantization bug in AC3 encoder +- added PCM codecs and format. Corrected WAV/AVI/ASF PCM issues +- added prototype ffplay program +- added GOB header parsing on H.263/H.263+ decoder (Juanjo) +- bug fix on MCBPC tables of H.263 (Juanjo) +- bug fix on DC coefficients of H.263 (Juanjo) +- added Advanced Prediction Mode on H.263/H.263+ decoder (Juanjo) +- now we can decode H.263 streams found in QuickTime files (Juanjo) +- now we can decode H.263 streams found in VIVO v1 files(Juanjo) +- preliminary RTP "friendly" mode for H.263/H.263+ coding. (Juanjo) +- added GOB header for H.263/H.263+ coding on RTP mode (Juanjo) +- now H.263 picture size is returned on the first decoded frame (Juanjo) +- added first regression tests +- added MPEG-2 TS demuxer +- new demux API for libav +- more accurate and faster IDCT (Michael) +- faster and entropy-controlled motion search (Michael) +- two pass video encoding (Michael) +- new video rate control (Michael) +- added MSMPEG4V1, MSMPEGV2 and WMV1 support (Michael) +- great performance improvement of video encoders and decoders (Michael) +- new and faster bit readers and vlc parsers (Michael) +- high quality encoding mode: tries all macroblock/VLC types (Michael) +- added DV video decoder +- preliminary RTP/RTSP support in ffserver and libavformat +- H.263+ AIC decoding/encoding support (Juanjo) +- VCD MPEG-PS mode (Juanjo) +- PSNR stuff (Juanjo) +- simple stats output (Juanjo) +- 16-bit and 15-bit RGB/BGR/GBR support (Bisqwit) + + +version 0.4.5: + +- some header fixes (Zdenek Kabelac ) +- many MMX optimizations (Nick Kurshev ) +- added configure system (actually a small shell script) +- added MPEG audio layer 1/2/3 decoding using LGPL'ed mpglib by + Michael Hipp (temporary solution - waiting for integer only + decoder) +- fixed VIDIOCSYNC interrupt +- added Intel H.263 decoding support ('I263' AVI fourCC) +- added Real Video 1.0 decoding (needs further testing) +- simplified image formats again. Added PGM format (=grey + pgm). Renamed old PGM to PGMYUV. +- fixed msmpeg4 slice issues (tell me if you still find problems) +- fixed OpenDivX bugs with newer versions (added VOL header decoding) +- added support for MPlayer interface +- added macroblock skip optimization +- added MJPEG decoder +- added mmx/mmxext IDCT from libmpeg2 +- added pgmyuvpipe, ppm, and ppm_pipe formats (original patch by Celer + ) +- added pixel format conversion layer (e.g. for MJPEG or PPM) +- added deinterlacing option +- MPEG-1/2 fixes +- MPEG-4 vol header fixes (Jonathan Marsden ) +- ARM optimizations (Lionel Ulmer ). +- Windows porting of file converter +- added MJPEG raw format (input/output) +- added JPEG image format support (input/output) + + +version 0.4.4: + +- fixed some std header definitions (Bjorn Lindgren + ). +- added MPEG demuxer (MPEG-1 and 2 compatible). +- added ASF demuxer +- added prototype RM demuxer +- added AC3 decoding (done with libac3 by Aaron Holtzman) +- added decoding codec parameter guessing (.e.g. for MPEG, because the + header does not include them) +- fixed header generation in MPEG-1, AVI and ASF muxer: wmplayer can now + play them (only tested video) +- fixed H.263 white bug +- fixed phase rounding in img resample filter +- add MMX code for polyphase img resample filter +- added CPU autodetection +- added generic title/author/copyright/comment string handling (ASF and RM + use them) +- added SWF demux to extract MP3 track (not usable yet because no MP3 + decoder) +- added fractional frame rate support +- codecs are no longer searched by read_header() (should fix ffserver + segfault) + + +version 0.4.3: + +- BGR24 patch (initial patch by Jeroen Vreeken ) +- fixed raw yuv output +- added motion rounding support in MPEG-4 +- fixed motion bug rounding in MSMPEG4 +- added B-frame handling in video core +- added full MPEG-1 decoding support +- added partial (frame only) MPEG-2 support +- changed the FOURCC code for H.263 to "U263" to be able to see the + +AVI/H.263 file with the UB Video H.263+ decoder. MPlayer works with + this +codec ;) (JuanJo). +- Halfpel motion estimation after MB type selection (JuanJo) +- added pgm and .Y.U.V output format +- suppressed 'img:' protocol. Simply use: /tmp/test%d.[pgm|Y] as input or + output. +- added pgmpipe I/O format (original patch from Martin Aumueller + , but changed completely since we use a format + instead of a protocol) + + +version 0.4.2: + +- added H.263/MPEG-4/MSMPEG4 decoding support. MPEG-4 decoding support + (for OpenDivX) is almost complete: 8x8 MVs and rounding are + missing. MSMPEG4 support is complete. +- added prototype MPEG-1 decoder. Only I- and P-frames handled yet (it + can decode ffmpeg MPEGs :-)). +- added libavcodec API documentation (see apiexample.c). +- fixed image polyphase bug (the bottom of some images could be + greenish) +- added support for non clipped motion vectors (decoding only) + and image sizes non-multiple of 16 +- added support for AC prediction (decoding only) +- added file overwrite confirmation (can be disabled with -y) +- added custom size picture to H.263 using H.263+ (Juanjo) + + +version 0.4.1: + +- added MSMPEG4 (aka DivX) compatible encoder. Changed default codec + of AVI and ASF to DIV3. +- added -me option to set motion estimation method + (default=log). suppressed redundant -hq option. +- added options -acodec and -vcodec to force a given codec (useful for + AVI for example) +- fixed -an option +- improved dct_quantize speed +- factorized some motion estimation code + + +version 0.4.0: + +- removing grab code from ffserver and moved it to ffmpeg. Added + multistream support to ffmpeg. +- added timeshifting support for live feeds (option ?date=xxx in the + URL) +- added high quality image resize code with polyphase filter (need + mmx/see optimization). Enable multiple image size support in ffserver. +- added multi live feed support in ffserver +- suppressed master feature from ffserver (it should be done with an + external program which opens the .ffm url and writes it to another + ffserver) +- added preliminary support for video stream parsing (WAV and AVI half + done). Added proper support for audio/video file conversion in + ffmpeg. +- added preliminary support for video file sending from ffserver +- redesigning I/O subsystem: now using URL based input and output + (see avio.h) +- added WAV format support +- added "tty user interface" to ffmpeg to stop grabbing gracefully +- added MMX/SSE optimizations to SAD (Sums of Absolutes Differences) + (Juan J. Sierralta P. a.k.a. "Juanjo" ) +- added MMX DCT from mpeg2_movie 1.5 (Juanjo) +- added new motion estimation algorithms, log and phods (Juanjo) +- changed directories: libav for format handling, libavcodec for + codecs + + +version 0.3.4: + +- added stereo in MPEG audio encoder + + +version 0.3.3: + +- added 'high quality' mode which use motion vectors. It can be used in + real time at low resolution. +- fixed rounding problems which caused quality problems at high + bitrates and large GOP size + + +version 0.3.2: small fixes + +- ASF fixes +- put_seek bug fix + + +version 0.3.1: added avi/divx support + +- added AVI support +- added MPEG-4 codec compatible with OpenDivX. It is based on the H.263 codec +- added sound for flash format (not tested) + + +version 0.3: initial public release diff --git a/LedOK/ffmpeg-mac/INSTALL_RECEIPT.json b/LedOK/ffmpeg-mac/INSTALL_RECEIPT.json new file mode 100644 index 0000000..0242bb9 --- /dev/null +++ b/LedOK/ffmpeg-mac/INSTALL_RECEIPT.json @@ -0,0 +1,492 @@ +{ + "homebrew_version": "4.0.13-34-gad3d207", + "used_options": [ + + ], + "unused_options": [ + + ], + "built_as_bottle": true, + "poured_from_bottle": true, + "loaded_from_api": true, + "installed_as_dependency": false, + "installed_on_request": true, + "changed_files": [ + "lib/pkgconfig/libavcodec.pc", + "lib/pkgconfig/libavdevice.pc", + "lib/pkgconfig/libavfilter.pc", + "lib/pkgconfig/libavformat.pc", + "lib/pkgconfig/libavutil.pc", + "lib/pkgconfig/libpostproc.pc", + "lib/pkgconfig/libswresample.pc", + "lib/pkgconfig/libswscale.pc" + ], + "time": 1682070804, + "source_modified_time": 1677530629, + "compiler": "clang", + "aliases": [ + "ffmpeg@6" + ], + "runtime_dependencies": [ + { + "full_name": "brotli", + "version": "1.0.9", + "declared_directly": false + }, + { + "full_name": "giflib", + "version": "5.2.1", + "declared_directly": false + }, + { + "full_name": "highway", + "version": "1.0.4", + "declared_directly": false + }, + { + "full_name": "imath", + "version": "3.1.7", + "declared_directly": false + }, + { + "full_name": "jpeg-turbo", + "version": "2.1.5.1", + "declared_directly": false + }, + { + "full_name": "libpng", + "version": "1.6.39", + "declared_directly": false + }, + { + "full_name": "lz4", + "version": "1.9.4", + "declared_directly": false + }, + { + "full_name": "xz", + "version": "5.4.2", + "declared_directly": true + }, + { + "full_name": "zstd", + "version": "1.5.5", + "declared_directly": false + }, + { + "full_name": "libtiff", + "version": "4.4.0", + "declared_directly": false + }, + { + "full_name": "little-cms2", + "version": "2.14", + "declared_directly": false + }, + { + "full_name": "openexr", + "version": "3.1.7", + "declared_directly": false + }, + { + "full_name": "webp", + "version": "1.3.0", + "declared_directly": true + }, + { + "full_name": "jpeg-xl", + "version": "0.8.1", + "declared_directly": false + }, + { + "full_name": "libvmaf", + "version": "2.3.1", + "declared_directly": true + }, + { + "full_name": "aom", + "version": "3.6.0", + "declared_directly": true + }, + { + "full_name": "aribb24", + "version": "1.0.4", + "declared_directly": true + }, + { + "full_name": "dav1d", + "version": "1.1.0", + "declared_directly": true + }, + { + "full_name": "freetype", + "version": "2.13.0", + "declared_directly": true + }, + { + "full_name": "fontconfig", + "version": "2.14.2", + "declared_directly": true + }, + { + "full_name": "frei0r", + "version": "1.8.0", + "declared_directly": true + }, + { + "full_name": "ca-certificates", + "version": "2023-01-10", + "declared_directly": false + }, + { + "full_name": "gmp", + "version": "6.2.1", + "declared_directly": false + }, + { + "full_name": "libunistring", + "version": "1.1", + "declared_directly": false + }, + { + "full_name": "gettext", + "version": "0.21.1", + "declared_directly": false + }, + { + "full_name": "libidn2", + "version": "2.3.4", + "declared_directly": false + }, + { + "full_name": "libtasn1", + "version": "4.19.0", + "declared_directly": false + }, + { + "full_name": "nettle", + "version": "3.8.1", + "declared_directly": false + }, + { + "full_name": "p11-kit", + "version": "0.24.1", + "declared_directly": false + }, + { + "full_name": "openssl@1.1", + "version": "1.1.1t", + "declared_directly": false + }, + { + "full_name": "libevent", + "version": "2.1.12", + "declared_directly": false + }, + { + "full_name": "libnghttp2", + "version": "1.52.0", + "declared_directly": false + }, + { + "full_name": "unbound", + "version": "1.17.1", + "declared_directly": false + }, + { + "full_name": "gnutls", + "version": "3.8.0", + "declared_directly": true + }, + { + "full_name": "lame", + "version": "3.100", + "declared_directly": true + }, + { + "full_name": "fribidi", + "version": "1.0.12", + "declared_directly": false + }, + { + "full_name": "pcre2", + "version": "10.42", + "declared_directly": false + }, + { + "full_name": "glib", + "version": "2.76.1", + "declared_directly": false + }, + { + "full_name": "xorgproto", + "version": "2022.2", + "declared_directly": false + }, + { + "full_name": "libxau", + "version": "1.0.11", + "declared_directly": false + }, + { + "full_name": "libxdmcp", + "version": "1.1.4", + "declared_directly": false + }, + { + "full_name": "libxcb", + "version": "1.15", + "declared_directly": false + }, + { + "full_name": "libx11", + "version": "1.8.4", + "declared_directly": false + }, + { + "full_name": "libxext", + "version": "1.3.5", + "declared_directly": false + }, + { + "full_name": "libxrender", + "version": "0.9.11", + "declared_directly": false + }, + { + "full_name": "lzo", + "version": "2.10", + "declared_directly": false + }, + { + "full_name": "pixman", + "version": "0.42.2", + "declared_directly": false + }, + { + "full_name": "cairo", + "version": "1.16.0", + "declared_directly": false + }, + { + "full_name": "graphite2", + "version": "1.3.14", + "declared_directly": false + }, + { + "full_name": "icu4c", + "version": "72.1", + "declared_directly": false + }, + { + "full_name": "harfbuzz", + "version": "7.1.0", + "declared_directly": false + }, + { + "full_name": "libunibreak", + "version": "5.1", + "declared_directly": false + }, + { + "full_name": "libass", + "version": "0.17.1", + "declared_directly": true + }, + { + "full_name": "libbluray", + "version": "1.3.4", + "declared_directly": true + }, + { + "full_name": "cjson", + "version": "1.7.15", + "declared_directly": false + }, + { + "full_name": "mbedtls", + "version": "3.4.0", + "declared_directly": false + }, + { + "full_name": "librist", + "version": "0.2.7", + "declared_directly": true + }, + { + "full_name": "libsoxr", + "version": "0.1.3", + "declared_directly": true + }, + { + "full_name": "libvidstab", + "version": "1.1.1", + "declared_directly": true + }, + { + "full_name": "libogg", + "version": "1.3.5", + "declared_directly": false + }, + { + "full_name": "libvorbis", + "version": "1.3.7", + "declared_directly": true + }, + { + "full_name": "libvpx", + "version": "1.13.0", + "declared_directly": true + }, + { + "full_name": "opencore-amr", + "version": "0.1.6", + "declared_directly": true + }, + { + "full_name": "openjpeg", + "version": "2.5.0", + "declared_directly": true + }, + { + "full_name": "opus", + "version": "1.3.1", + "declared_directly": true + }, + { + "full_name": "rav1e", + "version": "0.6.4", + "declared_directly": true + }, + { + "full_name": "libsamplerate", + "version": "0.2.2", + "declared_directly": false + }, + { + "full_name": "flac", + "version": "1.4.2", + "declared_directly": false + }, + { + "full_name": "mpg123", + "version": "1.31.3", + "declared_directly": false + }, + { + "full_name": "libsndfile", + "version": "1.2.0", + "declared_directly": false + }, + { + "full_name": "rubberband", + "version": "3.2.1", + "declared_directly": true + }, + { + "full_name": "sdl2", + "version": "2.26.5", + "declared_directly": true + }, + { + "full_name": "snappy", + "version": "1.1.10", + "declared_directly": true + }, + { + "full_name": "speex", + "version": "1.2.1", + "declared_directly": true + }, + { + "full_name": "srt", + "version": "1.5.1", + "declared_directly": true + }, + { + "full_name": "svt-av1", + "version": "1.4.1", + "declared_directly": true + }, + { + "full_name": "leptonica", + "version": "1.82.0", + "declared_directly": false + }, + { + "full_name": "libb2", + "version": "0.98.1", + "declared_directly": false + }, + { + "full_name": "libarchive", + "version": "3.6.2", + "declared_directly": false + }, + { + "full_name": "pango", + "version": "1.50.14", + "declared_directly": false + }, + { + "full_name": "tesseract", + "version": "5.3.1", + "declared_directly": true + }, + { + "full_name": "theora", + "version": "1.1.1", + "declared_directly": true + }, + { + "full_name": "x264", + "version": "r3095", + "declared_directly": true + }, + { + "full_name": "x265", + "version": "3.5", + "declared_directly": true + }, + { + "full_name": "xvid", + "version": "1.3.7", + "declared_directly": true + }, + { + "full_name": "libsodium", + "version": "1.0.18", + "declared_directly": false + }, + { + "full_name": "zeromq", + "version": "4.3.4", + "declared_directly": true + }, + { + "full_name": "zimg", + "version": "3.0.4", + "declared_directly": true + } + ], + "source": { + "spec": "stable", + "versions": { + "stable": "6.0", + "head": null, + "version_scheme": 0 + }, + "path": "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ffmpeg.rb", + "tap_git_head": "df8da4548bf1a0b5e81c0efbe054ed482b2ec106", + "tap": "homebrew/core" + }, + "arch": "x86_64", + "built_on": { + "os": "Macintosh", + "os_version": "macOS 12.6", + "cpu_family": "penryn", + "xcode": "14.2", + "clt": "14.2.0.0.1.1668646533", + "preferred_perl": "5.30" + } +} \ No newline at end of file diff --git a/LedOK/ffmpeg-mac/LICENSE.md b/LedOK/ffmpeg-mac/LICENSE.md new file mode 100644 index 0000000..613070e --- /dev/null +++ b/LedOK/ffmpeg-mac/LICENSE.md @@ -0,0 +1,129 @@ +# License + +Most files in FFmpeg are under the GNU Lesser General Public License version 2.1 +or later (LGPL v2.1+). Read the file `COPYING.LGPLv2.1` for details. Some other +files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to +FFmpeg. + +Some optional parts of FFmpeg are licensed under the GNU General Public License +version 2 or later (GPL v2+). See the file `COPYING.GPLv2` for details. None of +these parts are used by default, you have to explicitly pass `--enable-gpl` to +configure to activate them. In this case, FFmpeg's license changes to GPL v2+. + +Specifically, the GPL parts of FFmpeg are: + +- libpostproc +- optional x86 optimization in the files + - `libavcodec/x86/flac_dsp_gpl.asm` + - `libavcodec/x86/idct_mmx.c` + - `libavfilter/x86/vf_removegrain.asm` +- the following building and testing tools + - `compat/solaris/make_sunver.pl` + - `doc/t2h.pm` + - `doc/texi2pod.pl` + - `libswresample/tests/swresample.c` + - `tests/checkasm/*` + - `tests/tiny_ssim.c` +- the following filters in libavfilter: + - `signature_lookup.c` + - `vf_blackframe.c` + - `vf_boxblur.c` + - `vf_colormatrix.c` + - `vf_cover_rect.c` + - `vf_cropdetect.c` + - `vf_delogo.c` + - `vf_eq.c` + - `vf_find_rect.c` + - `vf_fspp.c` + - `vf_histeq.c` + - `vf_hqdn3d.c` + - `vf_kerndeint.c` + - `vf_lensfun.c` (GPL version 3 or later) + - `vf_mcdeint.c` + - `vf_mpdecimate.c` + - `vf_nnedi.c` + - `vf_owdenoise.c` + - `vf_perspective.c` + - `vf_phase.c` + - `vf_pp.c` + - `vf_pp7.c` + - `vf_pullup.c` + - `vf_repeatfields.c` + - `vf_sab.c` + - `vf_signature.c` + - `vf_smartblur.c` + - `vf_spp.c` + - `vf_stereo3d.c` + - `vf_super2xsai.c` + - `vf_tinterlace.c` + - `vf_uspp.c` + - `vf_vaguedenoiser.c` + - `vsrc_mptestsrc.c` + +Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then +the configure parameter `--enable-version3` will activate this licensing option +for you. Read the file `COPYING.LGPLv3` or, if you have enabled GPL parts, +`COPYING.GPLv3` to learn the exact legal terms that apply in this case. + +There are a handful of files under other licensing terms, namely: + +* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and + `libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for + licensing details. Specifically note that you must credit the IJG in the + documentation accompanying your program if you only distribute executables. + You must also indicate any changes including additions and deletions to + those three files in the documentation. +* `tests/reference.pnm` is under the expat license. + + +## External libraries + +FFmpeg can be combined with a number of external libraries, which sometimes +affect the licensing of binaries resulting from the combination. + +### Compatible libraries + +The following libraries are under GPL version 2: +- avisynth +- frei0r +- libcdio +- libdavs2 +- librubberband +- libvidstab +- libx264 +- libx265 +- libxavs +- libxavs2 +- libxvid + +When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by +passing `--enable-gpl` to configure. + +The following libraries are under LGPL version 3: +- gmp +- libaribb24 +- liblensfun + +When combining them with FFmpeg, use the configure option `--enable-version3` to +upgrade FFmpeg to the LGPL v3. + +The VMAF, mbedTLS, RK MPI, OpenCORE and VisualOn libraries are under the Apache License +2.0. That license is incompatible with the LGPL v2.1 and the GPL v2, but not with +version 3 of those licenses. So to combine these libraries with FFmpeg, the +license version needs to be upgraded by passing `--enable-version3` to configure. + +The smbclient library is under the GPL v3, to combine it with FFmpeg, +the options `--enable-gpl` and `--enable-version3` have to be passed to +configure to upgrade FFmpeg to the GPL v3. + +### Incompatible libraries + +There are certain libraries you can combine with FFmpeg whose licenses are not +compatible with the GPL and/or the LGPL. If you wish to enable these +libraries, even in circumstances that their license may be incompatible, pass +`--enable-nonfree` to configure. This will cause the resulting binary to be +unredistributable. + +The Fraunhofer FDK AAC and OpenSSL libraries are under licenses which are +incompatible with the GPLv2 and v3. To the best of our knowledge, they are +compatible with the LGPL. diff --git a/LedOK/ffmpeg-mac/README.md b/LedOK/ffmpeg-mac/README.md new file mode 100644 index 0000000..f8c23f2 --- /dev/null +++ b/LedOK/ffmpeg-mac/README.md @@ -0,0 +1,46 @@ +FFmpeg README +============= + +FFmpeg is a collection of libraries and tools to process multimedia content +such as audio, video, subtitles and related metadata. + +## Libraries + +* `libavcodec` provides implementation of a wider range of codecs. +* `libavformat` implements streaming protocols, container formats and basic I/O access. +* `libavutil` includes hashers, decompressors and miscellaneous utility functions. +* `libavfilter` provides means to alter decoded audio and video through a directed graph of connected filters. +* `libavdevice` provides an abstraction to access capture and playback devices. +* `libswresample` implements audio mixing and resampling routines. +* `libswscale` implements color conversion and scaling routines. + +## Tools + +* [ffmpeg](https://ffmpeg.org/ffmpeg.html) is a command line toolbox to + manipulate, convert and stream multimedia content. +* [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player. +* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect + multimedia content. +* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`. + +## Documentation + +The offline documentation is available in the **doc/** directory. + +The online documentation is available in the main [website](https://ffmpeg.org) +and in the [wiki](https://trac.ffmpeg.org). + +### Examples + +Coding examples are available in the **doc/examples** directory. + +## License + +FFmpeg codebase is mainly LGPL-licensed with optional components licensed under +GPL. Please refer to the LICENSE file for detailed information. + +## Contributing + +Patches should be submitted to the ffmpeg-devel mailing list using +`git format-patch` or `git send-email`. Github pull requests should be +avoided because they are not part of our review process and will be ignored. diff --git a/LedOK/ffmpeg-mac/bin/aviocat b/LedOK/ffmpeg-mac/bin/aviocat new file mode 100755 index 0000000000000000000000000000000000000000..5d38a04a6a583f2bb69c013a68579021fd8801ba GIT binary patch literal 99728 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 ABLDyZ literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/bisect-create b/LedOK/ffmpeg-mac/bin/bisect-create new file mode 100755 index 0000000..ee6ec3f --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/bisect-create @@ -0,0 +1,46 @@ +#!/bin/sh + +set -e + +if test "bisect-create" = "`basename $0`" ; then + echo tools/ffbisect created + git show master:tools/bisect-create > tools/ffbisect + chmod u+x tools/ffbisect + exit 1 +fi + +if ! git show master:tools/bisect-create | diff - tools/ffbisect > /dev/null ; then + echo updating tools/ffbisect script to HEAD. + git show master:tools/bisect-create > tools/ffbisect + chmod u+x tools/ffbisect + tools/ffbisect $* + exit 0 +fi + +case "$1" in + need) + case $2 in + ffmpeg|ffplay|ffprobe) + echo $2.c >> tools/bisect.need + ;; + esac + ;; + start|reset) + echo . > tools/bisect.need + git bisect $* + ;; + skip) + git bisect $* + ;; + good|bad) + git bisect $* + + until ls `cat tools/bisect.need` > /dev/null 2> /dev/null; do + git bisect skip || break + done + ;; + run) + shift # remove "run" from arguments + git bisect run sh -c "ls \`cat tools/bisect.need\` > /dev/null 2> /dev/null || exit 125; \"\$@\"" sh "$@" + ;; +esac diff --git a/LedOK/ffmpeg-mac/bin/cl2c b/LedOK/ffmpeg-mac/bin/cl2c new file mode 100755 index 0000000..e3f92ba --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/cl2c @@ -0,0 +1,36 @@ +#!/bin/sh +# Convert an OpenCL source file into a C source file containing the +# OpenCL source as a C string. Also adds a #line directive so that +# compiler messages are useful. + +# 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 + +input="$1" +output="$2" + +name=$(basename "$input" | sed 's/.cl$//') + +cat >$output <>$output + +echo ";" >>$output diff --git a/LedOK/ffmpeg-mac/bin/clean-diff b/LedOK/ffmpeg-mac/bin/clean-diff new file mode 100755 index 0000000..4600702 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/clean-diff @@ -0,0 +1,11 @@ +#!/bin/sh +sed '/^+[^+]/!s/ /TaBBaT/g' |\ + expand -t $(seq -s , 9 8 200) |\ + sed 's/TaBBaT/ /g' |\ + sed '/^+[^+]/s/ * $//' |\ + tr -d '\015' |\ + tr '\n' '' |\ + sed 's/\(@@[^@]*@@[^@]*\)/\n\1/g' |\ + egrep -v '@@[^@]*@@(( [^]*)|([+-][[:space:]]*)|(-[[:space:]]*([^]*)\+[[:space:]]*\5))*$' |\ + tr -d '\n' |\ + tr '' '\n' diff --git a/LedOK/ffmpeg-mac/bin/crypto_bench b/LedOK/ffmpeg-mac/bin/crypto_bench new file mode 100755 index 0000000000000000000000000000000000000000..3061cb3dd2a692fad8509e64b654eb78acb78d87 GIT binary patch literal 53952 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 TJ2(8ccWxNcgje!?dV%6UM0~V* literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/dvd2concat b/LedOK/ffmpeg-mac/bin/dvd2concat new file mode 100755 index 0000000..24809fb --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/dvd2concat @@ -0,0 +1,161 @@ +#!/usr/bin/env perl + +# Copyright (c) 2014 Nicolas George +# +# This file is part of FFmpeg. +# +# FFmpeg is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# FFmpeg is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with FFmpeg; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +=head1 NAME + +dvd2concat - create a concat script for a DVD title + +=head1 SYNOPSIS + +tools/dvd2concat I > I + +=head1 DESCRIPTION + +This script uses B to produce concat script for a DVD title. +The resulting script can be used to play the DVD using B, to +transcode it using B or any other similar use. + +I is the path to the DVD structure hierarchy; it +normally contains a directory named B. It must not be encrypted +with CSS. + +I is the output file. It can be used as an input to ffmpeg. +It will require the B<-safe 0> and +B<-protocol_whitelist file,subfile,concat> options. + +=cut + +use strict; +use warnings; +use Getopt::Long ":config" => "require_order"; +use Pod::Usage; + +my $title; + +GetOptions ( + "help|usage|?|h" => sub { pod2usage({ -verbose => 1, -exitval => 0 }) }, + "manpage|m" => sub { pod2usage({ -verbose => 2, -exitval => 0 }) }, + "title|t=i" => \$title, +) and @ARGV == 1 or pod2usage({ -verbose => 1, -exitval => 1 }); +my ($path) = @ARGV; + +my $lsdvd_message = +"Make sure your lsdvd version has the two following patches applied:\n" . +"http://sourceforge.net/p/lsdvd/feature-requests/1/\n" . +"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=603826\n"; + +my $lsdvd = do { + open my $l, "-|", "lsdvd", "-Op", "-x", $path + or die "You need to install lsdvd for this script to work.\n$lsdvd_message"; + local $/; + <$l>; +}; +my %lsdvd = eval $lsdvd; +die $@ if $@; + +if (!defined $title) { + $title = $lsdvd{longest_track}; + warn "Using longest title $title\n"; +} +my $track = $lsdvd{track}[$title - 1] + or die "Title $title does not exist (1-", scalar(@{$lsdvd{track}}), ")\n"; +my $vts_base = sprintf "%s/VIDEO_TS/VTS_%02d_", $path, $track->{vts}; +my @frag; +for my $i (1 .. 9) { + my $file = sprintf "%s%d.VOB", $vts_base, $i; + my $size = -s $file or last; + push @frag, { file => $file, size => $size >> 11 }; +} + +my $concat = "ffconcat version 1.0\n"; +$concat .= "\nstream\nexact_stream_id 0x1E0\n"; +for my $audio (@{$track->{audio}}) { + $concat .= "\nstream\nexact_stream_id " . $audio->{streamid} . "\n"; + $concat .= "stream_meta language " . $audio->{langcode} . "\n" if $audio->{langcode}; +} +for my $subp (@{$track->{subp}}) { + $concat .= "\nstream\nexact_stream_id " . $subp->{streamid} . "\n"; + $concat .= "stream_codec dvd_subtitle\n"; + $concat .= "stream_meta language " . $subp->{langcode} . "\n" if $subp->{langcode}; + my $extradata = ""; + if ($track->{width} && $track->{height}) { + $extradata .= "size: " . $track->{width} . "x" . $track->{height} . "\n"; + } + if (my $pal = $track->{palette}) { + my @pal; + for my $c (@$pal) { + # Adapted from mplayer/sub/vobsub.c + my $y = ((hex($c) >> 16) & 0xFF); + my $u = ((hex($c) >> 8) & 0xFF) - 128; + my $v = ((hex($c) >> 0) & 0xFF) - 128; + my ($r, $g, $b) = map { int($_ < 0 ? 0 : $_ > 255 ? 255 : $_) } + $y + 1.4022 * $u, + $y - 0.3456 * $u - 0.7145 * $v, + $y + 1.7710 * $v; + push @pal, sprintf "%06x", ($r << 16) | ($g << 8) | $b; + } + $extradata .= "palette: " . join(", ", @pal) . "\n"; + } + if ($extradata ne "") { + $concat .= "stream_extradata " . unpack("H*", $extradata); + } +} +my $chap_time = 0; +for my $chap (@{$track->{chapter}}) { + $concat .= sprintf "\nchapter %d %.3f %.3f\n", + $chap->{ix}, $chap_time, $chap_time + $chap->{length}; + $chap_time += $chap->{length}; +} +for my $cell (@{$track->{cell}}) { + my $off = $cell->{first_sector}; + die "Your lsdvd version does not print cell sectors.\n$lsdvd_message" + unless defined $off; + my $size = $cell->{last_sector} + 1 - $cell->{first_sector}; + + my $frag = 0; + while ($frag < @frag) { + last if $off < $frag[$frag]->{size}; + $off -= $frag[$frag++]->{size}; + } + die "Cell beyond VOB data\n" unless $frag < @frag; + my $cur_off = $off; + my $cur_size = $size; + my @files; + while ($cur_size > $frag[$frag]->{size} - $cur_off) { + push @files, $frag[$frag]->{file}; + $cur_size -= $frag[$frag]->{size} - $cur_off; + $cur_off = 0; + die "Cell end beyond VOB data\n" unless ++$frag < @frag; + } + push @files, $frag[$frag]->{file}; + my $file = @files == 1 ? $files[0] : "concat:" . join("|", @files); + my $start = $off << 11; + my $end = ($off + $size) << 11; + + my $dur = int(1000 * $cell->{length}); + $concat .= "\nfile 'subfile:$file'\n"; + $concat .= "option start $start\n"; + $concat .= "option end $end\n"; + $concat .= sprintf "duration %02d:%02d:%02d.%03d\n", + int($dur / 3600000), int($dur / 60000) % 60, int($dur / 1000) % 60, + $dur % 1000; +} + +print $concat; diff --git a/LedOK/ffmpeg-mac/bin/enum_options b/LedOK/ffmpeg-mac/bin/enum_options new file mode 100755 index 0000000000000000000000000000000000000000..1c4891108332507a278c256dafbb68dd208d32c7 GIT binary patch literal 132064 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/ffescape b/LedOK/ffmpeg-mac/bin/ffescape new file mode 100755 index 0000000000000000000000000000000000000000..d2a4ce8e6ef37d72c13088f2f46c3fbb973cf0c2 GIT binary patch literal 50440 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 BPRjrQ literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/ffeval b/LedOK/ffmpeg-mac/bin/ffeval new file mode 100755 index 0000000000000000000000000000000000000000..3e0b857fba5485447fb8c4910f39c67932c51ead GIT binary patch literal 50344 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/ffmpeg b/LedOK/ffmpeg-mac/bin/ffmpeg new file mode 100755 index 0000000000000000000000000000000000000000..9a71e5b77af91a8508e449c8f07c89c9d2b13c8e GIT binary patch literal 364800 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%0A7FEq)7JTJ1vhN)_k$_B0PzKD( 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%0Dqo|)HCL+%wkRfeMlcwE6O-IlwvPM5$) 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 z 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 T{{6?FfB5k6!;k!jK>Ym=&uZ-N literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/ffplay b/LedOK/ffmpeg-mac/bin/ffplay new file mode 100755 index 0000000000000000000000000000000000000000..4cdce0ed1dd0da90a03f866d40abc4e87a184ef7 GIT binary patch literal 220800 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 nY&2 +This script is used to generate Windows resources file for the FFmpeg libraries. +The output .rc file is to be compiled by windres(1). It is mainly useful for +FFmpeg developers to tweak and regenerate all resources files at once. + +Usage: $0 + +The script will output the file to '/res.rc'. + +Example: $0 libavcodec 'FFmpeg codecs library' +EOF + exit 1 +} + +# Script to generate all: +# (to remove prefix '# ' and add 'tools/' as prefix: sed -r 's/^.{2}/tools\//') +# gen-rc libavutil "FFmpeg utility library" +# gen-rc libavcodec "FFmpeg codec library" +# gen-rc libavformat "FFmpeg container format library" +# gen-rc libavdevice "FFmpeg device handling library" +# gen-rc libavfilter "FFmpeg audio/video filtering library" +# gen-rc libpostproc "FFmpeg postprocessing library" +# gen-rc libswscale "FFmpeg image rescaling library" +# gen-rc libswresample "FFmpeg audio resampling library" + +## Sanity checks and argument parsing +if test $# -lt 2 || test $# -gt 3; then + die +fi + +name=$1 +shortname=${name#lib} +comment=$2 +capname=`echo $name | awk '{print toupper($0)}'` +version=${capname}_VERSION + +mkdir -p "$name" +output="$name/${shortname}res.rc" + +## REAL magic +cat < $output +/* + * Windows resource file for $name + * + * Copyright (C) 2012 James Almer + * Copyright (C) 2013 Tiancheng "Timothy" Gu + * + * 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 + */ + +#include +#include "$name/version.h" +#include "libavutil/ffversion.h" +#include "config.h" + +1 VERSIONINFO +FILEVERSION ${version}_MAJOR, ${version}_MINOR, ${version}_MICRO, 0 +PRODUCTVERSION ${version}_MAJOR, ${version}_MINOR, ${version}_MICRO, 0 +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904B0" + { + VALUE "CompanyName", "FFmpeg Project" + VALUE "FileDescription", "$comment" + VALUE "FileVersion", AV_STRINGIFY($version) + VALUE "InternalName", "$name" + VALUE "LegalCopyright", "Copyright (C) 2000-" AV_STRINGIFY(CONFIG_THIS_YEAR) " FFmpeg Project" + VALUE "OriginalFilename", "$shortname" BUILDSUF "-" AV_STRINGIFY(${version}_MAJOR) SLIBSUF + VALUE "ProductName", "FFmpeg" + VALUE "ProductVersion", FFMPEG_VERSION + } + } + + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04B0 + } +} +EOF diff --git a/LedOK/ffmpeg-mac/bin/graph2dot b/LedOK/ffmpeg-mac/bin/graph2dot new file mode 100755 index 0000000000000000000000000000000000000000..08bf9333d056fe77f82c3ac67494752cb1e416ba GIT binary patch literal 116384 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/ismindex b/LedOK/ffmpeg-mac/bin/ismindex new file mode 100755 index 0000000000000000000000000000000000000000..173ce233ad92b0afd545d9879cccb4d3900021a1 GIT binary patch literal 100896 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/libav-merge-next-commit b/LedOK/ffmpeg-mac/bin/libav-merge-next-commit new file mode 100755 index 0000000..9bd03fa --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/libav-merge-next-commit @@ -0,0 +1,22 @@ +#!/bin/sh + +if [ "$1" != "merge" -a "$1" != "noop" ]; then + printf "Usage: $0 \n" + exit 0 +fi + +[ "$1" = "noop" ] && merge_opts="-s ours" + +nextrev=$(git rev-list libav/master --not master --no-merges | tail -n1) +if [ -z "$nextrev" ]; then + printf "Nothing to merge..\n" + exit 0 +fi +printf "Merging $(git log -n 1 --oneline $nextrev)\n" +git merge --no-commit $merge_opts --no-ff --log $nextrev + +if [ "$1" = "noop" -a -n "$2" ]; then + printf "\nThis commit is a noop, see $2\n" >> .git/MERGE_MSG +fi + +printf "\nMerged-by: $(git config --get user.name) <$(git config --get user.email)>\n" >> .git/MERGE_MSG diff --git a/LedOK/ffmpeg-mac/bin/loudnorm.rb b/LedOK/ffmpeg-mac/bin/loudnorm.rb new file mode 100755 index 0000000..4ad374a --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/loudnorm.rb @@ -0,0 +1,61 @@ +#!/usr/bin/env ruby + +require 'open3' +require 'json' + +ffmpeg_bin = 'ffmpeg' +target_il = -24.0 +target_lra = +11.0 +target_tp = -2.0 +samplerate = '48k' + +if ARGF.argv.count != 2 + puts "Usage: #{$PROGRAM_NAME} input.wav output.wav" + exit 1 +end + +ff_cmd = Array.new([ + ffmpeg_bin, + '-hide_banner', + '-i', ARGF.argv[0], + '-af', "loudnorm='I=#{target_il}:LRA=#{target_lra}:tp=#{target_tp}:print_format=json'", + '-f', 'null', + '-']); + +_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) + +if wait_thr.value.success? + stats = JSON.parse(stderr.read.lines[-12, 12].join) + loudnorm_string = 'loudnorm=' + loudnorm_string += 'print_format=summary:' + loudnorm_string += 'linear=true:' + loudnorm_string += "I=#{target_il}:" + loudnorm_string += "LRA=#{target_lra}:" + loudnorm_string += "tp=#{target_tp}:" + loudnorm_string += "measured_I=#{stats['input_i']}:" + loudnorm_string += "measured_LRA=#{stats['input_lra']}:" + loudnorm_string += "measured_tp=#{stats['input_tp']}:" + loudnorm_string += "measured_thresh=#{stats['input_thresh']}:" + loudnorm_string += "offset=#{stats['target_offset']}" +else + puts stderr.read + exit 1 +end + +ff_cmd = Array.new([ + ffmpeg_bin, + '-y', '-hide_banner', + '-i', ARGF.argv[0], + '-af', loudnorm_string, + '-ar', samplerate, + ARGF.argv[1].to_s]); + +_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd) + +if wait_thr.value.success? + puts stderr.read.lines[-12, 12].join + exit 0 +else + puts stderr.read + exit 1 +end diff --git a/LedOK/ffmpeg-mac/bin/make_chlayout_test b/LedOK/ffmpeg-mac/bin/make_chlayout_test new file mode 100755 index 0000000..fcdbda3 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/make_chlayout_test @@ -0,0 +1,114 @@ +#!/usr/bin/env perl + +# Copyright (c) 2012 Nicolas George +# +# This file is part of FFmpeg. +# +# FFmpeg is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# FFmpeg is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with FFmpeg; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +=head1 NAME + +make_chlayout_test - produce a multichannel test file with the channels +clearly identified + +=head1 SYNOPSIS + +tools/make_chlayout_test I I + +=head1 DESCRIPTION + +This script uses B and B to produce a file with audio +channels clearly identified by their name. The resulting file can be used to +check that the layout and order of channels is correctly handled by a piece +of software, either a part of B or not. + +I is a list of channels or channel layouts, separated by '+'. + +I is a list of valid ffmpeg outout options, including the +output file. + +Note that some output codecs or formats can not handle arbitrary channel +layout. + +This script requires a B binary, either in the source tree or in the +search path; it must have the flite audio source enabled. + +=head1 EXAMPLES + +Check that the speakers are correctly plugged: + + tools/make_chlayout_test FL+FR -f alsa default + +Produce a 5.1 FLAC file: + + tools/make_chlayout_test 5.1 surround.flac + +=cut + +use strict; +use warnings; +use Getopt::Long ":config" => "require_order"; +use Pod::Usage; + +GetOptions ( + "help|usage|?|h" => sub { pod2usage({ -verbose => 1, -exitval => 0 }) }, + "manpage|m" => sub { pod2usage({ -verbose => 2, -exitval => 0 }) }, +) and @ARGV >= 2 or pod2usage({ -verbose => 1, -exitval => 1 }); + +my $channels = shift @ARGV; +my @out_options = @ARGV; + +my $ffmpeg = exists $ENV{FFMPEG} ? $ENV{FFMPEG} : + $0 =~ /(.*)\// && -e "$1/../ffmpeg" ? "$1/../ffmpeg" : + "ffmpeg"; + +my %channel_label_to_descr; +my %layout_to_channels; + +{ + open my $stderr, ">&STDERR"; + open STDERR, ">", "/dev/null"; + open my $f, "-|", $ffmpeg, "-layouts" or die "$ffmpeg: $!\n"; + open STDERR, ">&", $stderr; + while (<$f>) { + chomp; + next if /^NAME/ or /:$/ or /^$/; # skip headings + my ($name, $descr) = split " ", $_, 2; + next unless $descr; + if ($descr =~ /^[[:upper:]]+(?:\+[[:upper:]]+)*$/) { + $layout_to_channels{$name} = [ split /\+/, $descr ]; + } else { + $channel_label_to_descr{$name} = $descr; + } + } +} + +my @channels = map { @{$layout_to_channels{$_} // [$_]} } split /\+/, $channels; + +my $layout = join "+", @channels; +my $graph = ""; +my $concat_in = ""; +for my $i (0 .. $#channels) { + my $label = $channels[$i]; + my $descr = $channel_label_to_descr{$label} + or die "Channel $label not found\n"; + $graph .= "flite=text='${descr}', aformat=channel_layouts=mono, " . + "pan=${layout}:${label}=c0 [ch$i] ;\n"; + $concat_in .= "[ch$i] "; +} +$graph .= "${concat_in}concat=v=0:a=1:n=" . scalar(@channels); + +exec $ffmpeg, "-f", "lavfi", "-i", $graph, @out_options + or die "$ffmpeg: $!\n"; diff --git a/LedOK/ffmpeg-mac/bin/missing_codec_desc b/LedOK/ffmpeg-mac/bin/missing_codec_desc new file mode 100755 index 0000000..e1d3d60 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/missing_codec_desc @@ -0,0 +1,36 @@ +#!/bin/sh + +srcdir=${0%/*}/.. + +while read -r field equal value; do + case "$field $equal" in + ".id =") + eval "known_${value%,}=1" + ;; + esac +done < $srcdir/libavcodec/codec_desc.c + +known_AV_CODEC_ID_NONE=1 +known_AV_CODEC_ID_FIRST_AUDIO=1 +known_AV_CODEC_ID_FIRST_SUBTITLE=1 +known_AV_CODEC_ID_FIRST_UNKNOWN=1 +known_AV_CODEC_ID_PROBE=1 +known_AV_CODEC_ID_MPEG2TS=1 +known_AV_CODEC_ID_MPEG4SYSTEMS=1 +known_AV_CODEC_ID_FFMETADATA=1 + +in=0 +while read -r line; do + case "$in-$line" in + 0-"enum AVCodecID"*) in=1;; + 1-*"};"*) in=0;; + 1-*AV_CODEC_ID_*,*) + cid="${line%%[, =]*}" + eval "known=\$known_$cid" + case "$known" in + 1) ;; + *) echo "$cid missing";; + esac + ;; + esac +done < $srcdir/libavcodec/avcodec.h diff --git a/LedOK/ffmpeg-mac/bin/murge b/LedOK/ffmpeg-mac/bin/murge new file mode 100755 index 0000000..f22fcfd --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/murge @@ -0,0 +1,11 @@ +#!/bin/sh + +grep -A99999 '^<<<<<<<' | grep -B99999 '^>>>>>>>' >murge.X +grep -A99999 '^====' murge.X | egrep -v '^(=======|<<<<<<<|>>>>>>>|\|\|\|\|\|\|\|)' >murge.theirs +grep -B99999 '^||||' murge.X | egrep -v '^(=======|<<<<<<<|>>>>>>>|\|\|\|\|\|\|\|)' >murge.ours +grep -B99999 '^====' murge.X | grep -A99999 '^||||' | egrep -v '^(=======|<<<<<<<|>>>>>>>|\|\|\|\|\|\|\|)' >murge.common + +colordiff -du $* murge.ours murge.theirs +grep . murge.common > /dev/null && colordiff -du $* murge.common murge.theirs +grep . murge.common > /dev/null && colordiff -du $* murge.common murge.ours +rm murge.theirs murge.common murge.ours murge.X diff --git a/LedOK/ffmpeg-mac/bin/normalize.py b/LedOK/ffmpeg-mac/bin/normalize.py new file mode 100755 index 0000000..7d87c5e --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/normalize.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python2 + +import sys, subprocess + +if len(sys.argv) > 2: + ifile = sys.argv[1] + encopt = sys.argv[2:-1] + ofile = sys.argv[-1] +else: + print 'usage: %s [encode_options] ' % sys.argv[0] + sys.exit(1) + +analysis_cmd = 'ffprobe -v error -of compact=p=0:nk=1 ' +analysis_cmd += '-show_entries frame_tags=lavfi.r128.I -f lavfi ' +analysis_cmd += "amovie='%s',ebur128=metadata=1" % ifile +try: + probe_out = subprocess.check_output(analysis_cmd, shell=True) +except subprocess.CalledProcessError, e: + sys.exit(e.returncode) +loudness = ref = -23 +for line in probe_out.splitlines(): + sline = line.rstrip() + if sline: + loudness = sline +adjust = ref - float(loudness) +if abs(adjust) < 0.0001: + print 'No normalization needed for ' + ifile +else: + print "Adjust %s by %.1fdB" % (ifile, adjust) + norm_cmd = ['ffmpeg', '-i', ifile, '-af', 'volume=%fdB' % adjust] + norm_cmd += encopt + [ofile] + print ' => %s' % ' '.join(norm_cmd) + subprocess.call(norm_cmd) diff --git a/LedOK/ffmpeg-mac/bin/patcheck b/LedOK/ffmpeg-mac/bin/patcheck new file mode 100755 index 0000000..fe52938 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/patcheck @@ -0,0 +1,180 @@ +#!/bin/sh + +# if no argument provided, write stdin to a file and re-run the script +if [ $# = 0 ]; then + cat > patcheck.stdout + $0 patcheck.stdout + rm -f patcheck.stdout + exit +fi + +GREP=grep +EGREP=egrep +TMP=patcheck.tmp +OPT="-nH" +#FILES=$($GREP '^+++' $* | sed 's/+++ //g') + +echo patCHeck 1e10.0 +echo This tool is intended to help a human check/review patches. It is very far from +echo being free of false positives and negatives, and its output are just hints of what +echo may or may not be bad. When you use it and it misses something or detects +echo something wrong, fix it and send a patch to the ffmpeg-devel mailing list. +echo License: GPL, Author: Michael Niedermayer + +ERE_PRITYP='(unsigned *|)(char|short|long|int|long *int|short *int|void|float|double|(u|)int(8|16|32|64)_t)' +ERE_TYPES='(const|static|av_cold|inline| *)*('$ERE_PRITYP'|[a-zA-Z][a-zA-Z0-9_]*)[* ]{1,}[a-zA-Z][a-zA-Z0-9_]*' +ERE_FUNCS="$ERE_TYPES"' *\(' + +hiegrep(){ + arg="$1" + msg="$2" + shift 2 + $GREP $OPT '^+' $* | $GREP -v ':+++'| $EGREP --color=always -- "$arg"> $TMP && printf "\n$msg\n" + cat $TMP +} + +hiegrep2(){ + arg="$1" + varg="$2" + msg="$3" + shift 3 + $GREP $OPT '^+' $* | $GREP -v ':+++' | $EGREP -v -- "$varg" | $EGREP --color=always -- "$arg" > $TMP && printf "\n$msg\n" + cat $TMP +} + +hiegrep 'static[^(]*\*[a-zA-Z_]*\[' 'pointer array is not const' $* +hiegrep '[[:space:]]$' 'trailing whitespace' $* +hiegrep "$(echo x | tr 'x' '\t')" 'tabs' $* +#hiegrep ':\+$' 'Empty lines' $* +hiegrep ';;' 'double ;' $* +hiegrep2 '\b_[a-zA-Z0-9_]{1,}' '__(asm|attribute)([^a-zA-Z0-9]|$)' 'reserved identifer' $* +hiegrep '//[-/<\* ]*$' 'empty comment' $* +hiegrep '/\*[-<\* ]*\*/' 'empty comment' $* +hiegrep '(static|inline|const) *\1[^_a-zA-Z]' 'duplicate word' $* +hiegrep 'INIT_VLC_USE_STATIC' 'forbidden ancient vlc type' $* +hiegrep '=[-+\*\&] ' 'looks like compound assignment' $* +hiegrep2 '/\*\* *[a-zA-Z0-9].*' '\*/' 'Inconsistently formatted doxygen comment' $* +hiegrep '; */\*\*[^<]' 'Misformatted doxygen comment' $* +hiegrep '//!|/\*!' 'inconsistent doxygen syntax' $* + +hiegrep2 '(int|unsigned|static|void)[a-zA-Z0-9 _]*(init|end)[a-zA-Z0-9 _]*\(.*[^;]$' '(av_cold|:\+[^a-zA-Z_])' 'These functions may need av_cold, please review the whole patch for similar functions needing av_cold' $* + +hiegrep '\+= *1 *;' 'can be simplified to ++' $* +hiegrep '-= *1 *;' 'can be simplified to --' $* +hiegrep '((!|=)= *(0|NULL)[^0-9a-z]|[^0-9a-z](0|NULL) *(!|=)=)' 'x==0 / x!=0 can be simplified to !x / x' $* + +$EGREP $OPT '^\+ *(const *|)static' $*| $EGREP --color=always '[^=]= *(0|NULL)[^0-9a-zA-Z]'> $TMP && printf '\nuseless 0 init\n' +cat $TMP +hiegrep '# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $* + +hiegrep '\b(awnser|cant|dont|wont|doesnt|usefull|successfull|occured|teh|alot|wether|skiped|skiping|heigth|informations|colums|loosy|loosing|ouput|seperate|preceed|upto|paket|posible|unkown|inpossible|dimention|acheive|funtions|overriden|outputing|seperation|initalize|compatibilty|bistream|knwon|unknwon|choosen|additonal|gurantee|availble|wich|begining|milisecond|missmatch|threshhold)\b' 'common typos' $* + +hiegrep 'av_log\( *NULL' 'Missing context in av_log' $* +hiegrep '[^sn]printf' 'Please use av_log' $* +hiegrep '\bmalloc' 'Please use av_malloc' $* +hiegrep '\) *av_malloc' 'useless casts' $* +hiegrep ':\+ *'"$ERE_PRITYP"' *inline' 'non static inline or strangely ordered inline+static' $* +hiegrep "$ERE_FUNCS"' *\)' 'missing void' $* +hiegrep '(sprintf|strcat|strcpy)' 'Possible security issue, make sure this is safe or use snprintf/av_strl*' $* +hiegrep '/ *(2|4|8|16|32|64|128|256|512|1024|2048|4096|8192|16384|32768|65536)[^0-9]' 'divide by 2^x could use >> maybe' $* +hiegrep '#(el|)if *(0|1)' 'useless #if' $* +hiegrep 'if *\( *(0|1) *\)' 'useless if()' $* +hiegrep '& *[a-zA-Z0-9_]* *\[ *0 *\]' 'useless & [0]' $* +hiegrep '(\( *[0-9] *(&&|\|\|)|(&&|\|\|) *[0-9] *\))' 'overriding condition' $* +hiegrep '(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *\*( |\*)*(src|source|input|in[^a-z])' 'missing const?' $* +hiegrep '(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *(src|source|input|in)([0-9A-Z_][0-9A-Za-z_]*){1,} *\[' 'missing const (test2)?' $* +hiegrep ' *static *'"$ERE_FUNCS"'[^)]*\);' 'static prototype, maybe you should reorder your functions' $* +hiegrep '@file: *[a-zA-Z0-9_]' 'doxy filetag with filename can in the future cause problems when forgotten during a rename' $* +hiegrep '\bassert' 'Please use av_assert0, av_assert1 or av_assert2' $* + +hiegrep2 '\.long_name *=' 'NULL_IF_CONFIG_SMAL' 'missing NULL_IF_CONFIG_SMAL' $* +hiegrep2 '\.pix_fmts *= *\(' 'const' 'missing const for pix_fmts array' $* +hiegrep2 '\.sample_fmts *= *\(' 'const' 'missing const for sample_fmts array' $* +hiegrep2 '\.supported_framerates *= *\(' 'const' 'missing const for supported_framerates array' $* +hiegrep2 '\.channel_layouts *= *\(' 'const' 'missing const for channel_layouts array' $* + +#$EGREP $OPT '^\+.*const ' $*| $GREP -v 'static'> $TMP && printf '\nnon static const\n' +#cat $TMP + +hiegrep2 "$ERE_TYPES" '(static|av_|ff_|typedef|:\+[^a-zA-Z_])' 'Non static with no ff_/av_ prefix' $* + +hiegrep ':\+[^}#]*else' 'missing } prior to else' $* +hiegrep '(if|while|for)\(' 'missing whitespace between keyword and ( (feel free to ignore)' $* +hiegrep '(else|do){' 'missing whitespace between keyword and { (feel free to ignore)' $* +hiegrep '}(else|while)' 'missing whitespace between } and keyword (feel free to ignore)' $* + +#FIXME this should print the previous statement maybe +hiegrep ':\+ *{ *$' '{ should be on the same line as the related previous statement' $* + + +rm $TMP +for i in $($GREP -H '^+.*@param' $*| sed 's/^\([^:]*\):.*@param\(\[.*\]\|\) *\([a-zA-Z0-9_]*\) .*$/\1:\3/') ; do + doxpar=$(echo $i | sed 's/^.*:\(.*\)$/\1/') + file=$(echo $i | sed 's/^\([^:]*\):.*$/\1/') + $GREP " *$doxpar *[),]" $file | $GREP -v '@param' >/dev/null || $GREP --color=always "@param *$doxpar" $file >>$TMP +done +if test -e $TMP ; then + printf '\nmismatching doxy params\n' + cat $TMP +fi + +$EGREP -B2 $OPT '^(\+|) *('"$ERE_TYPES"'|# *define)' $* | $EGREP -A2 --color=always '(:|-)\+[^/]*/(\*([^*]|$)|/([^/]|$))' > $TMP && printf "\n Non doxy comments\n" +cat $TMP + +rm $TMP +for i in \ + $($EGREP -H '^\+ *'"$ERE_TYPES" $* |\ + $GREP -v '(' | $EGREP -v '\Wgoto\W' |\ + xargs -d '\n' -n 1 |\ + $GREP -o '[* ][* ]*[a-zA-Z][0-9a-zA-Z_]* *[,;=]' |\ + sed 's/.[* ]*\([a-zA-Z][0-9a-zA-Z_]*\) *[,;=]/\1/') \ + ; do + echo $i | $GREP '^NULL$' && continue + $EGREP $i' *(\+|-|\*|/|\||&|%|)=[^=]' $* >/dev/null || echo "possibly never written:"$i >> $TMP + $EGREP '(=|\(|return).*'$i'(==|[^=])*$' $* >/dev/null || echo "possibly never read :"$i >> $TMP + $EGREP -o $i' *((\+|-|\*|/|\||&|%|)=[^=]|\+\+|--) *(0x|)[0-9]*(;|)' $* |\ + $EGREP -v $i' *= *(0x|)[0-9]{1,};'>/dev/null || echo "possibly constant :"$i >> $TMP +done +if test -e $TMP ; then + printf '\npossibly unused variables\n' + cat $TMP +fi + +$GREP '^+++ .*Changelog' $* >/dev/null || printf "\nMissing changelog entry (ignore if minor change)\n" + +cat $* | $GREP -v '^-' | tr '\n' '@' | $EGREP --color=always -o '(fprintf|av_log|printf)\([^)]*\)[+ ;@]*\1' >$TMP && printf "\nMergeable calls\n" +cat $TMP | tr '@' '\n' + +cat $* | tr '\n' '@' | $EGREP --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *[<>]=? *[0-9]* *\) * \1 *= *[0-9]* *;[ @\\+]*else *if *\( *\1 *[<>]=? *[0-9]* *\) *\1 *= *[0-9]* *;' >$TMP && printf "\nav_clip / av_clip_uint8 / av_clip_int16 / ...\n" +cat $TMP | tr '@' '\n' + +cat $* | tr '\n' '@' | $EGREP --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *[<>]=? *([A-Za-z0-9_]*) *\)[ @\\+]*(\1|\2) *= *(\1|\2) *;' >$TMP && printf "\nFFMIN/FFMAX\n" +cat $TMP | tr '@' '\n' + +cat $* | tr '\n' '@' | $EGREP --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *\)[ @\\+]*av_free(p|) *\( *(&|) *\1[^-.]' >$TMP && printf "\nav_free(NULL) is safe\n" +cat $TMP | tr '@' '\n' + +cat $* | tr '\n' '@' | $EGREP --color=always -o '[^a-zA-Z0-9_]([a-zA-Z0-9_]*) *= *av_malloc *\([^)]*\)[ @;\\+]*memset *\( *\1' >$TMP && printf "\nav_mallocz()\n" +cat $TMP | tr '@' '\n' + + +# does not work +#cat $* | tr '\n' '@' | $EGREP -o '[^a-zA-Z_0-9]([a-zA-Z][a-zA-Z_0-9]*) *=[^=].*\1' | $EGREP -o '[^a-zA-Z_0-9]([a-zA-Z][a-zA-Z_0-9]*) *=[^=].*\1 *=[^=]' >$TMP && printf "\nPossibly written 2x before read\n" +#cat $TMP | tr '@' '\n' + +exit + +TODO/idea list: + +for all demuxers & muxers + $EGREP for "avctx->priv_data" + +vertical align = +/* and * align +arrays fitting in smaller types +variables written to twice with no interspaced read +memset(block, 0, 6*64*sizeof(int16_t)); -> clear_blocks +check existence of long_name in AVCodec +check that the patch does not touch codec & (de)muxer layer at the same time ->split + +write a regression test containing at least a line that triggers each warning once diff --git a/LedOK/ffmpeg-mac/bin/pktdumper b/LedOK/ffmpeg-mac/bin/pktdumper new file mode 100755 index 0000000000000000000000000000000000000000..356708c20220d2c4c7987a4fdf27b9220b248fc2 GIT binary patch literal 99944 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 Df5q~u literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/plotframes b/LedOK/ffmpeg-mac/bin/plotframes new file mode 100755 index 0000000..f379723 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/plotframes @@ -0,0 +1,164 @@ +#!/usr/bin/env perl + +# Copyright (c) 2007-2013 Stefano Sabatini +# +# 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 + +=head1 NAME + +plotframes - Plot video frame sizes using ffprobe and gnuplot + +=head1 SYNOPSIS + +plotframes [I] [I] + +=head1 DESCRIPTION + +plotframes reads a multimedia files with ffprobe, and plots the +collected video sizes with gnuplot. + +=head1 OPTIONS + +=over 4 + +=item B<--input|-i> I + +Specify multimedia file to read. This is the file passed to the +ffprobe command. If not specified it is the first argument passed to +the script. + +=item B<--help|--usage|-h|-?> + +Print a brief help message and exit. + +=item B<--manpage|-m> + +Print the man page. + +=item B<--output|-o> I + +Set the name of the output used by gnuplot. If not specified no output +is created. Must be used in conjunction with the B option. + +=item B<--stream|--s> I + +Specify stream. The value must be a string containing a stream +specifier. Default value is "v". + +=item B<--terminal|-t> I + +Set the name of the terminal used by gnuplot. By default it is +"x11". Must be used in conjunction with the B option. Check +the gnuplot manual for the valid values. + +=back + +=cut + +=head1 SEE ALSO + +ffprobe(1), gnuplot(1) + +=cut + +use warnings; +use strict; + +use File::Temp; +use JSON -support_by_pp; +use Getopt::Long; +use Pod::Usage; + +my $input = $ARGV[0]; +my $stream_specifier = "v"; +my $gnuplot_terminal = "x11"; +my $gnuplot_output; + +GetOptions ( + 'input|i=s' => \$input, + 'help|usage|?|h' => sub { pod2usage ( { -verbose => 1, -exitval => 0 }) }, + 'manpage|m' => sub { pod2usage ( { -verbose => 2, -exitval => 0 }) }, + 'stream|s=s' => \$stream_specifier, + 'terminal|t=s' => \$gnuplot_terminal, + 'output|o=s' => \$gnuplot_output, + ) or pod2usage( { -message=> "Parsing error", -verbose => 1, -exitval => 1 }); + +die "You must specify an input file\n" unless $input; + +# fetch data +my @cmd = (qw{ffprobe -show_entries frame -select_streams}, $stream_specifier, "-of", "json", $input); +print STDERR "Executing command: @cmd\n"; +my $json_struct; +{ + open(FH, "-|", @cmd) or die "ffprobe command failed: $!\n"; + local $/; + my $json_text = ; + close FH; + die "ffprobe command failed" if $?; + eval { $json_struct = decode_json($json_text); }; + die "JSON parsing error: $@\n" if $@; +} + +# collect and print frame statistics per pict_type +my %stats; +my $frames = $json_struct->{frames}; +my $frame_count = 0; +foreach my $frame (@{$frames}) { + my $type = $frame->{pict_type}; + $frame->{count} = $frame_count++; + if (not $stats{$type}) { + $stats{$type}->{tmpfile} = File::Temp->new(SUFFIX => '.dat'); + my $fn = $stats{$type}->{tmpfile}->filename; + open($stats{$type}->{fh}, ">", $fn) or die "Can't open $fn"; + } + + print { $stats{$type}->{fh} } + "$frame->{count} ", $frame->{pkt_size} * 8 / 1000, "\n"; +} +foreach (keys %stats) { close $stats{$_}->{fh}; } + +# write gnuplot script +my %type_color_map = ( + "I" => "red", + "P" => "green", + "B" => "blue" + ); + +my $gnuplot_script_tmpfile = File::Temp->new(SUFFIX => '.gnuplot'); +my $fn = $gnuplot_script_tmpfile->filename; +open(FH, ">", $fn) or die "Couldn't open $fn: $!"; +print FH << "EOF"; +set title "video frame sizes" +set xlabel "frame time" +set ylabel "frame size (Kbits)" +set grid +set terminal "$gnuplot_terminal" +EOF + +print FH "set output \"$gnuplot_output\"\n" if $gnuplot_output; +print FH "plot"; +my $sep = ""; +foreach my $type (keys %stats) { + my $fn = $stats{$type}->{tmpfile}->filename; + print FH "$sep\"$fn\" title \"$type frames\" with impulses"; + print FH " linecolor rgb \"$type_color_map{$type}\"" if $type_color_map{$type}; + $sep = ", "; +} +close FH; + +# launch gnuplot with the generated script +system ("gnuplot", "--persist", $gnuplot_script_tmpfile->filename); diff --git a/LedOK/ffmpeg-mac/bin/probetest b/LedOK/ffmpeg-mac/bin/probetest new file mode 100755 index 0000000000000000000000000000000000000000..06c1e25b145c128b73b48f5c6e5ee57f239136d0 GIT binary patch literal 99256 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 N8AGSRl<5gd{VyzOuc80| literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/qt-faststart b/LedOK/ffmpeg-mac/bin/qt-faststart new file mode 100755 index 0000000000000000000000000000000000000000..191e41fb2e24eb8eeefdaadfad9b35ecf6e0ae4b GIT binary patch literal 50384 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/scale_slice_test b/LedOK/ffmpeg-mac/bin/scale_slice_test new file mode 100755 index 0000000000000000000000000000000000000000..55f685dd3afe668e61b1dfc445fb68f2382ccdd3 GIT binary patch literal 133568 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 PM02_&Csn!^o#+1m1vzW) literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/seek_print b/LedOK/ffmpeg-mac/bin/seek_print new file mode 100755 index 0000000000000000000000000000000000000000..b64479cba78d25ad1d0bca63a564d083205e7ba8 GIT binary patch literal 99656 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 a>0igLhs~%v=9~q1ss|T(!Nl#?wEqKOB$oF8 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/sidxindex b/LedOK/ffmpeg-mac/bin/sidxindex new file mode 100755 index 0000000000000000000000000000000000000000..9c3af6fe37c5cef40398b2d3b3e7ab2fd31a484a GIT binary patch literal 100104 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 [] + +directory the directory into which sample files will be downloaded +test to run the number of the issue to test +Note, some test samples may not yet be available to the public, also this +script will not download samples which are already in the directory. So you +may want to preserve its content between runs. +EOF + exit 0 +} + +test -z "$1" && show_help +test ! -d "$1" && echo $1 is not an accessable directory && show_help +test ! -f target_dec_fate.sh && echo $0 Must be run from its location && show_help +grep 'CONFIG_OSSFUZZ 0' ../config.h && echo not configured for ossfuzz && show_help + +#Download testcases +while read -r LINE; do + ISSUE_NUM=`echo $LINE | sed 's#/.*##'` + FILE_ID=`echo $LINE | sed 's#.*/clusterfuzz-testcase[a-zA-Z0-9_-]*-\([0-9]*\).*#\1#'` + FILE=`echo $LINE | sed 's# .*##'` + if test -f "$1/$FILE" ; then + echo exists $FILE + elif echo "$ISSUE_NUM" | grep '#' >/dev/null ; then + echo disabled $FILE + else + echo downloading $FILE + mkdir -p "$1/$ISSUE_NUM" + wget -O "$1/$FILE" "https://oss-fuzz.com/download?testcase_id=$FILE_ID" || rm "$1/$FILE" + fi +done < "$LIST" + +#Find which fuzzers we need to build +TOOLS= +while read -r LINE; do + TOOL_ID=`echo $LINE | sed 's#[^ ]* ##'` + TOOLS="$TOOLS tools/$TOOL_ID" +done < "$LIST" + +cd .. +#Build fuzzers +make -j4 $TOOLS + +#Run testcases +while read -r LINE; do + TOOL_ID=`echo $LINE | sed 's#[^ ]* ##'` + FILE=`echo $LINE | sed 's# .*##'` + if ! test -f "$1/$FILE" ; then + continue + fi + tools/$TOOL_ID $1/$FILE +done < "tools/$LIST" + +echo OK diff --git a/LedOK/ffmpeg-mac/bin/trasher b/LedOK/ffmpeg-mac/bin/trasher new file mode 100755 index 0000000000000000000000000000000000000000..751f784692a69ed3648bc5465759827a33ac9d12 GIT binary patch literal 49824 zcmeI5Uu;uV9LG<$6$%VC)aZy98tf1eVFNS^4(!D?-b#h(hA#5w*sgc1p=+1kTVaVn z6Ijg6SmX^7Ux>aK6VV4_BE-1~#u*-P7!wGXC{budBgAB=57yuB-dlECNPNVY?@4~= z_xqkdzjN;AobK&pXaD;3@0mh)YK0IrWQ}C+dW9Ggeu{)xK&FyO*`YieekJ_kW^S!4 zo=SN~#d*%tKq+QUh9++N$&Up0@M7>WpXYY}IbL zZGSzwkxiy|I^(PJ^*Q;%PCsjRsmM(oQs&aTlj(#^rh7A%t~`$qoqQcm64uo@-1+%j zk6L*`N|z#^*}SRKKHZ@Gor1hosyyE}Ha;u9b5icixQ>ek$p|NfxPc? z`(DkVxPy#K`D}PB|4ndn<$iY=8yDgpcY_npBkw1xCtI1*vnx}{_{zj!DnXjdgJisq z)t5j1^y;5&-@bM7cxQOVg&$T?o1e`7Mw(q)Z^hQxc-GV|qrO{rlVbYTJm;zY`@`$D zk#Qe?M{QyeeTrv#FSMV|LEX^$S8P~8`%1=X5S1lloPT1>=J}|jnHLHOfB*=900@8p z2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900{i&32af#pOlxCmy|6^SEqX5$Ls2WUs?{7>h?dNj;wow zp4=7YP^FCWL%!l(sw3umD-^i(3y_zAU%=tv?^zdtf`(FiBK_c{xDc|p_b zb0^wC3YrBaEYh0N>fh<1Lf zvQ62p>`>%(hU_cEX}mI8L-n=qItsLm7#iDC(|t-E_HLxK>M$MGy7#Ghl;2ZYD;4;4 zDYFsEEKF5}5GwTr_%PUn#^Ba@#HZJVLy^o>EY}m$grbVBXe;SkDqdbu=&0;Ay1V?!VvC zl&{^^3+;AJWtB&$CUHwYUZq!8>9ti_snTkd?x@myIPUd!ROuO{XOht;3i>QDn`{nQ zJ=t6`FWEe@e;el)@(!G(#o2W;?4!32-8pXOpq(QwA8z?r?E}5-F3Fxgt!I};7mP27 Tl-7WOZ1S}jT@1Q)?5y$+^ym|0 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/uncoded_frame b/LedOK/ffmpeg-mac/bin/uncoded_frame new file mode 100755 index 0000000000000000000000000000000000000000..e7ea5aba928e05407676ba133bb6112e6be92bc5 GIT binary patch literal 134408 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 II_>lS09qP#_5c6? literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/zmqsend b/LedOK/ffmpeg-mac/bin/zmqsend new file mode 100755 index 0000000000000000000000000000000000000000..7d7e5449f4b7263e1c130fec256ec4c86b6455ca GIT binary patch literal 116584 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 literal 0 HcmV?d00001 diff --git a/LedOK/ffmpeg-mac/bin/zmqshell.py b/LedOK/ffmpeg-mac/bin/zmqshell.py new file mode 100755 index 0000000..a7d1126 --- /dev/null +++ b/LedOK/ffmpeg-mac/bin/zmqshell.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python2 + +import sys, zmq, cmd + +class LavfiCmd(cmd.Cmd): + prompt = 'lavfi> ' + + def __init__(self, bind_address): + context = zmq.Context() + self.requester = context.socket(zmq.REQ) + self.requester.connect(bind_address) + cmd.Cmd.__init__(self) + + def onecmd(self, cmd): + if cmd == 'EOF': + sys.exit(0) + print 'Sending command:[%s]' % cmd + self.requester.send(cmd) + message = self.requester.recv() + print 'Received reply:[%s]' % message + +try: + bind_address = sys.argv[1] if len(sys.argv) > 1 else "tcp://localhost:5555" + LavfiCmd(bind_address).cmdloop('FFmpeg libavfilter interactive shell') +except KeyboardInterrupt: + pass diff --git a/LedOK/ffmpeg-mac/include/libavcodec/ac3_parser.h b/LedOK/ffmpeg-mac/include/libavcodec/ac3_parser.h new file mode 100644 index 0000000..ff8cc4c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/ac3_parser.h @@ -0,0 +1,36 @@ +/* + * AC-3 parser prototypes + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_AC3_PARSER_H +#define AVCODEC_AC3_PARSER_H + +#include +#include + +/** + * Extract the bitstream ID and the frame size from AC-3 data. + */ +int av_ac3_parse_header(const uint8_t *buf, size_t size, + uint8_t *bitstream_id, uint16_t *frame_size); + + +#endif /* AVCODEC_AC3_PARSER_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/adts_parser.h b/LedOK/ffmpeg-mac/include/libavcodec/adts_parser.h new file mode 100644 index 0000000..f85becd --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/adts_parser.h @@ -0,0 +1,37 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ADTS_PARSER_H +#define AVCODEC_ADTS_PARSER_H + +#include +#include + +#define AV_AAC_ADTS_HEADER_SIZE 7 + +/** + * Extract the number of samples and frames from AAC data. + * @param[in] buf pointer to AAC data buffer + * @param[out] samples Pointer to where number of samples is written + * @param[out] frames Pointer to where number of frames is written + * @return Returns 0 on success, error code on failure. + */ +int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, + uint8_t *frames); + +#endif /* AVCODEC_ADTS_PARSER_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/avcodec.h b/LedOK/ffmpeg-mac/include/libavcodec/avcodec.h new file mode 100644 index 0000000..39881a1 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/avcodec.h @@ -0,0 +1,3192 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#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" +#include "version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "version.h" +#endif + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @defgroup lavc_core Core functions/structures. + * @ingroup libavc + * + * Basic definitions, functions for querying libavcodec capabilities, + * allocating core structures, etc. + * @{ + */ + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +/** + * @ingroup lavc_encoding + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Don't output frames whose parameters differ from first + * decoded frame in stream. + */ +#define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +/** + * 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 + * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability. + */ +#define AV_CODEC_FLAG_RECON_FRAME (1 << 6) +/** + * @par decoding + * Request the decoder to propagate each packets 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. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) +/** + * Generate/parse ICC profiles on encode/decode, as appropriate for the type of + * file. No effect on codecs which cannot contain embedded ICC profiles, or + * when compiled without support for lcms2. + */ +#define AV_CODEC_FLAG2_ICC_PROFILES (1U << 31) + +/* Exported side data. + These flags can be passed in AVCodecContext.export_side_data before initialization. +*/ +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_EXPORT_DATA_MVS (1 << 0) +/** + * Export encoder Producer Reference Time through packet side data + */ +#define AV_CODEC_EXPORT_DATA_PRFT (1 << 1) +/** + * Decoding only. + * Export the AVVideoEncParams structure through frame side data. + */ +#define AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS (1 << 2) +/** + * Decoding only. + * Do not apply film grain, export it instead. + */ +#define AV_CODEC_EXPORT_DATA_FILM_GRAIN (1 << 3) + +/** + * The decoder will keep a reference to the frame and may reuse it later. + */ +#define AV_GET_BUFFER_FLAG_REF (1 << 0) + +/** + * The encoder will keep a reference to the packet and may reuse it later. + */ +#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. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; + enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid problems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * Must be allocated with the av_malloc() family of functions. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: unused. + */ + AVRational time_base; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Codec delay. + * + * Encoding: Number of frames delay there will be from the encoder input to + * the decoder output. (we assume the decoder matches the spec) + * Decoding: Number of frames delay in addition to what a standard decoder + * as specified in the spec would produce. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * For encoding, this field is unused (see initial_padding). + * + * For decoding, this is the number of samples the decoder needs to + * output before the decoder's output is valid. When seeking, you should + * start decoding this many samples prior to your desired seek point. + * + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: MUST be set by user. + * - decoding: May be set by the user before opening the decoder if known e.g. + * from the container. Some decoders will require the dimensions + * to be set by the caller. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: unused + * - decoding: May be set by the user before opening the decoder if known + * e.g. from the container. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int coded_width, coded_height; + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see AV_PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overridden by the decoder if it knows better. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * When multithreading is used, it may be called from multiple threads + * at the same time; threads might draw different parts of the same AVFrame, + * or multiple AVFrames, and there is no guarantee that slices will be drawn + * in order. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], + int y, int type, int height); + + /** + * Callback to negotiate the pixel format. Decoding only, may be set by the + * caller before avcodec_open2(). + * + * Called by some decoders to select the pixel format that will be used for + * the output frames. This is mainly used to set up hardware acceleration, + * then the provided format list contains the corresponding hwaccel pixel + * formats alongside the "software" one. The software pixel format may also + * be retrieved from \ref sw_pix_fmt. + * + * This callback will be called when the coded frame properties (such as + * resolution, pixel format, etc.) change and more than one output format is + * supported for those new properties. If a hardware pixel format is chosen + * and initialization for it fails, the callback may be called again + * immediately. + * + * This callback may be called from different threads if the decoder is + * multi-threaded, but not from more than one thread simultaneously. + * + * @param fmt list of formats which may be used in the current + * configuration, terminated by AV_PIX_FMT_NONE. + * @warning Behavior is undefined if the callback returns a value other + * than one of the formats in fmt or AV_PIX_FMT_NONE. + * @return the chosen format or AV_PIX_FMT_NONE + */ + enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + + /** + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *inter_matrix; + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + 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 + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + +#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. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Number of samples per channel in an audio frame. + * + * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame + * except the last must contain exactly frame_size samples per channel. + * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the + * frame size is not restricted. + * - decoding: may be set by some decoders to indicate constant frame size + */ + int frame_size; + +#if FF_API_AVCTX_FRAME_NUMBER + /** + * 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. + * @deprecated use frame_num instead + */ + attribute_deprecated + int frame_number; +#endif + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + +#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. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * This callback is called at the beginning of each frame to get data + * buffer(s) for it. There may be one contiguous buffer for all the data or + * there may be a buffer per each data plane or anything in between. What + * this means is, you may set however many entries in buf[] you feel necessary. + * Each buffer must be reference-counted using the AVBuffer API (see description + * of buf[] below). + * + * The following fields will be set in the frame before this callback is + * called: + * - format + * - width, height (video only) + * - sample_rate, channel_layout, nb_samples (audio only) + * Their values may differ from the corresponding values in + * AVCodecContext. This callback must use the frame values, not the codec + * context values, to calculate the required buffer size. + * + * This callback must fill the following fields in the frame: + * - data[] + * - linesize[] + * - extended_data: + * * if the data is planar audio with more than 8 channels, then this + * callback must allocate and fill extended_data to contain all pointers + * to all data planes. data[] must hold as many pointers as it can. + * extended_data must be allocated with av_malloc() and will be freed in + * av_frame_unref(). + * * otherwise extended_data must point to data + * - buf[] must contain one or more pointers to AVBufferRef structures. Each of + * the frame's data and extended_data pointers must be contained in these. That + * is, one AVBufferRef for each allocated chunk of memory, not necessarily one + * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * - extended_buf and nb_extended_buf must be allocated with av_malloc() by + * this callback and filled with the extra buffers if there are more + * buffers than buf[] can hold. extended_buf will be freed in + * av_frame_unref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call + * avcodec_default_get_buffer2() instead of providing buffers allocated by + * some other means. + * + * Each data plane must be aligned to the maximum required by the target + * CPU. + * + * @see avcodec_default_get_buffer2() + * + * Video: + * + * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * Some decoders do not support linesizes changing between frames. + * + * If frame multithreading is used, this callback may be called from a + * different thread, but not from more than one at once. Does not need to be + * reentrant. + * + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + * This may only be set to one of the FF_COMPLIANCE_* values in defs.h. + */ + int strict_std_compliance; + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * This is a bitfield of the AV_EF_* values defined in defs.h. + * + * - encoding: Set by user. + * - decoding: Set by user. + */ + int err_recognition; + +#if FF_API_REORDERED_OPAQUE + /** + * 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. + * + * @deprecated Use AV_CODEC_FLAG_COPY_OPAQUE instead + */ + attribute_deprecated + int64_t reordered_opaque; +#endif + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + const struct AVHWAccel *hwaccel; + + /** + * Legacy hardware accelerator context. + * + * For some hardware acceleration methods, the caller may use this field to + * signal hwaccel-specific data to the codec. The struct pointed to by this + * pointer is hwaccel-dependent and defined in the respective header. Please + * refer to the FFmpeg HW accelerator documentation to know how to fill + * this. + * + * In most cases this field is optional - the necessary information may also + * be provided to libavcodec through @ref hw_frames_ctx or @ref + * hw_device_ctx (see avcodec_get_hw_config()). However, in some cases it + * may be the only method of signalling some (optional) information. + * + * The struct and its contents are owned by the caller. + * + * - encoding: May be set by the caller before avcodec_open2(). Must remain + * valid until avcodec_free_context(). + * - decoding: May be set by the caller in the get_format() callback. + * Must remain valid until the next get_format() call, + * or avcodec_free_context() (whichever comes first). + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_XVID 14 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#if FF_API_IDCT_NONE +// formerly used by xvmc +#define FF_IDCT_NONE 24 +#endif +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + + /** + * 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() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * Which multithreading methods to use. + * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, + * so clients which cannot provide future frames should not use it. + * + * - encoding: Set by user, otherwise the default is used. + * - decoding: Set by user, otherwise the default is used. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + +#define FF_PROFILE_VVC_MAIN_10 1 +#define FF_PROFILE_VVC_MAIN_10_444 33 + +#define FF_PROFILE_AV1_MAIN 0 +#define FF_PROFILE_AV1_HIGH 1 +#define FF_PROFILE_AV1_PROFESSIONAL 2 + +#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define FF_PROFILE_SBC_MSBC 1 + +#define FF_PROFILE_PRORES_PROXY 0 +#define FF_PROFILE_PRORES_LT 1 +#define FF_PROFILE_PRORES_STANDARD 2 +#define FF_PROFILE_PRORES_HQ 3 +#define FF_PROFILE_PRORES_4444 4 +#define FF_PROFILE_PRORES_XQ 5 + +#define FF_PROFILE_ARIB_PROFILE_A 0 +#define FF_PROFILE_ARIB_PROFILE_C 1 + +#define FF_PROFILE_KLVA_SYNC 0 +#define FF_PROFILE_KLVA_ASYNC 1 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * Subtitles character encoding mode. Formats or codecs might be adjusting + * this setting (if they are doing the conversion themselves for instance). + * - decoding: set by libavcodec + * - encoding: unused + */ + int sub_charenc_mode; +#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv +#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 + + /** + * Skip processing alpha if supported by codec. + * Note that if the format uses pre-multiplied alpha (common with VP6, + * and recommended due to better video quality/compression) + * the image will look as if alpha-blended onto a black background. + * However for formats that do not use pre-multiplied alpha + * there might be serious artefacts (though e.g. libswscale currently + * assumes pre-multiplied alpha anyway). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 +#define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; + + /* + * Video decoding only. Sets the number of extra hardware frames which + * the decoder will allocate for use by the caller. This must be set + * before avcodec_open2() is called. + * + * Some hardware decoders require all frames that they will use for + * output to be defined in advance before decoding starts. For such + * decoders, the hardware frame pool must therefore be of a fixed size. + * The extra frames set here are on top of any number that the decoder + * needs internally in order to operate normally (for example, frames + * used as reference pictures). + */ + int extra_hw_frames; + + /** + * The percentage of damaged samples to discard a frame. + * + * - decoding: set by user + * - encoding: unused + */ + int discard_damaged_percentage; + + /** + * The number of samples per frame to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + 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. + * + * The following field will be set in the packet before this callback is + * called: + * - size + * This callback must use the above value to calculate the required buffer size, + * which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes. + * + * In some specific cases, the encoder may not use the entire buffer allocated by this + * callback. This will be reflected in the size value in the packet once returned by + * avcodec_receive_packet(). + * + * This callback must fill the following fields in the packet: + * - data: alignment requirements for AVPacket apply, if any. Some architectures and + * encoders may benefit from having aligned data. + * - buf: must contain a pointer to an AVBufferRef structure. The packet's + * data pointer must be contained in it. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_encode_buffer() must call + * avcodec_default_get_encode_buffer() instead of providing a buffer allocated by + * some other means. + * + * The flags field may contain a combination of AV_GET_ENCODE_BUFFER_FLAG_ flags. + * They may be used for example to hint what use the buffer may get after being + * created. + * Implementations of this callback may ignore flags they don't understand. + * If AV_GET_ENCODE_BUFFER_FLAG_REF is set in flags then the packet may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * This callback must be thread-safe, as when frame threading is used, it may + * be called from multiple threads simultaneously. + * + * @see avcodec_default_get_encode_buffer() + * + * - encoding: Set by libavcodec, user can override. + * - decoding: unused + */ + 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. + */ + AVChannelLayout ch_layout; + + /** + * 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. + */ + int64_t frame_num; +} AVCodecContext; + +/** + * @defgroup lavc_hwaccel AVHWAccel + * + * @note Nothing in this structure should be accessed by the user. At some + * point in future it will not be externally visible at all. + * + * @{ + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for parameter data (SPS/PPS/VPS etc). + * + * Useful for hardware decoders which keep persistent state about the + * video parameters, and need to receive any changes to update that state. + * + * @param avctx the codec context + * @param type the nal unit type + * @param buf the nal unit data buffer + * @param buf_size the size of the nal unit in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * @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; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * 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) + +/** + * @} + */ + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * If NULL, then the codec-specific defaults won't be initialized, + * which may result in suboptimal default settings (this is + * important mainly for encoders, e.g. libx264). + * + * @return An AVCodecContext filled with default values or NULL on failure. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +/** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_class(void); + +/** + * Get the AVClass for AVSubtitleRect. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_subtitle_rect_class(void); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @code + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(AV_CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). + */ +int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); + +/** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +/** + * The default callback for AVCodecContext.get_encode_buffer(). It is made public so + * it can be called by custom get_encode_buffer() implementations for encoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_encode_buffer(AVCodecContext *s, AVPacket *pkt, int flags); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[AV_NUM_DATA_POINTERS]); + +#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. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expected to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning subtitles. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The preallocated AVSubtitle in which the decoded subtitle will be stored, + * must be freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, const AVPacket *avpkt); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @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). + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * codec. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @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 + * AV_CODEC_FLAG_RECON_FRAME flag enabled + * @retval AVERROR_INPUT_CHANGED current decoded frame has changed parameters with + * respect to first decoded frame. Applicable when flag + * AV_CODEC_FLAG_DROPCHANGED is set. + * @retval "other negative error code" legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @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); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_packet_unref(avpkt) before doing anything else. + * @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); + +/** + * Create and return a AVHWFramesContext with values adequate for hardware + * decoding. This is meant to get called from the get_format callback, and is + * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. + * This API is for decoding with certain hardware acceleration modes/APIs only. + * + * The returned AVHWFramesContext is not initialized. The caller must do this + * with av_hwframe_ctx_init(). + * + * Calling this function is not a requirement, but makes it simpler to avoid + * codec or hardware API specific details when manually allocating frames. + * + * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, + * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes + * it unnecessary to call this function or having to care about + * AVHWFramesContext initialization at all. + * + * There are a number of requirements for calling this function: + * + * - It must be called from get_format with the same avctx parameter that was + * passed to get_format. Calling it outside of get_format is not allowed, and + * can trigger undefined behavior. + * - The function is not always supported (see description of return values). + * Even if this function returns successfully, hwaccel initialization could + * fail later. (The degree to which implementations check whether the stream + * is actually supported varies. Some do this check only after the user's + * get_format callback returns.) + * - The hw_pix_fmt must be one of the choices suggested by get_format. If the + * user decides to use a AVHWFramesContext prepared with this API function, + * the user must return the same hw_pix_fmt from get_format. + * - The device_ref passed to this function must support the given hw_pix_fmt. + * - After calling this API function, it is the user's responsibility to + * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), + * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done + * before returning from get_format (this is implied by the normal + * AVCodecContext.hw_frames_ctx API rules). + * - The AVHWFramesContext parameters may change every time time get_format is + * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So + * you are inherently required to go through this process again on every + * get_format call. + * - It is perfectly possible to call this function without actually using + * the resulting AVHWFramesContext. One use-case might be trying to reuse a + * previously initialized AVHWFramesContext, and calling this API function + * only to test whether the required frame parameters have changed. + * - Fields that use dynamically allocated values of any kind must not be set + * by the user unless setting them is explicitly allowed by the documentation. + * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, + * the new free callback must call the potentially set previous free callback. + * This API call may set any dynamically allocated fields, including the free + * callback. + * + * The function will set at least the following fields on AVHWFramesContext + * (potentially more, depending on hwaccel API): + * + * - All fields set by av_hwframe_ctx_alloc(). + * - Set the format field to hw_pix_fmt. + * - Set the sw_format field to the most suited and most versatile format. (An + * implication is that this will prefer generic formats over opaque formats + * with arbitrary restrictions, if possible.) + * - Set the width/height fields to the coded frame size, rounded up to the + * API-specific minimum alignment. + * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size + * field to the number of maximum reference surfaces possible with the codec, + * plus 1 surface for the user to work (meaning the user can safely reference + * at most 1 decoded surface at a time), plus additional buffering introduced + * by frame threading. If the hwaccel does not require pre-allocation, the + * field is left to 0, and the decoder will allocate new surfaces on demand + * during decoding. + * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying + * hardware API. + * + * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but + * with basic frame parameters set. + * + * The function is stateless, and does not change the AVCodecContext or the + * device_ref AVHWDeviceContext. + * + * @param avctx The context which is currently calling get_format, and which + * implicitly contains all state needed for filling the returned + * AVHWFramesContext properly. + * @param device_ref A reference to the AVHWDeviceContext describing the device + * which will be used by the hardware decoder. + * @param hw_pix_fmt The hwaccel format you are going to return from get_format. + * @param out_frames_ref On success, set to a reference to an _uninitialized_ + * AVHWFramesContext, created from the given device_ref. + * Fields will be set to values required for decoding. + * Not changed if an error is returned. + * @return zero on success, a negative value on error. The following error codes + * have special semantics: + * AVERROR(ENOENT): the decoder does not support this functionality. Setup + * is always manual, or it is a decoder which does not + * support setting AVCodecContext.hw_frames_ctx at all, + * or it is a software format. + * AVERROR(EINVAL): it is known that hardware decoding is not supported for + * this configuration, or the device_ref is not supported + * for the hwaccel referenced by hw_pix_fmt. + */ +int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, + AVBufferRef *device_ref, + enum AVPixelFormat hw_pix_fmt, + AVBufferRef **out_frames_ref); + + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + AV_PICTURE_STRUCTURE_UNKNOWN, ///< unknown + AV_PICTURE_STRUCTURE_TOP_FIELD, ///< coded as top field + AV_PICTURE_STRUCTURE_BOTTOM_FIELD, ///< coded as bottom field + AV_PICTURE_STRUCTURE_FRAME, ///< coded as frame +}; + +typedef struct AVCodecParserContext { + void *priv_data; + const struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames + * will be used. + */ + int key_frame; + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * Indicate whether a picture is coded as a frame, top field or bottom field. + * + * For example, H.264 field_pic_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag + * equal to 1 and bottom_field_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_TOP_FIELD. + */ + enum AVPictureStructure picture_structure; + + /** + * Picture number incremented in presentation or output order. + * This field may be reinitialized at the first picture of a new sequence. + * + * For example, this corresponds to H.264 PicOrderCnt. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[7]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); +} AVCodecParser; + +/** + * Iterate over all registered codec parsers. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec parser or NULL when the iteration is + * finished + */ +const AVCodecParser *av_parser_iterate(void **opaque); + +AVCodecParserContext *av_parser_init(int codec_id); + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +void av_parser_close(AVCodecParserContext *s); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_list parameter. + * + * + * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, + enum AVPixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Fill AVFrame audio data and linesize pointers. + * + * The buffer buf must be a preallocated buffer with a size big enough + * to contain the specified samples amount. The filled AVFrame data + * pointers will point to this buffer. + * + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment (0 = default) + * @return >=0 on success, negative error code on failure + * @todo return the size in bytes required to store the samples in + * case of success, at the next libavutil bump + */ +int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, + enum AVSampleFormat sample_fmt, const uint8_t *buf, + int buf_size, int align); + +/** + * Reset the internal codec state / flush internal buffers. Should be called + * e.g. when seeking or when switching to a different stream. + * + * @note for decoders, this function just releases any references the decoder + * might keep internally, but the caller's references remain valid. + * + * @note for encoders, this function will only do something if the encoder + * declares support for AV_CODEC_CAP_ENCODER_FLUSH. When called, the encoder + * will drain any remaining packets, and can then be re-used for a different + * stream (as opposed to sending a null frame which will leave the encoder + * in a permanent EOF state after draining). This can be desirable if the + * cost of tearing down and replacing the encoder instance is high. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +/** + * Return audio frame duration. + * + * @param avctx codec context + * @param frame_bytes size of the frame, or 0 if unknown + * @return frame duration, in samples, if known. 0 if not able to + * determine. + */ +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. + */ +void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Same behaviour av_fast_padded_malloc except that buffer will always + * be 0-initialized after call. + */ +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + */ +int avcodec_is_open(AVCodecContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/avdct.h b/LedOK/ffmpeg-mac/include/libavcodec/avdct.h new file mode 100644 index 0000000..6411fab --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/avdct.h @@ -0,0 +1,88 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; + + void (*get_pixels_unaligned)(int16_t *block /* align 16 */, + const uint8_t *pixels, + ptrdiff_t line_size); +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/avfft.h b/LedOK/ffmpeg-mac/include/libavcodec/avfft.h new file mode 100644 index 0000000..0c0f9b8 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/bsf.h b/LedOK/ffmpeg-mac/include/libavcodec/bsf.h new file mode 100644 index 0000000..a09c69f --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/bsf.h @@ -0,0 +1,332 @@ +/* + * Bitstream filters public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_BSF_H +#define AVCODEC_BSF_H + +#include "libavutil/dict.h" +#include "libavutil/log.h" +#include "libavutil/rational.h" + +#include "codec_id.h" +#include "codec_par.h" +#include "packet.h" + +/** + * @defgroup lavc_bsf Bitstream filters + * @ingroup libavc + * + * Bitstream filters transform encoded media data without decoding it. This + * allows e.g. manipulating various header values. Bitstream filters operate on + * @ref AVPacket "AVPackets". + * + * The bitstream filtering API is centered around two structures: + * AVBitStreamFilter and AVBSFContext. The former represents a bitstream filter + * in abstract, the latter a specific filtering process. Obtain an + * AVBitStreamFilter using av_bsf_get_by_name() or av_bsf_iterate(), then pass + * it to av_bsf_alloc() to create an AVBSFContext. Fill in the user-settable + * AVBSFContext fields, as described in its documentation, then call + * av_bsf_init() to prepare the filter context for use. + * + * Submit packets for filtering using av_bsf_send_packet(), obtain filtered + * results with av_bsf_receive_packet(). When no more input packets will be + * sent, submit a NULL AVPacket to signal the end of the stream to the filter. + * av_bsf_receive_packet() will then return trailing packets, if any are + * produced by the filter. + * + * Finally, free the filter context with av_bsf_free(). + * @{ + */ + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; +} AVBitStreamFilter; + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_iterate(void **opaque); + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param[out] ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + * + * @param ctx a AVBSFContext previously allocated with av_bsf_alloc() + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param ctx an initialized AVBSFContext + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * If pkt is empty (i.e. NULL, or pkt->data is NULL and pkt->side_data_elems zero), + * it signals the end of the stream (i.e. no more non-empty packets will be sent; + * sending more empty packets does nothing) and will cause the filter to output + * any packets it may have buffered internally. + * + * @return + * - 0 on success. + * - AVERROR(EAGAIN) if packets need to be retrieved from the filter (using + * av_bsf_receive_packet()) before new input can be consumed. + * - Another negative AVERROR value if an error occurs. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param ctx an initialized AVBSFContext + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return + * - 0 on success. + * - AVERROR(EAGAIN) if more packets need to be sent to the filter (using + * av_bsf_send_packet()) to get more output. + * - AVERROR_EOF if there will be no further output from the filter. + * - Another negative AVERROR value if an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Reset the internal bitstream filter state. Should be called e.g. when seeking. + */ +void av_bsf_flush(AVBSFContext *ctx); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/** + * @} + */ + +#endif // AVCODEC_BSF_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/codec.h b/LedOK/ffmpeg-mac/include/libavcodec/codec.h new file mode 100644 index 0000000..3b1995b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/codec.h @@ -0,0 +1,375 @@ +/* + * AVCodec public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_CODEC_H +#define AVCODEC_CODEC_H + +#include + +#include "libavutil/avutil.h" +#include "libavutil/hwcontext.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "libavutil/samplefmt.h" + +#include "libavcodec/codec_id.h" +#include "libavcodec/version_major.h" + +/** + * @addtogroup lavc_core + * @{ + */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * Codec uses get_buffer() or get_encode_buffer() for allocating buffers and + * supports custom allocators. + * If not set, it might not use get_buffer() or get_encode_buffer() at all, or + * use operations that assume the buffer was allocated by + * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports multithreading through a method other than slice- or + * frame-level multithreading. Typically this marks wrappers around + * multithreading-capable external libraries. + */ +#define AV_CODEC_CAP_OTHER_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) + +/** + * Codec is backed by a hardware implementation. Typically used to + * identify a non-hwaccel hardware decoder. For information about hwaccels, use + * avcodec_get_hw_config() instead. + */ +#define AV_CODEC_CAP_HARDWARE (1 << 18) + +/** + * Codec is potentially backed by a hardware implementation, but not + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the + * implementation provides some sort of internal fallback. + */ +#define AV_CODEC_CAP_HYBRID (1 << 19) + +/** + * This 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) + +/** + * This encoder can be flushed using avcodec_flush_buffers(). If this flag is + * not set, the encoder must be closed and reopened to ensure that no frames + * remain pending. + */ +#define AV_CODEC_CAP_ENCODER_FLUSH (1 << 21) + +/** + * The encoder is able to output reconstructed frame data, i.e. raw frames that + * would be produced by decoding the encoded bitstream. + * + * Reconstructed frame output is enabled by the AV_CODEC_FLAG_RECON_FRAME flag. + */ +#define AV_CODEC_CAP_ENCODER_RECON_FRAME (1 << 22) + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 +#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} + + /** + * Group name of the codec implementation. + * This is a short symbolic name of the wrapper backing this codec. A + * wrapper uses some kind of external implementation for the codec, such + * as an external library, or a codec implementation provided by the OS or + * the hardware. + * If this field is NULL, this is a builtin, libavcodec native codec. + * If non-NULL, this will be the suffix in AVCodec.name in most cases + * (usually AVCodec.name will be of the form "_"). + */ + const char *wrapper_name; + + /** + * Array of supported channel layouts, terminated with a zeroed layout. + */ + const AVChannelLayout *ch_layouts; +} AVCodec; + +/** + * Iterate over all registered codecs. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec or NULL when the iteration is + * finished + */ +const AVCodec *av_codec_iterate(void **opaque); + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id AVCodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +const AVCodec *avcodec_find_decoder(enum AVCodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +const AVCodec *avcodec_find_decoder_by_name(const char *name); + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id AVCodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +const AVCodec *avcodec_find_encoder(enum AVCodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +const AVCodec *avcodec_find_encoder_by_name(const char *name); +/** + * @return a non-zero number if codec is an encoder, zero otherwise + */ +int av_codec_is_encoder(const AVCodec *codec); + +/** + * @return a non-zero number if codec is a decoder, zero otherwise + */ +int av_codec_is_decoder(const AVCodec *codec); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +enum { + /** + * The codec supports this format via the hw_device_ctx interface. + * + * When selecting this format, AVCodecContext.hw_device_ctx should + * have been set to a device of the specified type before calling + * avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, + /** + * The codec supports this format via the hw_frames_ctx interface. + * + * When selecting this format for a decoder, + * AVCodecContext.hw_frames_ctx should be set to a suitable frames + * context inside the get_format() callback. The frames context + * must have been created on a device of the specified type. + * + * When selecting this format for an encoder, + * AVCodecContext.hw_frames_ctx should be set to the context which + * will be used for the input frames before calling avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, + /** + * The codec supports this format by some internal method. + * + * This format can be selected without any additional configuration - + * no device or frames context is required. + */ + AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, + /** + * The codec supports this format by some ad-hoc method. + * + * Additional settings and/or function calls are required. See the + * codec-specific documentation for details. (Methods requiring + * this sort of configuration are deprecated and others should be + * used in preference.) + */ + AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, +}; + +typedef struct AVCodecHWConfig { + /** + * For decoders, a hardware pixel format which that decoder may be + * able to decode to if suitable hardware is available. + * + * For encoders, a pixel format which the encoder may be able to + * accept. If set to AV_PIX_FMT_NONE, this applies to all pixel + * formats supported by the codec. + */ + enum AVPixelFormat pix_fmt; + /** + * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible + * setup methods which can be used with this configuration. + */ + int methods; + /** + * The device type associated with the configuration. + * + * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and + * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. + */ + enum AVHWDeviceType device_type; +} AVCodecHWConfig; + +/** + * Retrieve supported hardware configurations for a codec. + * + * Values of index from zero to some maximum return the indexed configuration + * descriptor; all other values return NULL. If the codec does not support + * any hardware configurations then it will always return NULL. + */ +const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); + +/** + * @} + */ + +#endif /* AVCODEC_CODEC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/codec_desc.h b/LedOK/ffmpeg-mac/include/libavcodec/codec_desc.h new file mode 100644 index 0000000..126b52d --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/codec_desc.h @@ -0,0 +1,128 @@ +/* + * Codec descriptors public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_CODEC_DESC_H +#define AVCODEC_CODEC_DESC_H + +#include "libavutil/avutil.h" + +#include "codec_id.h" + +/** + * @addtogroup lavc_core + * @{ + */ + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * Name of the codec described by this descriptor. It is non-empty and + * unique for each codec descriptor. It should contain alphanumeric + * characters and '_' only. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio codecs only. + */ +#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) +/** + * Codec supports lossy compression. Audio and video codecs only. + * @note a codec may support both lossy and lossless + * compression modes + */ +#define AV_CODEC_PROP_LOSSY (1 << 1) +/** + * Codec supports lossless compression. Audio and video codecs only. + */ +#define AV_CODEC_PROP_LOSSLESS (1 << 2) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * Subtitle codec is bitmap based + * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. + */ +#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) +/** + * Subtitle codec is text based. + * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. + */ +#define AV_CODEC_PROP_TEXT_SUB (1 << 17) + +/** + * @return descriptor for given codec ID or NULL if no descriptor exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); + +/** + * Iterate over all codec descriptors known to libavcodec. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); + +/** + * @return codec descriptor with the given name or NULL if no such descriptor + * exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); + +/** + * @} + */ + +#endif // AVCODEC_CODEC_DESC_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/codec_id.h b/LedOK/ffmpeg-mac/include/libavcodec/codec_id.h new file mode 100644 index 0000000..89a4a0c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/codec_id.h @@ -0,0 +1,661 @@ +/* + * Codec IDs + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_CODEC_ID_H +#define AVCODEC_CODEC_ID_H + +#include "libavutil/avutil.h" +#include "libavutil/samplefmt.h" + +#include "version_major.h" + +/** + * @addtogroup lavc_core + * @{ + */ + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding + AV_CODEC_ID_H261, + AV_CODEC_ID_H263, + AV_CODEC_ID_RV10, + AV_CODEC_ID_RV20, + AV_CODEC_ID_MJPEG, + AV_CODEC_ID_MJPEGB, + AV_CODEC_ID_LJPEG, + AV_CODEC_ID_SP5X, + AV_CODEC_ID_JPEGLS, + AV_CODEC_ID_MPEG4, + AV_CODEC_ID_RAWVIDEO, + AV_CODEC_ID_MSMPEG4V1, + AV_CODEC_ID_MSMPEG4V2, + AV_CODEC_ID_MSMPEG4V3, + AV_CODEC_ID_WMV1, + AV_CODEC_ID_WMV2, + AV_CODEC_ID_H263P, + AV_CODEC_ID_H263I, + AV_CODEC_ID_FLV1, + AV_CODEC_ID_SVQ1, + AV_CODEC_ID_SVQ3, + AV_CODEC_ID_DVVIDEO, + AV_CODEC_ID_HUFFYUV, + AV_CODEC_ID_CYUV, + AV_CODEC_ID_H264, + AV_CODEC_ID_INDEO3, + AV_CODEC_ID_VP3, + AV_CODEC_ID_THEORA, + AV_CODEC_ID_ASV1, + AV_CODEC_ID_ASV2, + AV_CODEC_ID_FFV1, + AV_CODEC_ID_4XM, + AV_CODEC_ID_VCR1, + AV_CODEC_ID_CLJR, + AV_CODEC_ID_MDEC, + AV_CODEC_ID_ROQ, + AV_CODEC_ID_INTERPLAY_VIDEO, + AV_CODEC_ID_XAN_WC3, + AV_CODEC_ID_XAN_WC4, + AV_CODEC_ID_RPZA, + AV_CODEC_ID_CINEPAK, + AV_CODEC_ID_WS_VQA, + AV_CODEC_ID_MSRLE, + AV_CODEC_ID_MSVIDEO1, + AV_CODEC_ID_IDCIN, + AV_CODEC_ID_8BPS, + AV_CODEC_ID_SMC, + AV_CODEC_ID_FLIC, + AV_CODEC_ID_TRUEMOTION1, + AV_CODEC_ID_VMDVIDEO, + AV_CODEC_ID_MSZH, + AV_CODEC_ID_ZLIB, + AV_CODEC_ID_QTRLE, + AV_CODEC_ID_TSCC, + AV_CODEC_ID_ULTI, + AV_CODEC_ID_QDRAW, + AV_CODEC_ID_VIXL, + AV_CODEC_ID_QPEG, + AV_CODEC_ID_PNG, + AV_CODEC_ID_PPM, + AV_CODEC_ID_PBM, + AV_CODEC_ID_PGM, + AV_CODEC_ID_PGMYUV, + AV_CODEC_ID_PAM, + AV_CODEC_ID_FFVHUFF, + AV_CODEC_ID_RV30, + AV_CODEC_ID_RV40, + AV_CODEC_ID_VC1, + AV_CODEC_ID_WMV3, + AV_CODEC_ID_LOCO, + AV_CODEC_ID_WNV1, + AV_CODEC_ID_AASC, + AV_CODEC_ID_INDEO2, + AV_CODEC_ID_FRAPS, + AV_CODEC_ID_TRUEMOTION2, + AV_CODEC_ID_BMP, + AV_CODEC_ID_CSCD, + AV_CODEC_ID_MMVIDEO, + AV_CODEC_ID_ZMBV, + AV_CODEC_ID_AVS, + AV_CODEC_ID_SMACKVIDEO, + AV_CODEC_ID_NUV, + AV_CODEC_ID_KMVC, + AV_CODEC_ID_FLASHSV, + AV_CODEC_ID_CAVS, + AV_CODEC_ID_JPEG2000, + AV_CODEC_ID_VMNC, + AV_CODEC_ID_VP5, + AV_CODEC_ID_VP6, + AV_CODEC_ID_VP6F, + AV_CODEC_ID_TARGA, + AV_CODEC_ID_DSICINVIDEO, + AV_CODEC_ID_TIERTEXSEQVIDEO, + AV_CODEC_ID_TIFF, + AV_CODEC_ID_GIF, + AV_CODEC_ID_DXA, + AV_CODEC_ID_DNXHD, + AV_CODEC_ID_THP, + AV_CODEC_ID_SGI, + AV_CODEC_ID_C93, + AV_CODEC_ID_BETHSOFTVID, + AV_CODEC_ID_PTX, + AV_CODEC_ID_TXD, + AV_CODEC_ID_VP6A, + AV_CODEC_ID_AMV, + AV_CODEC_ID_VB, + AV_CODEC_ID_PCX, + AV_CODEC_ID_SUNRAST, + AV_CODEC_ID_INDEO4, + AV_CODEC_ID_INDEO5, + AV_CODEC_ID_MIMIC, + AV_CODEC_ID_RL2, + AV_CODEC_ID_ESCAPE124, + AV_CODEC_ID_DIRAC, + AV_CODEC_ID_BFI, + AV_CODEC_ID_CMV, + AV_CODEC_ID_MOTIONPIXELS, + AV_CODEC_ID_TGV, + AV_CODEC_ID_TGQ, + AV_CODEC_ID_TQI, + AV_CODEC_ID_AURA, + AV_CODEC_ID_AURA2, + AV_CODEC_ID_V210X, + AV_CODEC_ID_TMV, + AV_CODEC_ID_V210, + AV_CODEC_ID_DPX, + AV_CODEC_ID_MAD, + AV_CODEC_ID_FRWU, + AV_CODEC_ID_FLASHSV2, + AV_CODEC_ID_CDGRAPHICS, + AV_CODEC_ID_R210, + AV_CODEC_ID_ANM, + AV_CODEC_ID_BINKVIDEO, + AV_CODEC_ID_IFF_ILBM, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + AV_CODEC_ID_KGV1, + AV_CODEC_ID_YOP, + AV_CODEC_ID_VP8, + AV_CODEC_ID_PICTOR, + AV_CODEC_ID_ANSI, + AV_CODEC_ID_A64_MULTI, + AV_CODEC_ID_A64_MULTI5, + AV_CODEC_ID_R10K, + AV_CODEC_ID_MXPEG, + AV_CODEC_ID_LAGARITH, + AV_CODEC_ID_PRORES, + AV_CODEC_ID_JV, + AV_CODEC_ID_DFA, + AV_CODEC_ID_WMV3IMAGE, + AV_CODEC_ID_VC1IMAGE, + AV_CODEC_ID_UTVIDEO, + AV_CODEC_ID_BMV_VIDEO, + AV_CODEC_ID_VBLE, + AV_CODEC_ID_DXTORY, + AV_CODEC_ID_V410, + AV_CODEC_ID_XWD, + AV_CODEC_ID_CDXL, + AV_CODEC_ID_XBM, + AV_CODEC_ID_ZEROCODEC, + AV_CODEC_ID_MSS1, + AV_CODEC_ID_MSA1, + AV_CODEC_ID_TSCC2, + AV_CODEC_ID_MTS2, + AV_CODEC_ID_CLLC, + AV_CODEC_ID_MSS2, + AV_CODEC_ID_VP9, + AV_CODEC_ID_AIC, + AV_CODEC_ID_ESCAPE130, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + AV_CODEC_ID_AVS2, + AV_CODEC_ID_PGX, + AV_CODEC_ID_AVS3, + AV_CODEC_ID_MSP2, + AV_CODEC_ID_VVC, +#define AV_CODEC_ID_H266 AV_CODEC_ID_VVC + AV_CODEC_ID_Y41P, + 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, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + AV_CODEC_ID_IMM4, + AV_CODEC_ID_PROSUMER, + AV_CODEC_ID_MWSC, + AV_CODEC_ID_WCMV, + AV_CODEC_ID_RASC, + AV_CODEC_ID_HYMT, + AV_CODEC_ID_ARBC, + AV_CODEC_ID_AGM, + AV_CODEC_ID_LSCR, + AV_CODEC_ID_VP4, + AV_CODEC_ID_IMM5, + AV_CODEC_ID_MVDV, + AV_CODEC_ID_MVHA, + AV_CODEC_ID_CDTOONS, + AV_CODEC_ID_MV30, + AV_CODEC_ID_NOTCHLC, + AV_CODEC_ID_PFM, + AV_CODEC_ID_MOBICLIP, + AV_CODEC_ID_PHOTOCD, + AV_CODEC_ID_IPU, + AV_CODEC_ID_ARGO, + AV_CODEC_ID_CRI, + AV_CODEC_ID_SIMBIOSIS_IMX, + AV_CODEC_ID_SGA_VIDEO, + AV_CODEC_ID_GEM, + AV_CODEC_ID_VBN, + AV_CODEC_ID_JPEGXL, + AV_CODEC_ID_QOI, + AV_CODEC_ID_PHM, + AV_CODEC_ID_RADIANCE_HDR, + AV_CODEC_ID_WBMP, + AV_CODEC_ID_MEDIA100, + AV_CODEC_ID_VQC, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + AV_CODEC_ID_PCM_S16BE, + AV_CODEC_ID_PCM_U16LE, + AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S8, + AV_CODEC_ID_PCM_U8, + AV_CODEC_ID_PCM_MULAW, + AV_CODEC_ID_PCM_ALAW, + AV_CODEC_ID_PCM_S32LE, + AV_CODEC_ID_PCM_S32BE, + AV_CODEC_ID_PCM_U32LE, + AV_CODEC_ID_PCM_U32BE, + AV_CODEC_ID_PCM_S24LE, + AV_CODEC_ID_PCM_S24BE, + AV_CODEC_ID_PCM_U24LE, + AV_CODEC_ID_PCM_U24BE, + AV_CODEC_ID_PCM_S24DAUD, + AV_CODEC_ID_PCM_ZORK, + AV_CODEC_ID_PCM_S16LE_PLANAR, + AV_CODEC_ID_PCM_DVD, + AV_CODEC_ID_PCM_F32BE, + AV_CODEC_ID_PCM_F32LE, + AV_CODEC_ID_PCM_F64BE, + AV_CODEC_ID_PCM_F64LE, + AV_CODEC_ID_PCM_BLURAY, + AV_CODEC_ID_PCM_LXF, + AV_CODEC_ID_S302M, + AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + AV_CODEC_ID_PCM_S64LE, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + AV_CODEC_ID_PCM_VIDC, + AV_CODEC_ID_PCM_SGA, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + AV_CODEC_ID_ADPCM_IMA_WAV, + AV_CODEC_ID_ADPCM_IMA_DK3, + AV_CODEC_ID_ADPCM_IMA_DK4, + AV_CODEC_ID_ADPCM_IMA_WS, + AV_CODEC_ID_ADPCM_IMA_SMJPEG, + AV_CODEC_ID_ADPCM_MS, + AV_CODEC_ID_ADPCM_4XM, + AV_CODEC_ID_ADPCM_XA, + AV_CODEC_ID_ADPCM_ADX, + AV_CODEC_ID_ADPCM_EA, + AV_CODEC_ID_ADPCM_G726, + AV_CODEC_ID_ADPCM_CT, + AV_CODEC_ID_ADPCM_SWF, + AV_CODEC_ID_ADPCM_YAMAHA, + AV_CODEC_ID_ADPCM_SBPRO_4, + AV_CODEC_ID_ADPCM_SBPRO_3, + AV_CODEC_ID_ADPCM_SBPRO_2, + AV_CODEC_ID_ADPCM_THP, + AV_CODEC_ID_ADPCM_IMA_AMV, + AV_CODEC_ID_ADPCM_EA_R1, + AV_CODEC_ID_ADPCM_EA_R3, + AV_CODEC_ID_ADPCM_EA_R2, + AV_CODEC_ID_ADPCM_IMA_EA_SEAD, + AV_CODEC_ID_ADPCM_IMA_EA_EACS, + AV_CODEC_ID_ADPCM_EA_XAS, + AV_CODEC_ID_ADPCM_EA_MAXIS_XA, + AV_CODEC_ID_ADPCM_IMA_ISS, + AV_CODEC_ID_ADPCM_G722, + AV_CODEC_ID_ADPCM_IMA_APC, + AV_CODEC_ID_ADPCM_VIMA, + AV_CODEC_ID_ADPCM_AFC, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + AV_CODEC_ID_ADPCM_AGM, + AV_CODEC_ID_ADPCM_ARGO, + AV_CODEC_ID_ADPCM_IMA_SSI, + AV_CODEC_ID_ADPCM_ZORK, + AV_CODEC_ID_ADPCM_IMA_APM, + AV_CODEC_ID_ADPCM_IMA_ALP, + AV_CODEC_ID_ADPCM_IMA_MTF, + 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, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + AV_CODEC_ID_SDX2_DPCM, + 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, + AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + AV_CODEC_ID_AAC, + AV_CODEC_ID_AC3, + AV_CODEC_ID_DTS, + AV_CODEC_ID_VORBIS, + AV_CODEC_ID_DVAUDIO, + AV_CODEC_ID_WMAV1, + AV_CODEC_ID_WMAV2, + AV_CODEC_ID_MACE3, + AV_CODEC_ID_MACE6, + AV_CODEC_ID_VMDAUDIO, + AV_CODEC_ID_FLAC, + AV_CODEC_ID_MP3ADU, + AV_CODEC_ID_MP3ON4, + AV_CODEC_ID_SHORTEN, + AV_CODEC_ID_ALAC, + AV_CODEC_ID_WESTWOOD_SND1, + AV_CODEC_ID_GSM, ///< as in Berlin toast format + AV_CODEC_ID_QDM2, + AV_CODEC_ID_COOK, + AV_CODEC_ID_TRUESPEECH, + AV_CODEC_ID_TTA, + AV_CODEC_ID_SMACKAUDIO, + AV_CODEC_ID_QCELP, + AV_CODEC_ID_WAVPACK, + AV_CODEC_ID_DSICINAUDIO, + AV_CODEC_ID_IMC, + AV_CODEC_ID_MUSEPACK7, + AV_CODEC_ID_MLP, + AV_CODEC_ID_GSM_MS, /* as found in WAV */ + AV_CODEC_ID_ATRAC3, + AV_CODEC_ID_APE, + AV_CODEC_ID_NELLYMOSER, + AV_CODEC_ID_MUSEPACK8, + AV_CODEC_ID_SPEEX, + AV_CODEC_ID_WMAVOICE, + AV_CODEC_ID_WMAPRO, + AV_CODEC_ID_WMALOSSLESS, + AV_CODEC_ID_ATRAC3P, + AV_CODEC_ID_EAC3, + AV_CODEC_ID_SIPR, + AV_CODEC_ID_MP1, + AV_CODEC_ID_TWINVQ, + AV_CODEC_ID_TRUEHD, + AV_CODEC_ID_MP4ALS, + AV_CODEC_ID_ATRAC1, + AV_CODEC_ID_BINKAUDIO_RDFT, + AV_CODEC_ID_BINKAUDIO_DCT, + AV_CODEC_ID_AAC_LATM, + AV_CODEC_ID_QDMC, + AV_CODEC_ID_CELT, + AV_CODEC_ID_G723_1, + AV_CODEC_ID_G729, + AV_CODEC_ID_8SVX_EXP, + AV_CODEC_ID_8SVX_FIB, + AV_CODEC_ID_BMV_AUDIO, + AV_CODEC_ID_RALF, + AV_CODEC_ID_IAC, + AV_CODEC_ID_ILBC, + AV_CODEC_ID_OPUS, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + AV_CODEC_ID_CODEC2, + AV_CODEC_ID_FFWAVESYNTH, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + AV_CODEC_ID_APTX, + AV_CODEC_ID_APTX_HD, + AV_CODEC_ID_SBC, + AV_CODEC_ID_ATRAC9, + AV_CODEC_ID_HCOM, + AV_CODEC_ID_ACELP_KELVIN, + AV_CODEC_ID_MPEGH_3D_AUDIO, + AV_CODEC_ID_SIREN, + AV_CODEC_ID_HCA, + AV_CODEC_ID_FASTAUDIO, + AV_CODEC_ID_MSNSIREN, + AV_CODEC_ID_DFPWM, + AV_CODEC_ID_BONK, + AV_CODEC_ID_MISC4, + AV_CODEC_ID_APAC, + AV_CODEC_ID_FTR, + AV_CODEC_ID_WAVARC, + AV_CODEC_ID_RKA, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + AV_CODEC_ID_DVB_SUBTITLE, + AV_CODEC_ID_TEXT, ///< raw UTF-8 text + AV_CODEC_ID_XSUB, + AV_CODEC_ID_SSA, + AV_CODEC_ID_MOV_TEXT, + AV_CODEC_ID_HDMV_PGS_SUBTITLE, + AV_CODEC_ID_DVB_TELETEXT, + AV_CODEC_ID_SRT, + AV_CODEC_ID_MICRODVD, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + AV_CODEC_ID_TTML, + AV_CODEC_ID_ARIB_CAPTION, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_EPG, + AV_CODEC_ID_BINTEXT, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket + /** + * 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, +}; + +/** + * Get the type of the given codec. + */ +enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); + +/** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + */ +const char *avcodec_get_name(enum AVCodecID id); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return codec bits per sample. + * Only return non-zero if the bits per sample is exactly correct, not an + * approximation. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_exact_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + +/** + * Return the PCM codec associated with a sample format. + * @param be endianness, 0 for little, 1 for big, + * -1 (or anything else) for native + * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE + */ +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); + +/** + * @} + */ + +#endif // AVCODEC_CODEC_ID_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/codec_par.h b/LedOK/ffmpeg-mac/include/libavcodec/codec_par.h new file mode 100644 index 0000000..f51d27c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/codec_par.h @@ -0,0 +1,247 @@ +/* + * Codec parameters public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_CODEC_PAR_H +#define AVCODEC_CODEC_PAR_H + +#include + +#include "libavutil/avutil.h" +#include "libavutil/channel_layout.h" +#include "libavutil/rational.h" +#include "libavutil/pixfmt.h" + +#include "codec_id.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. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + +#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 + */ + attribute_deprecated + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + * @deprecated use ch_layout.nb_channels + */ + attribute_deprecated + int channels; +#endif + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; + + /** + * Audio only. The channel layout and number of channels. + */ + AVChannelLayout ch_layout; +} AVCodecParameters; + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +/** + * @} + */ + +#endif // AVCODEC_CODEC_PAR_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/d3d11va.h b/LedOK/ffmpeg-mac/include/libavcodec/d3d11va.h new file mode 100644 index 0000000..6816b6c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/defs.h b/LedOK/ffmpeg-mac/include/libavcodec/defs.h new file mode 100644 index 0000000..fbe3254 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/defs.h @@ -0,0 +1,192 @@ +/* + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DEFS_H +#define AVCODEC_DEFS_H + +/** + * @file + * @ingroup libavc + * Misc types and constants that do not belong anywhere else. + */ + +#include +#include + +/** + * @ingroup lavc_decoding + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 64 + +/** + * Verify checksums embedded in the bitstream (could be of either encoded or + * decoded data, depending on the format) and print an error message on mismatch. + * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the + * decoder/demuxer returning an error. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder/muxer should not do as an error + +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + AV_AUDIO_SERVICE_TYPE_MAIN = 0, + AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, + AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, + AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, + AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, + AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, + AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, + AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, + AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, + AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI +}; + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan { + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +} AVPanScan; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int64_t max_bitrate; + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int64_t min_bitrate; + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int64_t avg_bitrate; + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int64_t buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * This structure supplies correlation between a packet timestamp and a wall clock + * production time. The definition follows the Producer Reference Time ('prft') + * as defined in ISO/IEC 14496-12 + */ +typedef struct AVProducerReferenceTime { + /** + * A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()). + */ + int64_t wallclock; + int flags; +} AVProducerReferenceTime; + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#endif // AVCODEC_DEFS_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/dirac.h b/LedOK/ffmpeg-mac/include/libavcodec/dirac.h new file mode 100644 index 0000000..e6d9d34 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/dv_profile.h b/LedOK/ffmpeg-mac/include/libavcodec/dv_profile.h new file mode 100644 index 0000000..4365f1b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/dv_profile.h @@ -0,0 +1,82 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/dxva2.h b/LedOK/ffmpeg-mac/include/libavcodec/dxva2.h new file mode 100644 index 0000000..22c9399 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/jni.h b/LedOK/ffmpeg-mac/include/libavcodec/jni.h new file mode 100644 index 0000000..dd99e92 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/mediacodec.h b/LedOK/ffmpeg-mac/include/libavcodec/mediacodec.h new file mode 100644 index 0000000..4e9b56a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/mediacodec.h @@ -0,0 +1,103 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +/** + * Release a MediaCodec buffer and render it at the given time to the surface + * that is associated with the decoder. The timestamp must be within one second + * of the current `java/lang/System#nanoTime()` (which is implemented using + * `CLOCK_MONOTONIC` on Android). See the Android MediaCodec documentation + * of [`android/media/MediaCodec#releaseOutputBuffer(int,long)`][0] for more details. + * + * @param buffer the buffer to render + * @param time timestamp in nanoseconds of when to render the buffer + * @return 0 on success, < 0 otherwise + * + * [0]: https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20long) + */ +int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/packet.h b/LedOK/ffmpeg-mac/include/libavcodec/packet.h new file mode 100644 index 0000000..f28e7e7 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/packet.h @@ -0,0 +1,731 @@ +/* + * AVPacket public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_PACKET_H +#define AVCODEC_PACKET_H + +#include +#include + +#include "libavutil/attributes.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/rational.h" +#include "libavutil/version.h" + +#include "libavcodec/version_major.h" + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + AV_PKT_DATA_NEW_EXTRADATA, + + /** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * @code + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + * @endcode + */ + AV_PKT_DATA_PARAM_CHANGE, + + /** + * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of + * structures with info about macroblocks relevant to splitting the + * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). + * That is, it does not necessarily contain info about all macroblocks, + * as long as the distance between macroblocks in the info is smaller + * than the target payload size. + * Each MB info structure is 12 bytes, and is laid out as follows: + * @code + * u32le bit offset from the start of the packet + * u8 current quantizer at the start of the macroblock + * u8 GOB number + * u16le macroblock address within the GOB + * u8 horizontal MV predictor + * u8 vertical MV predictor + * u8 horizontal MV predictor for block number 3 + * u8 vertical MV predictor for block number 3 + * @endcode + */ + AV_PKT_DATA_H263_MB_INFO, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * Recommmends skipping the specified number of samples + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_PKT_DATA_SKIP_SAMPLES, + + /** + * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that + * the packet may contain "dual mono" audio specific to Japanese DTV + * and if it is true, recommends only the selected channel to be used. + * @code + * u8 selected channels (0=main/left, 1=sub/right, 2=both) + * @endcode + */ + AV_PKT_DATA_JP_DUALMONO, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_STRINGS_METADATA, + + /** + * Subtitle event position + * @code + * u32le x1 + * u32le y1 + * u32le x2 + * u32le y2 + * @endcode + */ + AV_PKT_DATA_SUBTITLE_POSITION, + + /** + * Data found in BlockAdditional element of matroska container. There is + * no end marker for the data, so it is required to rely on the side data + * size to recognize the end. 8 byte id (as found in BlockAddId) followed + * by data. + */ + AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + + /** + * The optional first identifier line of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_IDENTIFIER, + + /** + * The optional settings (rendering instructions) that immediately + * follow the timestamp specifier of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_SETTINGS, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID as uint8_t, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * This side data is encryption initialization data. + * The format is not part of ABI, use av_encryption_init_info_* methods to + * access. + */ + AV_PKT_DATA_ENCRYPTION_INIT_INFO, + + /** + * This side data contains encryption info for how to decrypt the packet. + * The format is not part of ABI, use av_encryption_info_* methods to access. + */ + AV_PKT_DATA_ENCRYPTION_INFO, + + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** + * Producer Reference Time data corresponding to the AVProducerReferenceTime struct, + * usually exported by some encoders (on demand through the prft flag set in the + * AVCodecContext export_side_data field). + */ + AV_PKT_DATA_PRFT, + + /** + * ICC profile data consisting of an opaque octet buffer following the + * format described by ISO 15076-1. + */ + AV_PKT_DATA_ICC_PROFILE, + + /** + * DOVI configuration + * ref: + * dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2 + * dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3 + * Tags are stored in struct AVDOVIDecoderConfigurationRecord. + */ + AV_PKT_DATA_DOVI_CONF, + + /** + * Timecode which conforms to SMPTE ST 12-1:2014. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.h. + */ + AV_PKT_DATA_S12M_TIMECODE, + + /** + * HDR10+ dynamic metadata associated with a video frame. The metadata is in + * the form of the AVDynamicHDRPlus struct and contains + * information for color volume transform - application 4 of + * SMPTE 2094-40:2016 standard. + */ + AV_PKT_DATA_DYNAMIC_HDR10_PLUS, + + /** + * The number of side data types. + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + size_t size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * This structure stores compressed data. It is typically exported by demuxers + * and then passed as input to decoders, or received as output from encoders and + * then passed to muxers. + * + * For video, it should typically contain one compressed frame. For audio it may + * contain several compressed frames. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * The semantics of data ownership depends on the buf field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * sizeof(AVPacket) being a part of the public ABI is deprecated. once + * av_init_packet() is removed, new packets will only be able to be allocated + * with av_packet_alloc(), and new fields may be added to the end of the struct + * with a minor bump. + * + * @see av_packet_alloc + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + + /** + * for some private data of the user + */ + void *opaque; + + /** + * 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 packet is unreferenced. av_packet_copy_props() calls create a new + * reference with av_buffer_ref() for the target packet's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * Time base of the packet's timestamps. + * In the future, this field may be set on packets output by encoders or + * demuxers, but its value will be by default ignored on input to decoders + * or muxers. + */ + AVRational time_base; +} AVPacket; + +#if FF_API_INIT_PACKET +attribute_deprecated +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; +#endif + +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + +enum AVSideDataParamChangeFlags { +#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, +}; + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +#if FF_API_INIT_PACKET +/** + * Initialize optional fields of a packet with default values. + * + * Note, this does not touch the data and size members, which have to be + * initialized separately. + * + * @param pkt packet + * + * @see av_packet_alloc + * @see av_packet_unref + * + * @deprecated This function is deprecated. Once it's removed, + sizeof(AVPacket) will not be a part of the ABI anymore. + */ +attribute_deprecated +void av_init_packet(AVPacket *pkt); +#endif + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * and buf fields, all others are left untouched. + * @param data Data allocated by av_malloc() to be used as packet data. If this + * function returns successfully, the data is owned by the underlying AVBuffer. + * The caller may not access the data through other means. + * @param size size of data in bytes, without the padding. I.e. the full buffer + * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); + +/** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + size_t size); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Shrink the already allocated side data buffer + * + * @param pkt packet + * @param type side information type + * @param size new side information size + * @return 0 on success, < 0 on failure + */ +int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + size_t size); + +/** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size If supplied, *size will be set to the size of the side data + * or to zero if the desired side data is not present. + * @return pointer to data if present or NULL otherwise + */ +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. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, size_t size, + AVDictionary **dict); + +/** + * Convenience function to free all the side data stored. + * All the other fields stay untouched. + * + * @param pkt packet + */ +void av_packet_free_side_data(AVPacket *pkt); + +/** + * Setup a new reference to the data described by a given packet + * + * If src is reference-counted, setup dst as a new reference to the + * buffer in src. Otherwise allocate a new buffer in dst and copy the + * data from src into it. + * + * All the other fields are copied from src. + * + * @see av_packet_unref + * + * @param dst Destination packet. Will be completely overwritten. + * @param src Source packet + * + * @return 0 on success, a negative AVERROR on error. On error, dst + * will be blank (as if returned by av_packet_alloc()). + */ +int av_packet_ref(AVPacket *dst, const AVPacket *src); + +/** + * Wipe the packet. + * + * Unreference the buffer referenced by the packet and reset the + * remaining packet fields to their default values. + * + * @param pkt The packet to be unreferenced. + */ +void av_packet_unref(AVPacket *pkt); + +/** + * Move every field in src to dst and reset src. + * + * @see av_packet_unref + * + * @param src Source packet, will be reset + * @param dst Destination packet + */ +void av_packet_move_ref(AVPacket *dst, AVPacket *src); + +/** + * Copy only "properties" fields from src to dst. + * + * Properties for the purpose of this function are all the fields + * beside those related to the packet data (buf, data, size) + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success AVERROR on failure. + */ +int av_packet_copy_props(AVPacket *dst, const AVPacket *src); + +/** + * Ensure the data described by a given packet is reference counted. + * + * @note This function does not ensure that the reference will be writable. + * Use av_packet_make_writable instead for that purpose. + * + * @see av_packet_ref + * @see av_packet_make_writable + * + * @param pkt packet whose data should be made reference counted. + * + * @return 0 on success, a negative AVERROR on error. On failure, the + * packet is unchanged. + */ +int av_packet_make_refcounted(AVPacket *pkt); + +/** + * Create a writable reference for the data described by a given packet, + * avoiding data copy if possible. + * + * @param pkt Packet whose data should be made writable. + * + * @return 0 on success, a negative AVERROR on failure. On failure, the + * packet is unchanged. + */ +int av_packet_make_writable(AVPacket *pkt); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +#endif // AVCODEC_PACKET_H diff --git a/LedOK/ffmpeg-mac/include/libavcodec/qsv.h b/LedOK/ffmpeg-mac/include/libavcodec/qsv.h new file mode 100644 index 0000000..c156b08 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/qsv.h @@ -0,0 +1,109 @@ +/* + * Intel MediaSDK QSV public API + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + * + * The caller must set this field to zero for oneVPL (MFX_VERSION >= 2.0) + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/vdpau.h b/LedOK/ffmpeg-mac/include/libavcodec/vdpau.h new file mode 100644 index 0000000..35c4b10 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/vdpau.h @@ -0,0 +1,157 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +/** @} */ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/version.h b/LedOK/ffmpeg-mac/include/libavcodec/version.h new file mode 100644 index 0000000..43794ea --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/version.h @@ -0,0 +1,45 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBAVCODEC_VERSION_MINOR 3 +#define LIBAVCODEC_VERSION_MICRO 100 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +#endif /* AVCODEC_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/version_major.h b/LedOK/ffmpeg-mac/include/libavcodec/version_major.h new file mode 100644 index 0000000..c2f118b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/version_major.h @@ -0,0 +1,52 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_VERSION_MAJOR_H +#define AVCODEC_VERSION_MAJOR_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#define LIBAVCODEC_VERSION_MAJOR 60 + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_SVTAV1_OPTS (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_AYUV_CODECID (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_VT_OUTPUT_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_VT_HWACCEL_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_AVCTX_FRAME_NUMBER (LIBAVCODEC_VERSION_MAJOR < 61) + +// reminder to remove CrystalHD decoders on next major bump +#define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61) + +#endif /* AVCODEC_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/videotoolbox.h b/LedOK/ffmpeg-mac/include/libavcodec/videotoolbox.h new file mode 100644 index 0000000..ba5eddb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/videotoolbox.h @@ -0,0 +1,150 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +/** + * @defgroup lavc_codec_hwaccel_videotoolbox VideoToolbox Decoder + * @ingroup lavc_codec_hwaccel + * + * Hardware accelerated decoding using VideoToolbox on Apple Platforms + * + * @{ + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +#include "libavutil/attributes.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + */ + 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 + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +#if FF_API_VT_HWACCEL_CONTEXT + +/** + * 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 + * @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead. + */ +attribute_deprecated +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 + * @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead. + */ +attribute_deprecated +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 + * @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead. + */ +attribute_deprecated +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 + * @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead. + */ +attribute_deprecated +void av_videotoolbox_default_free(AVCodecContext *avctx); + +#endif /* FF_API_VT_HWACCEL_CONTEXT */ + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/vorbis_parser.h b/LedOK/ffmpeg-mac/include/libavcodec/vorbis_parser.h new file mode 100644 index 0000000..789932a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/LedOK/ffmpeg-mac/include/libavcodec/xvmc.h b/LedOK/ffmpeg-mac/include/libavcodec/xvmc.h new file mode 100644 index 0000000..52e70c0 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavcodec/xvmc.h @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#pragma message("XvMC is no longer supported; this header is deprecated and will be removed") + +#include + +#include "libavutil/attributes.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavdevice/avdevice.h b/LedOK/ffmpeg-mac/include/libavdevice/avdevice.h new file mode 100644 index 0000000..887fd5e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavdevice/avdevice.h @@ -0,0 +1,397 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "version.h" +#endif + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +const AVInputFormat *av_input_audio_device_next(const AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +const AVInputFormat *av_input_video_device_next(const AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +const AVOutputFormat *av_output_audio_device_next(const AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +const AVOutputFormat *av_output_video_device_next(const AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ + enum AVMediaType *media_types; /**< array indicating what media types(s), if any, a device can provide. If null, cannot provide any */ + int nb_media_types; /**< length of media_types array, 0 if device cannot provide any media types */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param device_list device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(const AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(const AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavdevice/version.h b/LedOK/ffmpeg-mac/include/libavdevice/version.h new file mode 100644 index 0000000..ec6c337 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavdevice/version.h @@ -0,0 +1,45 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBAVDEVICE_VERSION_MINOR 1 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +#endif /* AVDEVICE_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavdevice/version_major.h b/LedOK/ffmpeg-mac/include/libavdevice/version_major.h new file mode 100644 index 0000000..b884fd4 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavdevice/version_major.h @@ -0,0 +1,36 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVDEVICE_VERSION_MAJOR_H +#define AVDEVICE_VERSION_MAJOR_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#define LIBAVDEVICE_VERSION_MAJOR 60 + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavfilter/avfilter.h b/LedOK/ffmpeg-mac/include/libavfilter/avfilter.h new file mode 100644 index 0000000..d0d4584 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavfilter/avfilter.h @@ -0,0 +1,1491 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "libavfilter/version.h" +#endif + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; +typedef struct AVFilterChannelLayouts AVFilterChannelLayouts; + +/** + * Get the name of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return name of the pad_idx'th pad in pads + */ +const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx); + +/** + * Get the type of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return type of the pad_idx'th pad in pads + */ +enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx); + +/** + * The number of the filter inputs is not determined just by AVFilter.inputs. + * The filter might add additional inputs during initialization depending on the + * options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 0) +/** + * The number of the filter outputs is not determined just by AVFilter.outputs. + * The filter might add additional outputs during initialization depending on + * the options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 2) +/** + * The filter is a "metadata" filter - it does not modify the frame data in any + * way. It may only affect the metadata (i.e. those fields copied by + * av_frame_copy_props()). + * + * More precisely, this means: + * - video: the data of any frame output by the filter must be exactly equal to + * some frame that is received on one of its inputs. Furthermore, all frames + * produced on a given output must correspond to frames received on the same + * input and their order must be unchanged. Note that the filter may still + * drop or duplicate the frames. + * - audio: the data produced by the filter on any of its outputs (viewed e.g. + * as an array of interleaved samples) must be exactly equal to the data + * received by the filter on one of its inputs. + */ +#define AVFILTER_FLAG_METADATA_ONLY (1 << 3) +/** + * Some filters support a generic "enable" expression option that can be used + * to enable or disable a filter in the timeline. Filters supporting this + * option have this flag set. When the enable expression is false, the default + * no-op filter_frame() function is called in place of the filter_frame() + * callback defined on each input pad, thus the frame is passed unchanged to + * the next filters. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16) +/** + * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will + * have its filter_frame() callback(s) called as usual even when the enable + * expression is false. The filter will disable filtering within the + * filter_frame() callback(s) itself, for example executing code depending on + * the AVFilterContext->is_disabled value. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * List of static inputs. + * + * NULL if there are no (static) inputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in + * this list. + */ + const AVFilterPad *inputs; + + /** + * List of static outputs. + * + * NULL if there are no (static) outputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in + * this list. + */ + const AVFilterPad *outputs; + + /** + * A class for the private data, used to declare filter private AVOptions. + * This field is NULL for filters that do not declare any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavfilter generic + * code to this class. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * The number of entries in the list of inputs. + */ + uint8_t nb_inputs; + + /** + * The number of entries in the list of outputs. + */ + uint8_t nb_outputs; + + /** + * This field determines the state of the formats union. + * It is an enum FilterFormatsState value. + */ + uint8_t formats_state; + + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * Filter initialization function. + * + * This callback will be called only once during the filter lifetime, after + * all the options have been set, but before links between filters are + * established and format negotiation is done. + * + * Basic filter initialization should be done here. Filters with dynamic + * inputs and/or outputs should create those inputs/outputs here based on + * provided options. No more changes to this filter's inputs/outputs can be + * done after this callback. + * + * This callback must not assume that the filter links exist or frame + * parameters are known. + * + * @ref AVFilter.uninit "uninit" is guaranteed to be called even if + * initialization fails, so this callback does not have to clean up on + * failure. + * + * @return 0 on success, a negative AVERROR on failure + */ + int (*init)(AVFilterContext *ctx); + + /** + * Filter uninitialization function. + * + * Called only once right before the filter is freed. Should deallocate any + * memory held by the filter, release any buffer references, etc. It does + * not need to deallocate the AVFilterContext.priv memory itself. + * + * This callback may be called even if @ref AVFilter.init "init" was not + * called or failed, so it must be prepared to handle such a situation. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * The state of the following union is determined by formats_state. + * See the documentation of enum FilterFormatsState in internal.h. + */ + union { + /** + * Query formats supported by the filter on its inputs and outputs. + * + * This callback is called after the filter is initialized (so the inputs + * and outputs are fixed), shortly before the format negotiation. This + * callback may be called more than once. + * + * This callback must set ::AVFilterLink's + * @ref AVFilterFormatsConfig.formats "outcfg.formats" + * on every input link and + * @ref AVFilterFormatsConfig.formats "incfg.formats" + * on every output link to a list of pixel/sample formats that the filter + * supports on that link. + * For audio links, this filter must also set + * @ref AVFilterFormatsConfig.samplerates "incfg.samplerates" + * / + * @ref AVFilterFormatsConfig.samplerates "outcfg.samplerates" + * and @ref AVFilterFormatsConfig.channel_layouts "incfg.channel_layouts" + * / + * @ref AVFilterFormatsConfig.channel_layouts "outcfg.channel_layouts" + * analogously. + * + * This callback must never be NULL if the union is in this state. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_func)(AVFilterContext *); + /** + * A pointer to an array of admissible pixel formats delimited + * by AV_PIX_FMT_NONE. The generic code will use this list + * to indicate that this filter supports each of these pixel formats, + * provided that all inputs and outputs use the same pixel format. + * + * This list must never be NULL if the union is in this state. + * The type of all inputs and outputs of filters using this must + * be AVMEDIA_TYPE_VIDEO. + */ + const enum AVPixelFormat *pixels_list; + /** + * Analogous to pixels, but delimited by AV_SAMPLE_FMT_NONE + * and restricted to filters that only have AVMEDIA_TYPE_AUDIO + * inputs and outputs. + * + * In addition to that the generic code will mark all inputs + * and all outputs as supporting all sample rates and every + * channel count and channel layout, as long as all inputs + * and outputs use the same sample rate and channel count/layout. + */ + const enum AVSampleFormat *samples_list; + /** + * Equivalent to { pix_fmt, AV_PIX_FMT_NONE } as pixels_list. + */ + enum AVPixelFormat pix_fmt; + /** + * Equivalent to { sample_fmt, AV_SAMPLE_FMT_NONE } as samples_list. + */ + enum AVSampleFormat sample_fmt; + } formats; + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Make the filter instance process a command. + * + * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. + * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be + * time consuming then a filter should treat it like an unsupported command + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ + int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Get the number of elements in an AVFilter's inputs or outputs array. + */ +unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output); + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< filtergraph this filter belongs to + + /** + * Type of multithreading being allowed/used. A combination of + * AVFILTER_THREAD_* flags. + * + * May be set by the caller before initializing the filter to forbid some + * or all kinds of multithreading for this filter. The default is allowing + * everything. + * + * When the filter is initialized, this field is combined using bit AND with + * AVFilterGraph.thread_type to get the final mask used for determining + * allowed threading types. I.e. a threading type needs to be set in both + * to be allowed. + * + * After the filter is initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; + + /** + * Sets the number of extra hardware frames which the filter will + * allocate on its output links for use in following filters or by + * the caller. + * + * Some hardware filters require all frames that they will use for + * output to be defined in advance before filtering starts. For such + * filters, any hardware frame pools used for output must therefore be + * of fixed size. The extra frames set here are on top of any number + * that the filter needs internally in order to operate normally. + * + * This field must be set before the graph containing this filter is + * configured. + */ + int extra_hw_frames; +}; + +/** + * Lists of formats / etc. supported by an end of a link. + * + * This structure is directly part of AVFilterLink, in two copies: + * one for the source filter, one for the destination filter. + + * These lists are used for negotiating the format to actually be used, + * which will be loaded into the format and channel_layout members of + * AVFilterLink, when chosen. + */ +typedef struct AVFilterFormatsConfig { + + /** + * List of supported formats (pixel or sample). + */ + AVFilterFormats *formats; + + /** + * Lists of supported sample rates, only for audio. + */ + AVFilterFormats *samplerates; + + /** + * Lists of supported channel layouts, only for audio. + */ + AVFilterChannelLayouts *channel_layouts; + +} AVFilterFormatsConfig; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ +#if FF_API_OLD_CHANNEL_LAYOUT + /** + * channel layout of current buffer (see libavutil/channel_layout.h) + * @deprecated use ch_layout + */ + attribute_deprecated + uint64_t channel_layout; +#endif + int sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; + + AVChannelLayout ch_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Lists of supported formats / etc. supported by the input filter. + */ + AVFilterFormatsConfig incfg; + + /** + * Lists of supported formats / etc. supported by the output filter. + */ + AVFilterFormatsConfig outcfg; + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input + * of the source filter if it exists. + * + * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. + * Filters should update it if necessary depending on their function. + * Sinks can use it to set a default output frame rate. + * It is similar to the r_frame_rate field in AVStream. + */ + AVRational frame_rate; + + /** + * Minimum number of samples to filter at once. If filter_frame() is + * called with fewer samples, it will accumulate them in fifo. + * This field and the related ones must not be changed after filtering + * has started. + * If 0, all related fields are ignored. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * Number of past samples sent through the link. + */ + int64_t sample_count_in, sample_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) + +/** + * Make the filter instance process a command. + * It is recommended to use avfilter_graph_send_command(). + */ +int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Iterate over all registered filters. + * + * @param opaque a pointer where libavfilter will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered filter or NULL when the iteration is + * finished + */ +const AVFilter *av_filter_iterate(void **opaque); + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +const AVFilter *avfilter_get_by_name(const char *name); + + +/** + * Initialize a filter with the supplied parameters. + * + * @param ctx uninitialized filter context to initialize + * @param args Options to initialize the filter with. This must be a + * ':'-separated list of options in the 'key=value' form. + * May be NULL if the options have been set directly using the + * AVOptions API or there are no options that need to be set. + * @return 0 on success, a negative AVERROR on failure + */ +int avfilter_init_str(AVFilterContext *ctx, const char *args); + +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + +/** + * Free a filter context. This will also remove the filter from its + * filtergraph's list of filters. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * A function pointer passed to the @ref AVFilterGraph.execute callback to be + * executed multiple times, possibly in parallel. + * + * @param ctx the filter context the job belongs to + * @param arg an opaque parameter passed through from @ref + * AVFilterGraph.execute + * @param jobnr the index of the job being executed + * @param nb_jobs the total number of jobs + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); + +/** + * A function executing multiple jobs, possibly in parallel. + * + * @param ctx the filter context to which the jobs belong + * @param func the function to be called multiple times + * @param arg the argument to be passed to func + * @param ret a nb_jobs-sized array to be filled with return values from each + * invocation of func + * @param nb_jobs the number of jobs to execute + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func, + void *arg, int *ret, int nb_jobs); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters + + /** + * Type of multithreading allowed for filters in this graph. A combination + * of AVFILTER_THREAD_* flags. + * + * May be set by the caller at any point, the setting will apply to all + * filters initialized after that. The default is allowing everything. + * + * When a filter in this graph is initialized, this field is combined using + * bit AND with AVFilterContext.thread_type to get the final mask used for + * determining allowed threading types. I.e. a threading type needs to be + * set in both to be allowed. + */ + int thread_type; + + /** + * Maximum number of threads used by filters in this graph. May be set by + * the caller before adding any filters to the filtergraph. Zero (the + * default) means that the number of threads is determined automatically. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * Opaque user data. May be set by the caller to an arbitrary value, e.g. to + * be used from callbacks like @ref AVFilterGraph.execute. + * Libavfilter will not touch this field in any way. + */ + void *opaque; + + /** + * This callback may be set by the caller immediately after allocating the + * graph and before adding any filters to it, to provide a custom + * multithreading implementation. + * + * If set, filters with slice threading capability will call this callback + * to execute multiple jobs in parallel. + * + * If this field is left unset, libavfilter will use its internal + * implementation, which may or may not be multithreaded depending on the + * platform and build options. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions + + /** + * Private fields + * + * The following fields are for internal use only. + * Their type, offset, number and semantic can change without notice. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Create a new filter instance in a filter graph. + * + * @param graph graph in which the new filter will be used + * @param filter the filter to create an instance of + * @param name Name to give to the new instance (will be copied to + * AVFilterContext.name). This may be used by the caller to identify + * different filters, libavfilter itself assigns no semantics to + * this parameter. May be NULL. + * + * @return the context of the newly created filter instance (note that it is + * also retrievable directly through AVFilterGraph.filters or with + * avfilter_graph_get_filter()) on success or NULL on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameter args. opaque is currently ignored. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Enable or disable automatic format conversion inside the graph. + * + * Note that format conversion can still happen inside explicitly inserted + * scale and aresample filters. + * + * @param flags any of the AVFILTER_AUTO_CONVERT_* constants + */ +void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags); + +enum { + AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ + AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */ +}; + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return >= 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), + * where it is used to communicate open (unlinked) inputs and outputs from and + * to the caller. + * This struct specifies, per each not connected pad contained in the graph, the + * filter context and the pad index required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Allocate a single AVFilterInOut entry. + * Must be freed with avfilter_inout_free(). + * @return allocated AVFilterInOut on success, NULL on failure. + */ +AVFilterInOut *avfilter_inout_alloc(void); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * Add a graph described by a string to a graph. + * + * @note The caller must provide the lists of inputs and outputs, + * which therefore must be known before calling the function. + * + * @note The inputs parameter describes inputs of the already existing + * part of the graph; i.e. from the point of view of the newly created + * part, they are outputs. Similarly the outputs parameter describes + * outputs of the already existing filters, which are provided as + * inputs to the parsed filters. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. + * If non-NULL, *inputs is updated to contain the list of open inputs + * after the parsing, should be freed with avfilter_inout_free(). + * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. + * If non-NULL, *outputs is updated to contain the list of open outputs + * after the parsing, should be freed with avfilter_inout_free(). + * @return non negative on success, a negative AVERROR code on error + */ +int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, AVFilterInOut **outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * @param[in] graph the filter graph where to link the parsed graph context + * @param[in] filters string to be parsed + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * parsed graph will be returned here. It is to be freed + * by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * parsed graph will be returned here. It is to be freed by the + * caller using avfilter_inout_free(). + * @return zero on success, a negative AVERROR code on error + * + * @note This function returns the inputs and outputs that are left + * unlinked after parsing the graph and the caller then deals with + * them. + * @note This function makes no reference whatsoever to already + * existing parts of the graph and the inputs parameter will on return + * contain inputs of the newly parsed part of the graph. Analogously + * the outputs parameter will contain outputs of the newly created + * filters. + */ +int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Parameters of a filter's input or output pad. + * + * Created as a child of AVFilterParams by avfilter_graph_segment_parse(). + * Freed in avfilter_graph_segment_free(). + */ +typedef struct AVFilterPadParams { + /** + * An av_malloc()'ed string containing the pad label. + * + * May be av_free()'d and set to NULL by the caller, in which case this pad + * will be treated as unlabeled for linking. + * May also be replaced by another av_malloc()'ed string. + */ + char *label; +} AVFilterPadParams; + +/** + * Parameters describing a filter to be created in a filtergraph. + * + * Created as a child of AVFilterGraphSegment by avfilter_graph_segment_parse(). + * Freed in avfilter_graph_segment_free(). + */ +typedef struct AVFilterParams { + /** + * The filter context. + * + * Created by avfilter_graph_segment_create_filters() based on + * AVFilterParams.filter_name and instance_name. + * + * Callers may also create the filter context manually, then they should + * av_free() filter_name and set it to NULL. Such AVFilterParams instances + * are then skipped by avfilter_graph_segment_create_filters(). + */ + AVFilterContext *filter; + + /** + * Name of the AVFilter to be used. + * + * An av_malloc()'ed string, set by avfilter_graph_segment_parse(). Will be + * passed to avfilter_get_by_name() by + * avfilter_graph_segment_create_filters(). + * + * Callers may av_free() this string and replace it with another one or + * NULL. If the caller creates the filter instance manually, this string + * MUST be set to NULL. + * + * When both AVFilterParams.filter an AVFilterParams.filter_name are NULL, + * this AVFilterParams instance is skipped by avfilter_graph_segment_*() + * functions. + */ + char *filter_name; + /** + * Name to be used for this filter instance. + * + * An av_malloc()'ed string, may be set by avfilter_graph_segment_parse() or + * left NULL. The caller may av_free() this string and replace with another + * one or NULL. + * + * Will be used by avfilter_graph_segment_create_filters() - passed as the + * third argument to avfilter_graph_alloc_filter(), then freed and set to + * NULL. + */ + char *instance_name; + + /** + * Options to be apllied to the filter. + * + * Filled by avfilter_graph_segment_parse(). Afterwards may be freely + * modified by the caller. + * + * Will be applied to the filter by avfilter_graph_segment_apply_opts() + * with an equivalent of av_opt_set_dict2(filter, &opts, AV_OPT_SEARCH_CHILDREN), + * i.e. any unapplied options will be left in this dictionary. + */ + AVDictionary *opts; + + AVFilterPadParams **inputs; + unsigned nb_inputs; + + AVFilterPadParams **outputs; + unsigned nb_outputs; +} AVFilterParams; + +/** + * A filterchain is a list of filter specifications. + * + * Created as a child of AVFilterGraphSegment by avfilter_graph_segment_parse(). + * Freed in avfilter_graph_segment_free(). + */ +typedef struct AVFilterChain { + AVFilterParams **filters; + size_t nb_filters; +} AVFilterChain; + +/** + * A parsed representation of a filtergraph segment. + * + * A filtergraph segment is conceptually a list of filterchains, with some + * supplementary information (e.g. format conversion flags). + * + * Created by avfilter_graph_segment_parse(). Must be freed with + * avfilter_graph_segment_free(). + */ +typedef struct AVFilterGraphSegment { + /** + * The filtergraph this segment is associated with. + * Set by avfilter_graph_segment_parse(). + */ + AVFilterGraph *graph; + + /** + * A list of filter chain contained in this segment. + * Set in avfilter_graph_segment_parse(). + */ + AVFilterChain **chains; + size_t nb_chains; + + /** + * A string containing a colon-separated list of key=value options applied + * to all scale filters in this segment. + * + * May be set by avfilter_graph_segment_parse(). + * The caller may free this string with av_free() and replace it with a + * different av_malloc()'ed string. + */ + char *scale_sws_opts; +} AVFilterGraphSegment; + +/** + * Parse a textual filtergraph description into an intermediate form. + * + * This intermediate representation is intended to be modified by the caller as + * described in the documentation of AVFilterGraphSegment and its children, and + * then applied to the graph either manually or with other + * avfilter_graph_segment_*() functions. See the documentation for + * avfilter_graph_segment_apply() for the canonical way to apply + * AVFilterGraphSegment. + * + * @param graph Filter graph the parsed segment is associated with. Will only be + * used for logging and similar auxiliary purposes. The graph will + * not be actually modified by this function - the parsing results + * are instead stored in seg for further processing. + * @param graph_str a string describing the filtergraph segment + * @param flags reserved for future use, caller must set to 0 for now + * @param seg A pointer to the newly-created AVFilterGraphSegment is written + * here on success. The graph segment is owned by the caller and must + * be freed with avfilter_graph_segment_free() before graph itself is + * freed. + * + * @retval "non-negative number" success + * @retval "negative error code" failure + */ +int avfilter_graph_segment_parse(AVFilterGraph *graph, const char *graph_str, + int flags, AVFilterGraphSegment **seg); + +/** + * Create filters specified in a graph segment. + * + * Walk through the creation-pending AVFilterParams in the segment and create + * new filter instances for them. + * Creation-pending params are those where AVFilterParams.filter_name is + * non-NULL (and hence AVFilterParams.filter is NULL). All other AVFilterParams + * instances are ignored. + * + * For any filter created by this function, the corresponding + * AVFilterParams.filter is set to the newly-created filter context, + * AVFilterParams.filter_name and AVFilterParams.instance_name are freed and set + * to NULL. + * + * @param seg the filtergraph segment to process + * @param flags reserved for future use, caller must set to 0 for now + * + * @retval "non-negative number" Success, all creation-pending filters were + * successfully created + * @retval AVERROR_FILTER_NOT_FOUND some filter's name did not correspond to a + * known filter + * @retval "another negative error code" other failures + * + * @note Calling this function multiple times is safe, as it is idempotent. + */ +int avfilter_graph_segment_create_filters(AVFilterGraphSegment *seg, int flags); + +/** + * Apply parsed options to filter instances in a graph segment. + * + * Walk through all filter instances in the graph segment that have option + * dictionaries associated with them and apply those options with + * av_opt_set_dict2(..., AV_OPT_SEARCH_CHILDREN). AVFilterParams.opts is + * replaced by the dictionary output by av_opt_set_dict2(), which should be + * empty (NULL) if all options were successfully applied. + * + * If any options could not be found, this function will continue processing all + * other filters and finally return AVERROR_OPTION_NOT_FOUND (unless another + * error happens). The calling program may then deal with unapplied options as + * it wishes. + * + * Any creation-pending filters (see avfilter_graph_segment_create_filters()) + * present in the segment will cause this function to fail. AVFilterParams with + * no associated filter context are simply skipped. + * + * @param seg the filtergraph segment to process + * @param flags reserved for future use, caller must set to 0 for now + * + * @retval "non-negative number" Success, all options were successfully applied. + * @retval AVERROR_OPTION_NOT_FOUND some options were not found in a filter + * @retval "another negative error code" other failures + * + * @note Calling this function multiple times is safe, as it is idempotent. + */ +int avfilter_graph_segment_apply_opts(AVFilterGraphSegment *seg, int flags); + +/** + * Initialize all filter instances in a graph segment. + * + * Walk through all filter instances in the graph segment and call + * avfilter_init_dict(..., NULL) on those that have not been initialized yet. + * + * Any creation-pending filters (see avfilter_graph_segment_create_filters()) + * present in the segment will cause this function to fail. AVFilterParams with + * no associated filter context or whose filter context is already initialized, + * are simply skipped. + * + * @param seg the filtergraph segment to process + * @param flags reserved for future use, caller must set to 0 for now + * + * @retval "non-negative number" Success, all filter instances were successfully + * initialized + * @retval "negative error code" failure + * + * @note Calling this function multiple times is safe, as it is idempotent. + */ +int avfilter_graph_segment_init(AVFilterGraphSegment *seg, int flags); + +/** + * Link filters in a graph segment. + * + * Walk through all filter instances in the graph segment and try to link all + * unlinked input and output pads. Any creation-pending filters (see + * avfilter_graph_segment_create_filters()) present in the segment will cause + * this function to fail. Disabled filters and already linked pads are skipped. + * + * Every filter output pad that has a corresponding AVFilterPadParams with a + * non-NULL label is + * - linked to the input with the matching label, if one exists; + * - exported in the outputs linked list otherwise, with the label preserved. + * Unlabeled outputs are + * - linked to the first unlinked unlabeled input in the next non-disabled + * filter in the chain, if one exists + * - exported in the ouputs linked list otherwise, with NULL label + * + * Similarly, unlinked input pads are exported in the inputs linked list. + * + * @param seg the filtergraph segment to process + * @param flags reserved for future use, caller must set to 0 for now + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * filters in this graph segment will be returned here. It + * is to be freed by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * filters in this graph segment will be returned here. It + * is to be freed by the caller using avfilter_inout_free(). + * + * @retval "non-negative number" success + * @retval "negative error code" failure + * + * @note Calling this function multiple times is safe, as it is idempotent. + */ +int avfilter_graph_segment_link(AVFilterGraphSegment *seg, int flags, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Apply all filter/link descriptions from a graph segment to the associated filtergraph. + * + * This functions is currently equivalent to calling the following in sequence: + * - avfilter_graph_segment_create_filters(); + * - avfilter_graph_segment_apply_opts(); + * - avfilter_graph_segment_init(); + * - avfilter_graph_segment_link(); + * failing if any of them fails. This list may be extended in the future. + * + * Since the above functions are idempotent, the caller may call some of them + * manually, then do some custom processing on the filtergraph, then call this + * function to do the rest. + * + * @param seg the filtergraph segment to process + * @param flags reserved for future use, caller must set to 0 for now + * @param[out] inputs passed to avfilter_graph_segment_link() + * @param[out] outputs passed to avfilter_graph_segment_link() + * + * @retval "non-negative number" success + * @retval "negative error code" failure + * + * @note Calling this function multiple times is safe, as it is idempotent. + */ +int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Free the provided AVFilterGraphSegment and everything associated with it. + * + * @param seg double pointer to the AVFilterGraphSegment to be freed. NULL will + * be written to this pointer on exit from this function. + * + * @note + * The filter contexts (AVFilterParams.filter) are owned by AVFilterGraph rather + * than AVFilterGraphSegment, so they are not freed. + */ +void avfilter_graph_segment_free(AVFilterGraphSegment **seg); + +/** + * Send a command to one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ +int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Queue a command for one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param ts time at which the command should be sent to the filter + * + * @note As this executes commands after this function returns, no return code + * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. + */ +int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); + + +/** + * Dump a graph into a human-readable string representation. + * + * @param graph the graph to dump + * @param options formatting options; currently ignored + * @return a string, or NULL in case of memory allocation failure; + * the string must be freed using av_free + */ +char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); + +/** + * Request a frame on the oldest sink link. + * + * If the request returns AVERROR_EOF, try the next. + * + * Note that this function is not meant to be the sole scheduling mechanism + * of a filtergraph, only a convenience function to help drain a filtergraph + * in a balanced way under normal circumstances. + * + * Also note that AVERROR_EOF does not mean that frames did not arrive on + * some of the sinks during the process. + * When there are multiple sink links, in case the requested link + * returns an EOF, this may cause a filter to flush pending frames + * which are sent to another sink link, although unrequested. + * + * @return the return value of ff_request_frame(), + * or AVERROR_EOF if all links returned AVERROR_EOF + */ +int avfilter_graph_request_oldest(AVFilterGraph *graph); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/LedOK/ffmpeg-mac/include/libavfilter/buffersink.h b/LedOK/ffmpeg-mac/include/libavfilter/buffersink.h new file mode 100644 index 0000000..64e08de --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavfilter/buffersink.h @@ -0,0 +1,173 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + * + * The buffersink and abuffersink filters are there to connect filter graphs + * to applications. They have a single input, connected to the graph, and no + * output. Frames must be extracted using av_buffersink_get_frame() or + * av_buffersink_get_samples(). + * + * The format negotiated by the graph during configuration can be obtained + * using the accessor functions: + * - av_buffersink_get_time_base(), + * - av_buffersink_get_format(), + * - av_buffersink_get_frame_rate(), + * - av_buffersink_get_w(), + * - av_buffersink_get_h(), + * - av_buffersink_get_sample_aspect_ratio(), + * - av_buffersink_get_channels(), + * - av_buffersink_get_ch_layout(), + * - av_buffersink_get_sample_rate(). + * + * The layout returned by av_buffersink_get_ch_layout() must de uninitialized + * by the caller. + * + * The format can be constrained by setting options, using av_opt_set() and + * related functions with the AV_OPT_SEARCH_CHILDREN flag. + * - pix_fmts (int list), + * - sample_fmts (int list), + * - sample_rates (int list), + * - ch_layouts (string), + * - channel_counts (int list), + * - all_channel_counts (bool). + * Most of these options are of type binary, and should be set using + * av_opt_set_int_list() or av_opt_set_bin(). If they are not set, all + * corresponding formats are accepted. + * + * As a special case, if ch_layouts is not set, all valid channel layouts are + * accepted except for UNSPEC layouts, unless all_channel_counts is set. + */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a buffersink or abuffersink filter context. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * @param flags a combination of AV_BUFFERSINK_FLAG_* flags + * + * @return >= 0 in for success, a negative AVERROR code for failure. + */ +int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); + +/** + * Tell av_buffersink_get_buffer_ref() to read video/samples buffer + * reference, but not remove it from the buffer. This is useful if you + * need only to read a video/samples buffer, without to fetch it. + */ +#define AV_BUFFERSINK_FLAG_PEEK 1 + +/** + * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. + * If a frame is already buffered, it is read (and removed from the buffer), + * but if no frame is present, return AVERROR(EAGAIN). + */ +#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 + +/** + * Set the frame size for an audio buffer sink. + * + * All calls to av_buffersink_get_buffer_ref will return a buffer with + * exactly the specified number of samples, or AVERROR(EAGAIN) if there is + * not enough. The last buffer at EOF will be padded with 0. + */ +void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +#if FF_API_OLD_CHANNEL_LAYOUT +attribute_deprecated +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +#endif +int av_buffersink_get_ch_layout (const AVFilterContext *ctx, + AVChannelLayout *ch_layout); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * + * @return + * - >= 0 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Same as av_buffersink_get_frame(), but with the ability to specify the number + * of samples read. This function is less efficient than + * av_buffersink_get_frame(), because it copies the data around. + * + * @param ctx pointer to a context of the abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * frame will contain exactly nb_samples audio samples, except at + * the end of stream, when it can contain less than nb_samples. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_frame(). + * + * @warning do not mix this function with av_buffersink_get_frame(). Use only one or + * the other with a single sink, not both. + */ +int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/LedOK/ffmpeg-mac/include/libavfilter/buffersrc.h b/LedOK/ffmpeg-mac/include/libavfilter/buffersrc.h new file mode 100644 index 0000000..3b248b3 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavfilter/buffersrc.h @@ -0,0 +1,218 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Immediately push the frame to the output. + */ + AV_BUFFERSRC_FLAG_PUSH = 4, + + /** + * Keep a reference to the frame. + * If the frame if reference-counted, create a new reference; otherwise + * copy the frame data. + */ + AV_BUFFERSRC_FLAG_KEEP_REF = 8, + +}; + +/** + * Get the number of failed requests. + * + * A failed request is when the request_frame method is called while no + * frame is present in the buffer. + * The number is reset when a frame is added. + */ +unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per second. + */ + int sample_rate; + +#if FF_API_OLD_CHANNEL_LAYOUT + /** + * Audio only, the audio channel layout + * @deprecated use ch_layout + */ + attribute_deprecated + uint64_t channel_layout; +#endif + + /** + * Audio only, the audio channel layout + */ + AVChannelLayout ch_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will make a new reference to it. Otherwise the frame data will be + * copied. + * + * @return 0 on success, a negative AVERROR on error + * + * This function is equivalent to av_buffersrc_add_frame_flags() with the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will take ownership of the reference(s) and reset the frame. + * Otherwise the frame data will be copied. If this function returns an error, + * the input frame is not touched. + * + * @return 0 on success, a negative AVERROR on error. + * + * @note the difference between this function and av_buffersrc_write_frame() is + * that av_buffersrc_write_frame() creates a new reference to the input frame, + * while this function takes ownership of the reference passed to it. + * + * This function is equivalent to av_buffersrc_add_frame_flags() without the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * By default, if the frame is reference-counted, this function will take + * ownership of the reference(s) and reset the frame. This can be controlled + * using the flags. + * + * If this function returns an error, the input frame is not touched. + * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavfilter/version.h b/LedOK/ffmpeg-mac/include/libavfilter/version.h new file mode 100644 index 0000000..7e0eb9a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavfilter/version.h @@ -0,0 +1,48 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBAVFILTER_VERSION_MINOR 3 +#define LIBAVFILTER_VERSION_MICRO 100 + + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +#endif /* AVFILTER_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavfilter/version_major.h b/LedOK/ffmpeg-mac/include/libavfilter/version_major.h new file mode 100644 index 0000000..899dfdb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavfilter/version_major.h @@ -0,0 +1,38 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFILTER_VERSION_MAJOR_H +#define AVFILTER_VERSION_MAJOR_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#define LIBAVFILTER_VERSION_MAJOR 9 + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVFILTER_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavformat/avformat.h b/LedOK/ffmpeg-mac/include/libavformat/avformat.h new file mode 100644 index 0000000..1916aa2 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavformat/avformat.h @@ -0,0 +1,2826 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * input/output formats using the av_demuxer_iterate / av_muxer_iterate() functions. + * The protocols layer is not part of the public API, so you can only get the names + * of supported protocols with the avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libavformat structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @section lavf_options Passing options to (de)muxers + * It is possible to configure lavf muxers and demuxers using the @ref avoptions + * mechanism. Generic (format-independent) libavformat options are provided by + * AVFormatContext, they can be examined from a user program by calling + * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass + * from avformat_get_class()). Private (format-specific) options are provided by + * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / + * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. + * Further options may be provided by the @ref AVFormatContext.pb "I/O context", + * if its AVClass is non-NULL, and the protocols layer. See the discussion on + * nesting in @ref avoptions documentation to learn how to access those. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more encoded frames which belongs to a + * single elementary stream. In the lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file:in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * Since the format of the opened file is in general not known until after + * avformat_open_input() has returned, it is not possible to set demuxer private + * options on a preallocated context. Instead, the options should be passed to + * avformat_open_input() wrapped in an AVDictionary: + * @code + * AVDictionary *options = NULL; + * av_dict_set(&options, "video_size", "640x480", 0); + * av_dict_set(&options, "pixel_format", "rgb24", 0); + * + * if (avformat_open_input(&s, url, NULL, &options) < 0) + * abort(); + * av_dict_free(&options); + * @endcode + * This code passes the private options 'video_size' and 'pixel_format' to the + * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it + * cannot know how to interpret raw video data otherwise. If the format turns + * out to be something different than raw video, those options will not be + * recognized by the demuxer and therefore will not be applied. Such unrecognized + * options are then returned in the options dictionary (recognized options are + * consumed). The calling program can handle such unrecognized options as it + * wishes, e.g. + * @code + * AVDictionaryEntry *e; + * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { + * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); + * abort(); + * } + * @endcode + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * Reading data from an opened AVFormatContext is done by repeatedly calling + * av_read_frame() on it. Each call, if successful, will return an AVPacket + * containing encoded data for one AVStream, identified by + * AVPacket.stream_index. This packet may be passed straight into the libavcodec + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. + * + * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be + * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for + * pts/dts, 0 for duration) if the stream does not provide them. The timing + * information will be in AVStream.time_base units, i.e. it has to be + * multiplied by the timebase to convert them to seconds. + * + * A packet returned by av_read_frame() is always reference-counted, + * i.e. AVPacket.buf is set and the user may keep it indefinitely. + * The packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ + +#include "libavcodec/codec.h" +#include "libavcodec/codec_par.h" +#include "libavcodec/defs.h" +#include "libavcodec/packet.h" + +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "libavformat/version.h" +#endif + +struct AVFormatContext; + +struct AVDeviceInfoList; + +/** + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf + * The metadata API allows libavformat to export metadata tags to a client + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * + * Important concepts to keep in mind: + * - Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * - Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * - Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * - language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * - sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_frame(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} + */ + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param s associated IO context + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param s associated IO context + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +/// Demuxer will use avio_open, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +/** + * The muxer/demuxer is experimental and should be used with caution. + * + * - demuxers: will not be selected automatically by probing, must be specified + * explicitly. + */ +#define AVFMT_EXPERIMENTAL 0x0004 +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative + timestamps. If not set the timestamp + will be shifted in av_write_frame and + av_interleaved_write_frame so they + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ + +#define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< AVClass for the private context +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * 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; +/** + * @} + */ + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_RAW, /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +/** + * The stream should be chosen by default among other streams of the same type, + * unless the user has explicitly specified otherwise. + */ +#define AV_DISPOSITION_DEFAULT (1 << 0) +/** + * The stream is not in original language. + * + * @note AV_DISPOSITION_ORIGINAL is the inverse of this disposition. At most + * one of them should be set in properly tagged streams. + * @note This disposition may apply to any stream type, not just audio. + */ +#define AV_DISPOSITION_DUB (1 << 1) +/** + * The stream is in original language. + * + * @see the notes for AV_DISPOSITION_DUB + */ +#define AV_DISPOSITION_ORIGINAL (1 << 2) +/** + * The stream is a commentary track. + */ +#define AV_DISPOSITION_COMMENT (1 << 3) +/** + * The stream contains song lyrics. + */ +#define AV_DISPOSITION_LYRICS (1 << 4) +/** + * The stream contains karaoke audio. + */ +#define AV_DISPOSITION_KARAOKE (1 << 5) + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED (1 << 6) +/** + * The stream is intended for hearing impaired audiences. + */ +#define AV_DISPOSITION_HEARING_IMPAIRED (1 << 7) +/** + * The stream is intended for visually impaired audiences. + */ +#define AV_DISPOSITION_VISUAL_IMPAIRED (1 << 8) +/** + * The audio stream contains music and sound effects without voice. + */ +#define AV_DISPOSITION_CLEAN_EFFECTS (1 << 9) +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. + */ +#define AV_DISPOSITION_ATTACHED_PIC (1 << 10) +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS (1 << 11) + +/** + * The stream is intended to be mixed with a spatial audio track. For example, + * it could be used for narration or stereo music, and may remain unchanged by + * listener head rotation. + */ +#define AV_DISPOSITION_NON_DIEGETIC (1 << 12) + +/** + * The subtitle stream contains captions, providing a transcription and possibly + * a translation of audio. Typically intended for hearing-impaired audiences. + */ +#define AV_DISPOSITION_CAPTIONS (1 << 16) +/** + * The subtitle stream contains a textual description of the video content. + * Typically intended for visually-impaired audiences or for the cases where the + * video cannot be seen. + */ +#define AV_DISPOSITION_DESCRIPTIONS (1 << 17) +/** + * The subtitle stream contains time-aligned metadata that is not intended to be + * directly presented to the user. + */ +#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. + */ +#define AV_DISPOSITION_DEPENDENT (1 << 19) +/** + * The video stream contains still images. + */ +#define AV_DISPOSITION_STILL_IMAGE (1 << 20) + +/** + * @return The AV_DISPOSITION_* flag corresponding to disp or a negative error + * code if disp does not correspond to a known stream disposition. + */ +int av_disposition_from_string(const char *disp); + +/** + * @param disposition a combination of AV_DISPOSITION_* values + * @return The string description corresponding to the lowest set bit in + * disposition. NULL when the lowest set bit does not correspond + * to a known disposition or when disposition is 0. + */ +const char *av_disposition_to_string(int disposition); + +/** + * Options for behavior on timestamp wrap detection. + */ +#define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap +#define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection +#define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection + +/** + * Stream structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + /** + * A class for @ref avoptions. Set on stream creation. + */ + const AVClass *av_class; + + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; + + /** + * 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; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + /** + * Stream disposition - a combination of AV_DISPOSITION_* flags. + * - demuxing: set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: may be set by the caller before avformat_write_header(). + */ + int disposition; + + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet + * will contain the attached picture. + * + * decoding: set by libavformat, must not be modified by the caller. + * encoding: unused + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags indicating events happening on the stream, a combination of + * AVSTREAM_EVENT_FLAG_*. + * + * - demuxing: may be set by the demuxer in avformat_open_input(), + * avformat_find_stream_info() and av_read_frame(). Flags must be cleared + * by the user once the event has been handled. + * - muxing: may be set by the user after avformat_write_header(). to + * indicate a user-triggered event. The muxer will clear the flags for + * events it has handled in av_[interleaved]_write_frame(). + */ + int event_flags; +/** + * - demuxing: the demuxer read new metadata from the file and updated + * AVStream.metadata accordingly + * - muxing: the user updated AVStream.metadata and wishes the muxer to write + * it into the file + */ +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 +/** + * - demuxing: new packets for this stream were read from the file. This + * event is informational only and does not guarantee that new packets + * for this stream will necessarily be returned from av_read_frame(). + */ +#define AVSTREAM_EVENT_FLAG_NEW_PACKETS (1 << 1) + + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + */ + AVRational r_frame_rate; + + /** + * Number of bits in timestamps. Used for wrapping control. + * + * - demuxing: set by libavformat + * - muxing: set by libavformat + * + */ + 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 + * + * the retuned value is undefined when used with a demuxer. + */ +attribute_deprecated +int64_t av_stream_get_end_pts(const AVStream *st); +#endif + +#define AV_PROGRAM_RUNNING 1 + +/** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + int pmt_version; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ + +typedef struct AVChapter { + int64_t id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + AVFMT_DURATION_FROM_PTS, ///< Duration accurately estimated from PTSes + AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration + AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate) +}; + +/** + * Format I/O context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + const struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + const struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + + /** + * input or output URL. Unlike the old filename field, this field has no + * length restriction. + * + * - demuxing: set by avformat_open_input(), initialized to an empty + * string if url parameter was NULL in avformat_open_input(). + * - muxing: may be set by the caller before calling avformat_write_header() + * (or avformat_init_output() if that is called first) to a string + * which is freeable by av_free(). Set to an empty string if it + * was NULL in avformat_init_output(). + * + * Freed by libavformat in avformat_free_context(). + */ + char *url; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer + + /** + * Maximum number of bytes read from input in order to determine stream + * properties. Used when reading the global header and in + * avformat_find_stream_info(). + * + * Demuxing only, set by the caller before avformat_open_input(). + * + * @note this is \e not used for determining the \ref AVInputFormat + * "input format" + * @sa format_probesize + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags indicating events happening on the file, a combination of + * AVFMT_EVENT_FLAG_*. + * + * - demuxing: may be set by the demuxer in avformat_open_input(), + * avformat_find_stream_info() and av_read_frame(). Flags must be cleared + * by the user once the event has been handled. + * - muxing: may be set by the user after avformat_write_header() to + * indicate a user-triggered event. The muxer will clear the flags for + * events it has handled in av_[interleaved]_write_frame(). + */ + int event_flags; +/** + * - demuxing: the demuxer read new metadata from the file and updated + * AVFormatContext.metadata accordingly + * - muxing: the user updated AVFormatContext.metadata and wishes the muxer to + * write it into the file + */ +#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. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this works better when using av_interleaved_write_frame(). + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_DISABLED 0 ///< Do not shift timestamps even when they are negative. +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * The duration field can be estimated through various ways, and this field can be used + * to know how the duration was estimated. + * - encoding: unused + * - decoding: Read by user + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * format probing score. + * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes + * the format. + * - encoding: unused + * - decoding: set by avformat, read by user + */ + int probe_score; + + /** + * Maximum number of bytes read from input in order to identify the + * \ref AVInputFormat "input format". Only used when the format is not set + * explicitly by the caller. + * + * Demuxing only, set by the caller before avformat_open_input(). + * + * @sa probesize + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * IO repositioned flag. + * This is set by avformat when the underlaying IO context read pointer + * is repositioned, for example when doing byte based seeking. + * Demuxers can use the flag to detect such changes. + */ + int io_repositioned; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + const AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + const AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + const AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + const AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /** + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + +#if FF_API_AVFORMAT_IO_CLOSE + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + * + * @deprecated use io_close2 + */ + attribute_deprecated + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); +#endif + + /** + * ',' 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(). + * + * Using this is preferred over io_close, because this can return an error. + * Therefore this callback is used instead of io_close by the generic + * libavformat code if io_close is NULL or the default. + * + * @param s the format context + * @param pb IO context to be closed and freed + * @return 0 on success, a negative AVERROR code on failure + */ + int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb); +} 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. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * Returns the method used to set ctx->duration. + * + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + */ +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * Return the LIBAVFORMAT_VERSION_INT constant. + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +/** + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. + * + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. + */ +int avformat_network_deinit(void); + +/** + * Iterate over all registered muxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered muxer or NULL when the iteration is + * finished + */ +const AVOutputFormat *av_muxer_iterate(void **opaque); + +/** + * Iterate over all registered demuxers. + * + * @param opaque a pointer where libavformat will store the iteration state. + * Must point to NULL to start the iteration. + * + * @return the next registered demuxer or NULL when the iteration is + * finished + */ +const AVInputFormat *av_demuxer_iterate(void **opaque); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avformat_get_class(void); + +/** + * Get the AVClass for AVStream. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_stream_get_class(void); + +/** + * Add a new stream to a media file. + * + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * User is required to call avformat_free_context() to clean up the allocation + * by avformat_new_stream(). + * + * @param s media file handle + * @param c unused, does nothing + * + * @return newly created stream or NULL on error. + */ +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, size_t size); +/** + * Get side information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size If supplied, *size will be set to the size of the side data + * or to zero if the desired side data is not present. + * + * @return pointer to data if present or NULL otherwise + */ +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, size_t *size); + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. + * + * @param ctx pointee is set to the created format context, + * or to NULL in case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +const AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +const AVInputFormat *av_probe_input_format(const AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +const AVInputFormat *av_probe_input_format2(const AVProbeData *pd, + int is_opened, int *score_max); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + */ +const AVInputFormat *av_probe_input_format3(const AVProbeData *pd, + int is_opened, int *score_ret); + +/** + * Probe a bytestream to determine the input format. Each time a probe returns + * with a score that is too low, the probe buffer size is increased and another + * attempt is made. When the maximum probe size is reached, the input format + * with the highest score is returned. + * + * @param pb the bytestream to probe + * @param fmt the input format is put here + * @param url the url of the stream + * @param logctx the log context + * @param offset the offset within the bytestream to probe from + * @param max_probe_size the maximum probe buffer size (zero for default) + * + * @return the score in case of success, a negative value corresponding to an + * the maximal score is AVPROBE_SCORE_MAX + * AVERROR code otherwise + */ +int av_probe_input_buffer2(AVIOContext *pb, const AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Like av_probe_input_buffer2() but returns 0 on success + */ +int av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with avformat_close_input(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by + * avformat_alloc_context). May be a pointer to NULL, in + * which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed + * on failure. + * @param url URL of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private + * options. + * On return this parameter will be destroyed and replaced with + * a dict containing options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. + */ +int avformat_open_input(AVFormatContext **ps, const char *url, + const AVInputFormat *fmt, AVDictionary **options); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. + * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); + +/** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + */ +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + const AVCodec **decoder_ret, + int flags); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * On success, the returned packet is reference-counted (pkt->buf is set) and + * valid indefinitely. The packet must be freed with av_packet_unref() when + * it is no longer needed. For video, the packet contains exactly one frame. + * For audio, it contains an integer number of frames if each frame has + * a known fixed size (e.g. PCM or ADPCM data). If the audio frames have + * a variable size (e.g. MPEG audio), then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file. On error, pkt will be blank + * (as if it came from av_packet_alloc()). + * + * @note pkt will be initialized, so it may be uninitialized, but it must not + * contain data that needs to be freed. + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @param stream_index If stream_index is (-1), a default stream is selected, + * and timestamp is automatically converted from + * AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units or, if no stream + * is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. + * + * @param s media file handle + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +/** + * @addtogroup lavf_encoding + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * Allocate the stream private data and write the stream header to + * an output media file. + * + * @param s Media file handle, must be allocated with + * avformat_alloc_context(). + * Its \ref AVFormatContext.oformat "oformat" field must be set + * to the desired output format; + * Its \ref AVFormatContext.pb "pb" field must be set to an + * already opened ::AVIOContext. + * @param options An ::AVDictionary filled with AVFormatContext and + * muxer-private options. + * On return this parameter will be destroyed and replaced with + * a dict containing options that were not found. May be NULL. + * + * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec had not already been + * fully initialized in avformat_init_output(). + * @retval AVSTREAM_INIT_IN_INIT_OUTPUT On success, if the codec had already been fully + * initialized in avformat_init_output(). + * @retval AVERROR A negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header() to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header(). + * + * @param s Media file handle, must be allocated with + * avformat_alloc_context(). + * Its \ref AVFormatContext.oformat "oformat" field must be set + * to the desired output format; + * Its \ref AVFormatContext.pb "pb" field must be set to an + * already opened ::AVIOContext. + * @param options An ::AVDictionary filled with AVFormatContext and + * muxer-private options. + * On return this parameter will be destroyed and replaced with + * a dict containing options that were not found. May be NULL. + * + * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec requires + * avformat_write_header to fully initialize. + * @retval AVSTREAM_INIT_IN_INIT_OUTPUT On success, if the codec has been fully + * initialized. + * @retval AVERROR Anegative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter can be NULL (at any time, not just at the end), in + * order to immediately flush data buffered within the muxer, for + * muxers that buffer up data internally before writing it to the + * output. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved, usually ordered by + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. If the packet is not reference-counted, libavformat will + * make a copy. + * The returned packet will be blank (as if returned from + * av_packet_alloc()), even on error. + *
+ * This parameter can be NULL (at any time, not just at the end), to + * flush the interleaving queues. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration" should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, av_interleaved_write_uncoded_frame() must be used. + * + * See av_interleaved_write_uncoded_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to avformat_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +const AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param[out] dts DTS of the last packet output for the stream, in stream + * time_base units + * @param[out] wall absolute time when that packet whas output, + * in microsecond + * @retval 0 Success + * @retval AVERROR(ENOSYS) The format does not support it + * + * @note Some formats or devices may not allow to measure dts and wall + * atomically. + */ +int av_get_output_timestamp(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + + +/** + * @} + */ + + +/** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscellaneous utility functions related to both muxing and demuxing + * (or neither). + */ + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump(FILE *f, const uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st); + + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, + const AVStream *st); + +/** + * Get the AVCodecID for the given codec tag tag. + * If no codec id is found returns AV_CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param tag codec tag to match to a codec ID + */ +enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec ID to match to a codec tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); + +/** + * Get the codec tag for the given codec id. + * + * @param tags list of supported codec_id - codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec id that should be searched for in the list + * @param tag A pointer to the found tag + * @return 0 if id was not found in tags, > 0 if it was found + */ +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, + unsigned int *tag); + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * + * @param st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Get the index entry count for the given AVStream. + * + * @param st stream + * @return the number of index entries in the stream + */ +int avformat_index_get_entries_count(const AVStream *st); + +/** + * Get the AVIndexEntry corresponding to the given index. + * + * @param st Stream containing the requested AVIndexEntry. + * @param idx The desired index. + * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise. + * + * @note The pointer returned by this function is only guaranteed to be valid + * until any function that takes the stream or the parent AVFormatContext + * as input argument is called. + */ +const AVIndexEntry *avformat_index_get_entry(AVStream *st, int idx); + +/** + * Get the AVIndexEntry corresponding to the given timestamp. + * + * @param st Stream containing the requested AVIndexEntry. + * @param wanted_timestamp Timestamp to retrieve the index entry for. + * @param flags If AVSEEK_FLAG_BACKWARD then the returned entry will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise. + * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise. + * + * @note The pointer returned by this function is only guaranteed to be valid + * until any function that takes the stream or the parent AVFormatContext + * as input argument is called. + */ +const AVIndexEntry *avformat_index_get_entry_from_timestamp(AVStream *st, + int64_t wanted_timestamp, + int flags); +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * Note, this overwrites the id values of AVStreams in the muxer contexts + * for getting unique dynamic payload types. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param filename file name to check against the given extensions + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +/** + * Test if the given container can store a codec. + * + * @param ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + */ +int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, + int std_compliance); + +/** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum AVCodecID id = av_codec_get_id(table, tag); + * @endcode + */ +/** + * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_video_tags(void); +/** + * @return the table mapping RIFF FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_audio_tags(void); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_audio_tags(void); + +/** + * @} + */ + +/** + * Guess the sample aspect ratio of a frame, based on both the stream and the + * frame aspect ratio. + * + * Since the frame aspect ratio is set by the codec but the stream aspect ratio + * is set by the demuxer, these two may not be equal. This function tries to + * return the value that you should use if you would like to display the frame. + * + * Basic logic is to use the stream aspect ratio if it is set to something sane + * otherwise use the frame aspect ratio. This way a container setting, which is + * usually easy to modify can override the coded value in the frames. + * + * @param format the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame with the aspect ratio to be determined + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea + */ +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); + +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + +/** + * Check if the stream st contained in s is matched by the stream specifier + * spec. + * + * See the "stream specifiers" chapter in the documentation for the syntax + * of spec. + * + * @return >0 if st is matched by spec; + * 0 if st is not matched by spec; + * AVERROR code if spec is invalid + * + * @note A stream specifier can match several streams in the format. + */ +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, + const char *spec); + +int avformat_queue_attached_pictures(AVFormatContext *s); + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavformat/avio.h b/LedOK/ffmpeg-mac/include/libavformat/avio.h new file mode 100644 index 0000000..5f13e06 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavformat/avio.h @@ -0,0 +1,837 @@ +/* + * copyright (c) 2001 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * @ingroup lavf_io + * Buffered I/O operations + */ + +#include +#include + +#include "libavutil/attributes.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "libavformat/version_major.h" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +#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 + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * Bytestream IO Context. + * New public fields can be added with minor version bumps. + * Removal, reordering and changes to existing public fields require + * a major version bump. + * sizeof(AVIOContext) must not be used outside libav*. + * + * @note None of the function pointers in AVIOContext should be called + * directly, they should only be set by the client application + * when implementing custom I/O. Normally these are set to the + * function pointers specified in avio_alloc_context() + */ +typedef struct AVIOContext { + /** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< End of the data, may be less than + buffer+buffer_size if the read function returned + less data than requested, e.g. for streams where + no more data has been received yet. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int eof_reached; /**< true if was unable to read due to error or eof */ + int error; /**< contains the error code or 0 if no error happened */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + int min_packet_size; /**< Try to buffer at least this amount of data + before flushing it. */ + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + /** + * Pause or resume playback for network streaming protocols - e.g. MMS. + */ + int (*read_pause)(void *opaque, int pause); + /** + * Seek to a given timestamp in stream with the specified stream_index. + * Needed for some network streaming protocols which don't support seeking + * to byte position. + */ + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ + int direct; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Read-only statistic of bytes read for this AVIOContext. + */ + int64_t bytes_read; + + /** + * Read-only statistic of bytes written for this AVIOContext. + */ + int64_t bytes_written; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * Return AVIO_FLAG_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + */ +int avio_check(const char *url, int flags); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @param buffer_size The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this blocksize. + * For others a typical size is a cache page, e.g. 4kb. + * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. + * @param opaque An opaque pointer to user-specific data. + * @param read_packet A function for refilling the buffer, may be NULL. + * For stream protocols, must never return 0 but rather + * a proper AVERROR code. + * @param write_packet A function for writing the buffer contents, may be NULL. + * The function may not change the input buffers content. + * @param seek A function for seeking to specified byte position, may be NULL. + * + * @return Allocated AVIOContext or NULL on failure. + */ +AVIOContext *avio_alloc_context( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +void avio_w8(AVIOContext *s, int b); +void avio_write(AVIOContext *s, const unsigned char *buf, int size); +void avio_wl64(AVIOContext *s, uint64_t val); +void avio_wb64(AVIOContext *s, uint64_t val); +void avio_wl32(AVIOContext *s, unsigned int val); +void avio_wb32(AVIOContext *s, unsigned int val); +void avio_wl24(AVIOContext *s, unsigned int val); +void avio_wb24(AVIOContext *s, unsigned int val); +void avio_wl16(AVIOContext *s, unsigned int val); +void avio_wb16(AVIOContext *s, unsigned int val); + +/** + * Write a NULL-terminated string. + * @return number of bytes written. + */ +int avio_put_str(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16LE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param s the AVIOContext + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to + * return the filesize without seeking anywhere. Supporting this is optional. + * If it is not supported then the seek function will return <0. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Passing this flag as the "whence" parameter to a seek function causes it to + * seek by any means (like reopening and linear reading) or other normally unreasonable + * means that can be extremely slow. + * This may be ignored by the seek code. + */ +#define AVSEEK_FORCE 0x20000 + +/** + * fseek() equivalent for AVIOContext. + * @return new position or AVERROR. + */ +int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward + * @return new position or AVERROR. + */ +int64_t avio_skip(AVIOContext *s, int64_t offset); + +/** + * ftell() equivalent for AVIOContext. + * @return position or AVERROR. + */ +static av_always_inline int64_t avio_tell(AVIOContext *s) +{ + return avio_seek(s, 0, SEEK_CUR); +} + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t avio_size(AVIOContext *s); + +/** + * Similar to feof() but also returns nonzero on read errors. + * @return non zero if and only if at end of file or a read error happened when reading. + */ +int avio_feof(AVIOContext *s); + +/** + * Writes a formatted string to the context taking a va_list. + * @return number of bytes written, < 0 on error. + */ +int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap); + +/** + * Writes a formatted string to the context. + * @return number of bytes written, < 0 on error. + */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Write a NULL terminated array of strings to the context. + * Usually you don't need to use this function directly but its macro wrapper, + * avio_print. + */ +void avio_print_string_array(AVIOContext *s, const char *strings[]); + +/** + * Write strings (const char *) to the context. + * This is a convenience macro around avio_print_string_array and it + * automatically creates the string array from the variable argument list. + * For simple string concatenations this function is more performant than using + * avio_printf since it does not need a temporary buffer. + */ +#define avio_print(s, ...) \ + avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL}) + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +void avio_flush(AVIOContext *s); + +/** + * Read size bytes from AVIOContext into buf. + * @return number of bytes read or AVERROR + */ +int avio_read(AVIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + +/** + * @name Functions for reading from AVIOContext + * @{ + * + * @note return 0 if EOF, so you cannot use it if EOF handling is + * necessary + */ +int avio_r8 (AVIOContext *s); +unsigned int avio_rl16(AVIOContext *s); +unsigned int avio_rl24(AVIOContext *s); +unsigned int avio_rl32(AVIOContext *s); +uint64_t avio_rl64(AVIOContext *s); +unsigned int avio_rb16(AVIOContext *s); +unsigned int avio_rb24(AVIOContext *s); +unsigned int avio_rb32(AVIOContext *s); +uint64_t avio_rb64(AVIOContext *s); +/** + * @} + */ + +/** + * Read a string from pb into buf. The reading will terminate when either + * a NULL character was encountered, maxlen bytes have been read, or nothing + * more can be read from pb. The result is guaranteed to be NULL-terminated, it + * will be truncated if buf is too small. + * Note that the string is not interpreted or validated in any way, it + * might get truncated in the middle of a sequence for multi-byte encodings. + * + * @return number of bytes read (is always <= maxlen). + * If reading ends on EOF or error, the return value will be one more than + * bytes actually read. + */ +int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); + +/** + * Read a UTF-16 string from pb and convert it to UTF-8. + * The reading will terminate when either a null or invalid character was + * encountered or maxlen bytes have been read. + * @return number of bytes read (is always <= maxlen) + */ +int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); +int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); + + +/** + * @name URL open modes + * The flags argument to avio_open must be one of the following + * constants, optionally ORed with other flags. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */ +/** + * @} + */ + +/** + * Use non-blocking mode. + * If this flag is set, operations on the context will return + * AVERROR(EAGAIN) if they can not be performed immediately. + * If this flag is not set, operations on the context will never return + * AVERROR(EAGAIN). + * Note that this flag does not affect the opening/connecting of the + * context. Connecting a protocol will always block if necessary (e.g. on + * network protocols) but never hang (e.g. on busy devices). + * Warning: non-blocking protocols is work-in-progress; this flag may be + * silently ignored. + */ +#define AVIO_FLAG_NONBLOCK 8 + +/** + * Use direct mode. + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open(AVIOContext **s, const char *url, int flags); + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open2(AVIOContext **s, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * Close the resource accessed by the AVIOContext s and free it. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_closep + */ +int avio_close(AVIOContext *s); + +/** + * Close the resource accessed by the AVIOContext *s, free it + * and set the pointer pointing to it to NULL. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_close + */ +int avio_closep(AVIOContext **s); + + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int avio_open_dyn_buf(AVIOContext **s); + +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Iterate through names of available protocols. + * + * @param opaque A private pointer representing current protocol. + * It must be a pointer to NULL on first iteration and will + * be updated by successive calls to avio_enum_protocols. + * @param output If set to 1, iterate over output protocols, + * otherwise over input protocols. + * + * @return A static string containing the name of current protocol or NULL + */ +const char *avio_enum_protocols(void **opaque, int output); + +/** + * Get AVClass by names of available protocols. + * + * @return A AVClass of input protocol name or NULL + */ +const AVClass *avio_protocol_get_class(const char *name); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * + * @param h IO context from which to call the read_pause function pointer + * @param pause 1 for pause, 0 for resume + */ +int avio_pause(AVIOContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * + * @param h IO context from which to call the seek function pointers + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +int64_t avio_seek_time(AVIOContext *h, int stream_index, + int64_t timestamp, int flags); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavformat/version.h b/LedOK/ffmpeg-mac/include/libavformat/version.h new file mode 100644 index 0000000..7ff1483 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavformat/version.h @@ -0,0 +1,47 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBAVFORMAT_VERSION_MINOR 3 +#define LIBAVFORMAT_VERSION_MICRO 100 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +#endif /* AVFORMAT_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavformat/version_major.h b/LedOK/ffmpeg-mac/include/libavformat/version_major.h new file mode 100644 index 0000000..293fbd3 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavformat/version_major.h @@ -0,0 +1,52 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_VERSION_MAJOR_H +#define AVFORMAT_VERSION_MAJOR_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +// 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 60 + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 61) +#define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 61) +#define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 61) +#define FF_API_AVFORMAT_IO_CLOSE (LIBAVFORMAT_VERSION_MAJOR < 61) + + +#define FF_API_R_FRAME_RATE 1 + +#endif /* AVFORMAT_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/adler32.h b/LedOK/ffmpeg-mac/include/libavutil/adler32.h new file mode 100644 index 0000000..232d07f --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/adler32.h @@ -0,0 +1,63 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +typedef uint32_t AVAdler; + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +AVAdler av_adler32_update(AVAdler adler, const uint8_t *buf, + size_t len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/aes.h b/LedOK/ffmpeg-mac/include/libavutil/aes.h new file mode 100644 index 0000000..4e73473 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/aes.h @@ -0,0 +1,69 @@ +/* + * copyright (c) 2007 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * + * @param a The AVAES context + * @param key Pointer to the key + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param a The AVAES context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/aes_ctr.h b/LedOK/ffmpeg-mac/include/libavutil/aes_ctr.h new file mode 100644 index 0000000..d98c071 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/aes_ctr.h @@ -0,0 +1,99 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +/** + * @defgroup lavu_aes_ctr AES-CTR + * @ingroup lavu_crypto + * @{ + */ + +#include + +#include "attributes.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * + * @param a The AVAESCTR context to initialize + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + * + * @param a The AVAESCTR context + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * + * @param a The AVAESCTR context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the 8-byte iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Forcefully change the "full" 16-byte iv, including the counter + */ +void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/ambient_viewing_environment.h b/LedOK/ffmpeg-mac/include/libavutil/ambient_viewing_environment.h new file mode 100644 index 0000000..e5e4ac2 --- /dev/null +++ b/LedOK/ffmpeg-mac/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/LedOK/ffmpeg-mac/include/libavutil/attributes.h b/LedOK/ffmpeg-mac/include/libavutil/attributes.h new file mode 100644 index 0000000..04c615c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/attributes.h @@ -0,0 +1,173 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifdef __has_builtin +# define AV_HAS_BUILTIN(x) __has_builtin(x) +#else +# define AV_HAS_BUILTIN(x) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) || defined(__clang__) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/audio_fifo.h b/LedOK/ffmpeg-mac/include/libavutil/audio_fifo.h new file mode 100644 index 0000000..d1e4c85 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/audio_fifo.h @@ -0,0 +1,186 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "attributes.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/avassert.h b/LedOK/ffmpeg-mac/include/libavutil/avassert.h new file mode 100644 index 0000000..51e462b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "log.h" +#include "macros.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point operations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/avconfig.h b/LedOK/ffmpeg-mac/include/libavutil/avconfig.h new file mode 100644 index 0000000..c289fbb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffmpeg configure */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/avstring.h b/LedOK/ffmpeg-mac/include/libavutil/avstring.h new file mode 100644 index 0000000..e260263 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/avstring.h @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param s the string whose length to count + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the string to parse, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + * If path does not contain a slash, the function returns a copy of path. + * If path is a NULL pointer or points to an empty string, a pointer + * to a string "." is returned. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the string to parse, on DOS both \ and / are considered separators. + * @return A pointer to a string that's the parent directory of path. + * If path is a NULL pointer or points to an empty string, a pointer + * to a string "." is returned. + * @note the function may modify the contents of the path, so copies should be passed. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. + AV_ESCAPE_MODE_XML, ///< Use XML non-markup character data escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Within AV_ESCAPE_MODE_XML, additionally escape single quotes for single + * quoted attributes. + */ +#define AV_ESCAPE_FLAG_XML_SINGLE_QUOTES (1 << 2) + +/** + * Within AV_ESCAPE_MODE_XML, additionally escape double quotes for double + * quoted attributes. + */ +#define AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES (1 << 3) + + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * See libc sscanf manual for more information. + * Locale-independent sscanf implementation. + */ +int av_sscanf(const char *string, const char *format, ...); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/avutil.h b/LedOK/ffmpeg-mac/include/libavutil/avutil.h new file mode 100644 index 0000000..64b68bd --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/avutil.h @@ -0,0 +1,371 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @li @ref libavc "libavcodec" encoding/decoding library + * @li @ref lavfi "libavfilter" graph-based frame editing library + * @li @ref libavf "libavformat" I/O and muxing/demuxing library + * @li @ref lavd "libavdevice" special devices muxing/demuxing library + * @li @ref lavu "libavutil" common utility library + * @li @ref lswr "libswresample" audio resampling, format conversion and mixing + * @li @ref lpp "libpostproc" post processing library + * @li @ref libsws "libswscale" color conversion and scaling library + * + * @section ffmpeg_versioning Versioning and compatibility + * + * Each of the FFmpeg libraries contains a version.h header, which defines a + * major, minor and micro version number with the + * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version + * number is incremented with backward incompatible changes - e.g. removing + * parts of the public API, reordering public struct members, etc. The minor + * version number is incremented for backward compatible API changes or major + * new features - e.g. adding a new public function or a new decoder. The micro + * version number is incremented for smaller changes that a calling program + * might still want to check for - e.g. changing behavior in a previously + * unspecified situation. + * + * FFmpeg guarantees backward API and ABI compatibility for each library as long + * as its major version number is unchanged. This means that no public symbols + * will be removed or renamed. Types and names of the public struct members and + * values of public macros and enums will remain the same (unless they were + * explicitly declared as not part of the public API). Documented behavior will + * not change. + * + * In other words, any correct program that works with a given FFmpeg snapshot + * should work just as well without any changes with any later snapshot with the + * same major versions. This applies to both rebuilding the program against new + * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program + * links against. + * + * However, new public symbols may be added and new members may be appended to + * public structs whose size is not part of public ABI (most public structs in + * FFmpeg). New macros and enum values may be added. Behavior in undocumented + * situations may change slightly (and be documented). All those are accompanied + * by an entry in doc/APIchanges and incrementing either the minor or micro + * version number. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +/** + * @} + */ + +/** + * @addtogroup lavu_media Media Type + * @brief Media Type + */ + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse + AVMEDIA_TYPE_NB +}; + +/** + * Return a string describing the media_type enum, NULL if media_type + * is unknown. + */ +const char *av_get_media_type_string(enum AVMediaType media_type); + +/** + * @defgroup lavu_const Constants + * @{ + * + * @defgroup lavu_enc Encoding specific + * + * @note those definition should move to avcodec + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/blowfish.h b/LedOK/ffmpeg-mac/include/libavutil/blowfish.h new file mode 100644 index 0000000..9e289a4 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/bprint.h b/LedOK/ffmpeg-mac/include/libavutil/bprint.h new file mode 100644 index 0000000..f27d30f --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/bprint.h @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_avbprint + * AVBPrint public header + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * @defgroup lavu_avbprint AVBPrint + * @ingroup lavu_data + * + * A buffer to print data progressively + * @{ + */ + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local `char buf[512]`. + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, AVBPrint.len can be greater than AVBPrint.size and records + * the total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The AVBPrint.size_max field determines several possible behaviours: + * - `size_max = -1` (= `UINT_MAX`) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * - `size_max = 0` prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using `size_init = size_max = len + 1`). + * - `size_max = 1` is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * @name Max size special values + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + * @{ + */ + +/** + * Buffer will be reallocated as necessary, with an amortized linear cost. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +/** + * Use the exact size available in the AVBPrint structure itself. + * + * Thus ensuring no dynamic memory allocation. The internal buffer is large + * enough to hold a reasonable paragraph of text, such as the current paragraph. + */ +#define AV_BPRINT_SIZE_AUTOMATIC 1 +/** + * Do not write anything to the buffer, only calculate the total length. + * + * The write operations can then possibly be repeated in a buffer with + * exactly the necessary size (using `size_init = size_max = AVBPrint.len + 1`). + */ +#define AV_BPRINT_SIZE_COUNT_ONLY 0 +/** @} */ + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * - `0` means do not write anything, just count the length + * - `1` is replaced by the maximum value for automatic storage + * any large value means that the internal buffer will be + * reallocated as needed up to that limit + * - `-1` is converted to `UINT_MAX`, the largest limit possible. + * Check also `AV_BPRINT_SIZE_*` macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +/** @} */ + +#endif /* AVUTIL_BPRINT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/bswap.h b/LedOK/ffmpeg-mac/include/libavutil/bswap.h new file mode 100644 index 0000000..4840ab4 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/bswap.h @@ -0,0 +1,111 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_RISCV +# include "riscv/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/buffer.h b/LedOK/ffmpeg-mac/include/libavutil/buffer.h new file mode 100644 index 0000000..e1ef5b7 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/buffer.h @@ -0,0 +1,322 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_buffer + * refcounted data buffer API + */ + +#ifndef AVUTIL_BUFFER_H +#define AVUTIL_BUFFER_H + +#include +#include + +/** + * @defgroup lavu_buffer AVBuffer + * @ingroup lavu_data + * + * @{ + * AVBuffer is an API for reference-counted data buffers. + * + * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer + * represents the data buffer itself; it is opaque and not meant to be accessed + * by the caller directly, but only through AVBufferRef. However, the caller may + * e.g. compare two AVBuffer pointers to check whether two different references + * are describing the same data buffer. AVBufferRef represents a single + * reference to an AVBuffer and it is the object that may be manipulated by the + * caller directly. + * + * There are two functions provided for creating a new AVBuffer with a single + * reference -- av_buffer_alloc() to just allocate a new buffer, and + * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing + * reference, additional references may be created with av_buffer_ref(). + * Use av_buffer_unref() to free a reference (this will automatically free the + * data once all the references are freed). + * + * The convention throughout this API and the rest of FFmpeg is such that the + * buffer is considered writable if there exists only one reference to it (and + * it has not been marked as read-only). The av_buffer_is_writable() function is + * provided to check whether this is true and av_buffer_make_writable() will + * automatically create a new writable buffer when necessary. + * Of course nothing prevents the calling code from violating this convention, + * however that is safe only when all the existing references are under its + * control. + * + * @note Referencing and unreferencing the buffers is thread-safe and thus + * may be done from multiple threads simultaneously without any need for + * additional locking. + * + * @note Two different references to the same buffer can point to different + * parts of the buffer (i.e. their AVBufferRef.data will not be equal). + */ + +/** + * A reference counted buffer type. It is opaque and is meant to be used through + * references (AVBufferRef). + */ +typedef struct AVBuffer AVBuffer; + +/** + * A reference to a data buffer. + * + * The size of this struct is not a part of the public ABI and it is not meant + * to be allocated directly. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * The data buffer. It is considered writable if and only if + * this is the only reference to the buffer, in which case + * av_buffer_is_writable() returns 1. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + size_t size; +} AVBufferRef; + +/** + * Allocate an AVBuffer of the given size using av_malloc(). + * + * @return an AVBufferRef of given size or NULL when out of memory + */ +AVBufferRef *av_buffer_alloc(size_t size); + +/** + * Same as av_buffer_alloc(), except the returned buffer will be initialized + * to zero. + */ +AVBufferRef *av_buffer_allocz(size_t size); + +/** + * Always treat the buffer as read-only, even when it has only one + * reference. + */ +#define AV_BUFFER_FLAG_READONLY (1 << 0) + +/** + * Create an AVBuffer from an existing array. + * + * If this function is successful, data is owned by the AVBuffer. The caller may + * only access data through the returned AVBufferRef and references derived from + * it. + * If this function fails, data is left untouched. + * @param data data array + * @param size size of data in bytes + * @param free a callback for freeing this buffer's data + * @param opaque parameter to be got for processing or passed to free + * @param flags a combination of AV_BUFFER_FLAG_* + * + * @return an AVBufferRef referring to data on success, NULL on failure. + */ +AVBufferRef *av_buffer_create(uint8_t *data, size_t size, + void (*free)(void *opaque, uint8_t *data), + void *opaque, int flags); + +/** + * Default free callback, which calls av_free() on the buffer data. + * This function is meant to be passed to av_buffer_create(), not called + * directly. + */ +void av_buffer_default_free(void *opaque, uint8_t *data); + +/** + * Create a new reference to an AVBuffer. + * + * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on + * failure. + */ +AVBufferRef *av_buffer_ref(const AVBufferRef *buf); + +/** + * Free a given reference and automatically free the buffer if there are no more + * references to it. + * + * @param buf the reference to be freed. The pointer is set to NULL on return. + */ +void av_buffer_unref(AVBufferRef **buf); + +/** + * @return 1 if the caller may write to the data referred to by buf (which is + * true if and only if buf is the only reference to the underlying AVBuffer). + * Return 0 otherwise. + * A positive answer is valid until av_buffer_ref() is called on buf. + */ +int av_buffer_is_writable(const AVBufferRef *buf); + +/** + * @return the opaque parameter set by av_buffer_create. + */ +void *av_buffer_get_opaque(const AVBufferRef *buf); + +int av_buffer_get_ref_count(const AVBufferRef *buf); + +/** + * Create a writable reference from a given buffer reference, avoiding data copy + * if possible. + * + * @param buf buffer reference to make writable. On success, buf is either left + * untouched, or it is unreferenced and a new writable AVBufferRef is + * written in its place. On failure, buf is left untouched. + * @return 0 on success, a negative AVERROR on failure. + */ +int av_buffer_make_writable(AVBufferRef **buf); + +/** + * Reallocate a given buffer. + * + * @param buf a buffer reference to reallocate. On success, buf will be + * unreferenced and a new reference with the required size will be + * written in its place. On failure buf will be left untouched. *buf + * may be NULL, then a new buffer is allocated. + * @param size required new buffer size. + * @return 0 on success, a negative AVERROR on failure. + * + * @note the buffer is actually reallocated with av_realloc() only if it was + * initially allocated through av_buffer_realloc(NULL) and there is only one + * reference to it (i.e. the one passed to this function). In all other cases + * a new buffer is allocated and the data is copied. + */ +int av_buffer_realloc(AVBufferRef **buf, size_t size); + +/** + * Ensure dst refers to the same data as src. + * + * When *dst is already equivalent to src, do nothing. Otherwise unreference dst + * and replace it with a new reference to src. + * + * @param dst Pointer to either a valid buffer reference or NULL. On success, + * this will point to a buffer reference equivalent to src. On + * failure, dst will be left untouched. + * @param src A buffer reference to replace dst with. May be NULL, then this + * function is equivalent to av_buffer_unref(dst). + * @return 0 on success + * AVERROR(ENOMEM) on memory allocation failure. + */ +int av_buffer_replace(AVBufferRef **dst, const AVBufferRef *src); + +/** + * @} + */ + +/** + * @defgroup lavu_bufferpool AVBufferPool + * @ingroup lavu_data + * + * @{ + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. + * + * Frequently allocating and freeing large buffers may be slow. AVBufferPool is + * meant to solve this in cases when the caller needs a set of buffers of the + * same size (the most obvious use case being buffers for raw video or audio + * frames). + * + * At the beginning, the user must call av_buffer_pool_init() to create the + * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to + * get a reference to a new buffer, similar to av_buffer_alloc(). This new + * reference works in all aspects the same way as the one created by + * av_buffer_alloc(). However, when the last reference to this buffer is + * unreferenced, it is returned to the pool instead of being freed and will be + * reused for subsequent av_buffer_pool_get() calls. + * + * When the caller is done with the pool and no longer needs to allocate any new + * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. + * Once all the buffers are released, it will automatically be freed. + * + * Allocating and releasing buffers with this API is thread-safe as long as + * either the default alloc callback is used, or the user-supplied one is + * thread-safe. + */ + +/** + * The buffer pool. This structure is opaque and not meant to be accessed + * directly. It is allocated with av_buffer_pool_init() and freed with + * av_buffer_pool_uninit(). + */ +typedef struct AVBufferPool AVBufferPool; + +/** + * Allocate and initialize a buffer pool. + * + * @param size size of each buffer in this pool + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be used + * (av_buffer_alloc()). + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init(size_t size, AVBufferRef* (*alloc)(size_t size)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be + * used (av_buffer_alloc()). + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. May be NULL. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(size_t size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, size_t size), + void (*pool_free)(void *opaque)); + +/** + * Mark the pool as being available for freeing. It will actually be freed only + * once all the allocated buffers associated with the pool are released. Thus it + * is safe to call this function while some of the allocated buffers are still + * in use. + * + * @param pool pointer to the pool to be freed. It will be set to NULL. + */ +void av_buffer_pool_uninit(AVBufferPool **pool); + +/** + * Allocate a new AVBuffer, reusing an old buffer from the pool when available. + * This function may be called simultaneously from multiple threads. + * + * @return a reference to the new buffer on success, NULL on error. + */ +AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); + +/** + * Query the original opaque parameter of an allocated buffer in the pool. + * + * @param ref a buffer reference to a buffer returned by av_buffer_pool_get. + * @return the opaque parameter set by the buffer allocator function of the + * buffer pool. + * + * @note the opaque parameter of ref is used by the buffer pool implementation, + * therefore you have to use this function to access the original opaque + * parameter of an allocated buffer. + */ +void *av_buffer_pool_buffer_get_opaque(const AVBufferRef *ref); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/camellia.h b/LedOK/ffmpeg-mac/include/libavutil/camellia.h new file mode 100644 index 0000000..9678710 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/cast5.h b/LedOK/ffmpeg-mac/include/libavutil/cast5.h new file mode 100644 index 0000000..ad5b347 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/channel_layout.h b/LedOK/ffmpeg-mac/include/libavutil/channel_layout.h new file mode 100644 index 0000000..f345415 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/channel_layout.h @@ -0,0 +1,783 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include +#include + +#include "version.h" +#include "attributes.h" + +/** + * @file + * @ingroup lavu_audio_channels + * Public libavutil channel layout APIs header. + */ + + +/** + * @defgroup lavu_audio_channels Audio channels + * @ingroup lavu_audio + * + * Audio channel layout utility functions + * + * @{ + */ + +enum AVChannel { + ///< Invalid channel index + AV_CHAN_NONE = -1, + AV_CHAN_FRONT_LEFT, + AV_CHAN_FRONT_RIGHT, + AV_CHAN_FRONT_CENTER, + AV_CHAN_LOW_FREQUENCY, + AV_CHAN_BACK_LEFT, + AV_CHAN_BACK_RIGHT, + AV_CHAN_FRONT_LEFT_OF_CENTER, + AV_CHAN_FRONT_RIGHT_OF_CENTER, + AV_CHAN_BACK_CENTER, + AV_CHAN_SIDE_LEFT, + AV_CHAN_SIDE_RIGHT, + AV_CHAN_TOP_CENTER, + AV_CHAN_TOP_FRONT_LEFT, + AV_CHAN_TOP_FRONT_CENTER, + AV_CHAN_TOP_FRONT_RIGHT, + AV_CHAN_TOP_BACK_LEFT, + AV_CHAN_TOP_BACK_CENTER, + AV_CHAN_TOP_BACK_RIGHT, + /** Stereo downmix. */ + AV_CHAN_STEREO_LEFT = 29, + /** See above. */ + AV_CHAN_STEREO_RIGHT, + AV_CHAN_WIDE_LEFT, + AV_CHAN_WIDE_RIGHT, + AV_CHAN_SURROUND_DIRECT_LEFT, + AV_CHAN_SURROUND_DIRECT_RIGHT, + AV_CHAN_LOW_FREQUENCY_2, + AV_CHAN_TOP_SIDE_LEFT, + AV_CHAN_TOP_SIDE_RIGHT, + AV_CHAN_BOTTOM_FRONT_CENTER, + AV_CHAN_BOTTOM_FRONT_LEFT, + AV_CHAN_BOTTOM_FRONT_RIGHT, + + /** Channel is empty can be safely skipped. */ + AV_CHAN_UNUSED = 0x200, + + /** Channel contains data, but its position is unknown. */ + AV_CHAN_UNKNOWN = 0x300, + + /** + * Range of channels between AV_CHAN_AMBISONIC_BASE and + * AV_CHAN_AMBISONIC_END represent Ambisonic components using the ACN system. + * + * Given a channel id `` between AV_CHAN_AMBISONIC_BASE and + * AV_CHAN_AMBISONIC_END (inclusive), the ACN index of the channel `` is + * ` = - AV_CHAN_AMBISONIC_BASE`. + * + * @note these values are only used for AV_CHANNEL_ORDER_CUSTOM channel + * orderings, the AV_CHANNEL_ORDER_AMBISONIC ordering orders the channels + * implicitly by their position in the stream. + */ + AV_CHAN_AMBISONIC_BASE = 0x400, + // leave space for 1024 ids, which correspond to maximum order-32 harmonics, + // which should be enough for the foreseeable use cases + AV_CHAN_AMBISONIC_END = 0x7ff, +}; + +enum AVChannelOrder { + /** + * Only the channel count is specified, without any further information + * about the channel order. + */ + AV_CHANNEL_ORDER_UNSPEC, + /** + * The native channel order, i.e. the channels are in the same order in + * which they are defined in the AVChannel enum. This supports up to 63 + * different channels. + */ + AV_CHANNEL_ORDER_NATIVE, + /** + * 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) + * channels at arbitrary positions. + */ + AV_CHANNEL_ORDER_CUSTOM, + /** + * The audio is represented as the decomposition of the sound field into + * spherical harmonics. Each channel corresponds to a single expansion + * component. Channels are ordered according to ACN (Ambisonic Channel + * Number). + * + * The channel with the index n in the stream contains the spherical + * harmonic of degree l and order m given by + * @code{.unparsed} + * l = floor(sqrt(n)), + * m = n - l * (l + 1). + * @endcode + * + * Conversely given a spherical harmonic of degree l and order m, the + * corresponding channel index n is given by + * @code{.unparsed} + * n = l * (l + 1) + m. + * @endcode + * + * Normalization is assumed to be SN3D (Schmidt Semi-Normalization) + * as defined in AmbiX format $ 2.1. + */ + AV_CHANNEL_ORDER_AMBISONIC, +}; + + +/** + * @defgroup channel_masks Audio channel masks + * + * A channel layout is a 64-bits integer with a bit set for every channel. + * The number of bits set must be equal to the number of channels. + * The value 0 means that the channel layout is not known. + * @note this data structure is not powerful enough to handle channels + * combinations that have the same channel multiple times, such as + * dual-mono. + * + * @{ + */ +#define AV_CH_FRONT_LEFT (1ULL << AV_CHAN_FRONT_LEFT ) +#define AV_CH_FRONT_RIGHT (1ULL << AV_CHAN_FRONT_RIGHT ) +#define AV_CH_FRONT_CENTER (1ULL << AV_CHAN_FRONT_CENTER ) +#define AV_CH_LOW_FREQUENCY (1ULL << AV_CHAN_LOW_FREQUENCY ) +#define AV_CH_BACK_LEFT (1ULL << AV_CHAN_BACK_LEFT ) +#define AV_CH_BACK_RIGHT (1ULL << AV_CHAN_BACK_RIGHT ) +#define AV_CH_FRONT_LEFT_OF_CENTER (1ULL << AV_CHAN_FRONT_LEFT_OF_CENTER ) +#define AV_CH_FRONT_RIGHT_OF_CENTER (1ULL << AV_CHAN_FRONT_RIGHT_OF_CENTER) +#define AV_CH_BACK_CENTER (1ULL << AV_CHAN_BACK_CENTER ) +#define AV_CH_SIDE_LEFT (1ULL << AV_CHAN_SIDE_LEFT ) +#define AV_CH_SIDE_RIGHT (1ULL << AV_CHAN_SIDE_RIGHT ) +#define AV_CH_TOP_CENTER (1ULL << AV_CHAN_TOP_CENTER ) +#define AV_CH_TOP_FRONT_LEFT (1ULL << AV_CHAN_TOP_FRONT_LEFT ) +#define AV_CH_TOP_FRONT_CENTER (1ULL << AV_CHAN_TOP_FRONT_CENTER ) +#define AV_CH_TOP_FRONT_RIGHT (1ULL << AV_CHAN_TOP_FRONT_RIGHT ) +#define AV_CH_TOP_BACK_LEFT (1ULL << AV_CHAN_TOP_BACK_LEFT ) +#define AV_CH_TOP_BACK_CENTER (1ULL << AV_CHAN_TOP_BACK_CENTER ) +#define AV_CH_TOP_BACK_RIGHT (1ULL << AV_CHAN_TOP_BACK_RIGHT ) +#define AV_CH_STEREO_LEFT (1ULL << AV_CHAN_STEREO_LEFT ) +#define AV_CH_STEREO_RIGHT (1ULL << AV_CHAN_STEREO_RIGHT ) +#define AV_CH_WIDE_LEFT (1ULL << AV_CHAN_WIDE_LEFT ) +#define AV_CH_WIDE_RIGHT (1ULL << AV_CHAN_WIDE_RIGHT ) +#define AV_CH_SURROUND_DIRECT_LEFT (1ULL << AV_CHAN_SURROUND_DIRECT_LEFT ) +#define AV_CH_SURROUND_DIRECT_RIGHT (1ULL << AV_CHAN_SURROUND_DIRECT_RIGHT) +#define AV_CH_LOW_FREQUENCY_2 (1ULL << AV_CHAN_LOW_FREQUENCY_2 ) +#define AV_CH_TOP_SIDE_LEFT (1ULL << AV_CHAN_TOP_SIDE_LEFT ) +#define AV_CH_TOP_SIDE_RIGHT (1ULL << AV_CHAN_TOP_SIDE_RIGHT ) +#define AV_CH_BOTTOM_FRONT_CENTER (1ULL << AV_CHAN_BOTTOM_FRONT_CENTER ) +#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 + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_TOP_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_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) + +enum AVMatrixEncoding { + AV_MATRIX_ENCODING_NONE, + AV_MATRIX_ENCODING_DOLBY, + AV_MATRIX_ENCODING_DPLII, + AV_MATRIX_ENCODING_DPLIIX, + AV_MATRIX_ENCODING_DPLIIZ, + AV_MATRIX_ENCODING_DOLBYEX, + AV_MATRIX_ENCODING_DOLBYHEADPHONE, + AV_MATRIX_ENCODING_NB +}; + +/** + * @} + */ + +/** + * An AVChannelCustom defines a single channel within a custom order layout + * + * Unlike most structures in FFmpeg, sizeof(AVChannelCustom) is a part of the + * public ABI. + * + * No new fields may be added to it without a major version bump. + */ +typedef struct AVChannelCustom { + enum AVChannel id; + char name[16]; + void *opaque; +} AVChannelCustom; + +/** + * An AVChannelLayout holds information about the channel layout of audio data. + * + * A channel layout here is defined as a set of channels ordered in a specific + * way (unless the channel order is AV_CHANNEL_ORDER_UNSPEC, in which case an + * AVChannelLayout carries only the channel count). + * All orders may be treated as if they were AV_CHANNEL_ORDER_UNSPEC by + * ignoring everything but the channel count, as long as av_channel_layout_check() + * considers they are valid. + * + * Unlike most structures in FFmpeg, sizeof(AVChannelLayout) is a part of the + * public ABI and may be used by the caller. E.g. it may be allocated on stack + * or embedded in caller-defined structs. + * + * AVChannelLayout can be initialized as follows: + * - default initialization with {0}, followed by setting all used fields + * correctly; + * - by assigning one of the predefined AV_CHANNEL_LAYOUT_* initializers; + * - with a constructor function, such as av_channel_layout_default(), + * av_channel_layout_from_mask() or av_channel_layout_from_string(). + * + * The channel layout must be unitialized with av_channel_layout_uninit() + * + * Copying an AVChannelLayout via assigning is forbidden, + * av_channel_layout_copy() must be used instead (and its return value should + * be checked) + * + * No new fields may be added to it without a major version bump, except for + * new elements of the union fitting in sizeof(uint64_t). + */ +typedef struct AVChannelLayout { + /** + * Channel order used in this layout. + * This is a mandatory field. + */ + enum AVChannelOrder order; + + /** + * Number of channels in this layout. Mandatory field. + */ + int nb_channels; + + /** + * Details about which channels are present in this layout. + * For AV_CHANNEL_ORDER_UNSPEC, this field is undefined and must not be + * used. + */ + union { + /** + * This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used + * for AV_CHANNEL_ORDER_AMBISONIC to signal non-diegetic channels. + * It is a bitmask, where the position of each set bit means that the + * AVChannel with the corresponding value is present. + * + * I.e. when (mask & (1 << AV_CHAN_FOO)) is non-zero, then AV_CHAN_FOO + * is present in the layout. Otherwise it is not present. + * + * @note when a channel layout using a bitmask is constructed or + * modified manually (i.e. not using any of the av_channel_layout_* + * functions), the code doing it must ensure that the number of set bits + * is equal to nb_channels. + */ + uint64_t mask; + /** + * This member must be used when the channel order is + * AV_CHANNEL_ORDER_CUSTOM. It is a nb_channels-sized array, with each + * element signalling the presence of the AVChannel with the + * corresponding value in map[i].id. + * + * I.e. when map[i].id is equal to AV_CHAN_FOO, then AV_CH_FOO is the + * i-th channel in the audio data. + * + * When map[i].id is in the range between AV_CHAN_AMBISONIC_BASE and + * AV_CHAN_AMBISONIC_END (inclusive), the channel contains an ambisonic + * component with ACN index (as defined above) + * n = map[i].id - AV_CHAN_AMBISONIC_BASE. + * + * map[i].name may be filled with a 0-terminated string, in which case + * it will be used for the purpose of identifying the channel with the + * convenience functions below. Otherise it must be zeroed. + */ + AVChannelCustom *map; + } u; + + /** + * For some private data of the user. + */ + void *opaque; +} AVChannelLayout; + +#define AV_CHANNEL_LAYOUT_MASK(nb, m) \ + { .order = AV_CHANNEL_ORDER_NATIVE, .nb_channels = (nb), .u = { .mask = (m) }} + +/** + * @name Common pre-defined channel layouts + * @{ + */ +#define AV_CHANNEL_LAYOUT_MONO AV_CHANNEL_LAYOUT_MASK(1, AV_CH_LAYOUT_MONO) +#define AV_CHANNEL_LAYOUT_STEREO AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO) +#define AV_CHANNEL_LAYOUT_2POINT1 AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2POINT1) +#define AV_CHANNEL_LAYOUT_2_1 AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2_1) +#define AV_CHANNEL_LAYOUT_SURROUND AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_SURROUND) +#define AV_CHANNEL_LAYOUT_3POINT1 AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_3POINT1) +#define AV_CHANNEL_LAYOUT_4POINT0 AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_4POINT0) +#define AV_CHANNEL_LAYOUT_4POINT1 AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_4POINT1) +#define AV_CHANNEL_LAYOUT_2_2 AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_2_2) +#define AV_CHANNEL_LAYOUT_QUAD AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_QUAD) +#define AV_CHANNEL_LAYOUT_5POINT0 AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0) +#define AV_CHANNEL_LAYOUT_5POINT1 AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1) +#define AV_CHANNEL_LAYOUT_5POINT0_BACK AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0_BACK) +#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_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) +#define AV_CHANNEL_LAYOUT_6POINT1_FRONT AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_FRONT) +#define AV_CHANNEL_LAYOUT_7POINT0 AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0) +#define AV_CHANNEL_LAYOUT_7POINT0_FRONT AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0_FRONT) +#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_7POINT1_TOP_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_TOP_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_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_AMBISONIC_FIRST_ORDER \ + { .order = AV_CHANNEL_ORDER_AMBISONIC, .nb_channels = 4, .u = { .mask = 0 }} +/** @} */ + +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(). + * + * @param buf pre-allocated buffer where to put the generated string + * @param buf_size size in bytes of the buffer. + * @param channel the AVChannel whose name to get + * @return amount of bytes needed to hold the output string, or a negative AVERROR + * on failure. If the returned value is bigger than buf_size, then the + * string was truncated. + */ +int av_channel_name(char *buf, size_t buf_size, enum AVChannel channel); + +/** + * bprint variant of av_channel_name(). + * + * @note the string will be appended to the bprint buffer. + */ +void av_channel_name_bprint(struct AVBPrint *bp, enum AVChannel channel_id); + +/** + * Get a human readable string describing a given channel. + * + * @param buf pre-allocated buffer where to put the generated string + * @param buf_size size in bytes of the buffer. + * @param channel the AVChannel whose description to get + * @return amount of bytes needed to hold the output string, or a negative AVERROR + * on failure. If the returned value is bigger than buf_size, then the + * string was truncated. + */ +int av_channel_description(char *buf, size_t buf_size, enum AVChannel channel); + +/** + * bprint variant of av_channel_description(). + * + * @note the string will be appended to the bprint buffer. + */ +void av_channel_description_bprint(struct AVBPrint *bp, enum AVChannel channel_id); + +/** + * This is the inverse function of @ref av_channel_name(). + * + * @return the channel with the given name + * AV_CHAN_NONE when name does not identify a known channel + */ +enum AVChannel av_channel_from_string(const char *name); + +/** + * Initialize a native channel layout from a bitmask indicating which channels + * are present. + * + * @param channel_layout the layout structure to be initialized + * @param mask bitmask describing the channel layout + * + * @return 0 on success + * AVERROR(EINVAL) for invalid mask values + */ +int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask); + +/** + * Initialize a channel layout from a given string description. + * The input string can be represented by: + * - the formal channel layout name (returned by av_channel_layout_describe()) + * - single or multiple channel names (returned by av_channel_name(), eg. "FL", + * or concatenated with "+", each optionally containing a custom name after + * a "@", eg. "FL@Left+FR@Right+LFE") + * - a decimal or hexadecimal value of a native channel layout (eg. "4" or "0x4") + * - the number of channels with default layout (eg. "4c") + * - the number of unordered channels (eg. "4C" or "4 channels") + * - the ambisonic order followed by optional non-diegetic channels (eg. + * "ambisonic 2+stereo") + * + * @param channel_layout input channel layout + * @param str string describing the channel layout + * @return 0 channel layout was detected, AVERROR_INVALIDATATA otherwise + */ +int av_channel_layout_from_string(AVChannelLayout *channel_layout, + const char *str); + +/** + * Get the default channel layout for a given number of channels. + * + * @param ch_layout the layout structure to be initialized + * @param nb_channels number of channels + */ +void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels); + +/** + * Iterate over all standard channel layouts. + * + * @param opaque a pointer where libavutil will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the standard channel layout or NULL when the iteration is + * finished + */ +const AVChannelLayout *av_channel_layout_standard(void **opaque); + +/** + * Free any allocated data in the channel layout and reset the channel + * count to 0. + * + * @param channel_layout the layout structure to be uninitialized + */ +void av_channel_layout_uninit(AVChannelLayout *channel_layout); + +/** + * Make a copy of a channel layout. This differs from just assigning src to dst + * in that it allocates and copies the map for AV_CHANNEL_ORDER_CUSTOM. + * + * @note the destination channel_layout will be always uninitialized before copy. + * + * @param dst destination channel layout + * @param src source channel layout + * @return 0 on success, a negative AVERROR on error. + */ +int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src); + +/** + * Get a human-readable string describing the channel layout properties. + * The string will be in the same format that is accepted by + * @ref av_channel_layout_from_string(), allowing to rebuild the same + * channel layout, except for opaque pointers. + * + * @param channel_layout channel layout to be described + * @param buf pre-allocated buffer where to put the generated string + * @param buf_size size in bytes of the buffer. + * @return amount of bytes needed to hold the output string, or a negative AVERROR + * on failure. If the returned value is bigger than buf_size, then the + * string was truncated. + */ +int av_channel_layout_describe(const AVChannelLayout *channel_layout, + char *buf, size_t buf_size); + +/** + * bprint variant of av_channel_layout_describe(). + * + * @note the string will be appended to the bprint buffer. + * @return 0 on success, or a negative AVERROR value on failure. + */ +int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout, + struct AVBPrint *bp); + +/** + * Get the channel with the given index in a channel layout. + * + * @param channel_layout input channel layout + * @param idx index of the channel + * @return channel with the index idx in channel_layout on success or + * AV_CHAN_NONE on failure (if idx is not valid or the channel order is + * unspecified) + */ +enum AVChannel +av_channel_layout_channel_from_index(const AVChannelLayout *channel_layout, unsigned int idx); + +/** + * Get the index of a given channel in a channel layout. In case multiple + * channels are found, only the first match will be returned. + * + * @param channel_layout input channel layout + * @param channel the channel whose index to obtain + * @return index of channel in channel_layout on success or a negative number if + * channel is not present in channel_layout. + */ +int av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout, + enum AVChannel channel); + +/** + * Get the index in a channel layout of a channel described by the given string. + * In case multiple channels are found, only the first match will be returned. + * + * This function accepts channel names in the same format as + * @ref av_channel_from_string(). + * + * @param channel_layout input channel layout + * @param name string describing the channel whose index to obtain + * @return a channel index described by the given string, or a negative AVERROR + * value. + */ +int av_channel_layout_index_from_string(const AVChannelLayout *channel_layout, + const char *name); + +/** + * Get a channel described by the given string. + * + * This function accepts channel names in the same format as + * @ref av_channel_from_string(). + * + * @param channel_layout input channel layout + * @param name string describing the channel to obtain + * @return a channel described by the given string in channel_layout on success + * or AV_CHAN_NONE on failure (if the string is not valid or the channel + * order is unspecified) + */ +enum AVChannel +av_channel_layout_channel_from_string(const AVChannelLayout *channel_layout, + const char *name); + +/** + * Find out what channels from a given set are present in a channel layout, + * without regard for their positions. + * + * @param channel_layout input channel layout + * @param mask a combination of AV_CH_* representing a set of channels + * @return a bitfield representing all the channels from mask that are present + * in channel_layout + */ +uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout, + uint64_t mask); + +/** + * Check whether a channel layout is valid, i.e. can possibly describe audio + * data. + * + * @param channel_layout input channel layout + * @return 1 if channel_layout is valid, 0 otherwise. + */ +int av_channel_layout_check(const AVChannelLayout *channel_layout); + +/** + * Check whether two channel layouts are semantically the same, i.e. the same + * channels are present on the same positions in both. + * + * If one of the channel layouts is AV_CHANNEL_ORDER_UNSPEC, while the other is + * not, they are considered to be unequal. If both are AV_CHANNEL_ORDER_UNSPEC, + * they are considered equal iff the channel counts are the same in both. + * + * @param chl input channel layout + * @param chl1 input channel layout + * @return 0 if chl and chl1 are equal, 1 if they are not equal. A negative + * AVERROR code if one or both are invalid. + */ +int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1); + +/** + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/common.h b/LedOK/ffmpeg-mac/include/libavutil/common.h new file mode 100644 index 0000000..fd1404b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/common.h @@ -0,0 +1,578 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>=0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Unsigned Absolute value. + * This takes the absolute value of a signed int and returns it as a unsigned. + * This also works with INT_MIN which would otherwise not be representable + * As with many macros, this evaluates its argument twice. + */ +#define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a)) +#define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a)) + +/* 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 +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32 av_sat_dsub32_c +#endif +#ifndef av_sat_add64 +# define av_sat_add64 av_sat_add64_c +#endif +#ifndef av_sat_sub64 +# define av_sat_sub64 av_sat_sub64_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 0) + return INT64_MAX ^ (b >> 63); + return s; +#endif +} + +/** + * Subtract two signed 64-bit values with saturation. + * + * @param a one value + * @param b another value + * @return difference with signed saturation + */ +static av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) { +#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_sub_overflow) + int64_t tmp; + return !__builtin_sub_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN); +#else + if (b <= 0 && a >= INT64_MAX + b) + return INT64_MAX; + if (b >= 0 && a <= INT64_MIN + b) + return INT64_MIN; + return a - b; +#endif +} + +/** + * Clip a float value into the amin-amax range. + * If a is nan or -inf amin will be returned. + * If a is +inf amax will be returned. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const float av_clipf_c(float a, float amin, float amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + return FFMIN(FFMAX(a, amin), amax); +} + +/** + * Clip a double value into the amin-amax range. + * If a is nan or -inf amin will be returned. + * If a is +inf amax will be returned. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + return FFMIN(FFMAX(a, amin), amax); +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1U) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++, or if you want to make sure + * that *ptr stops at the end of a NULL terminated string then + * *ptr ? *ptr++ : 0 + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + {ERROR}\ + while (val & top) {\ + unsigned int tmp = (GET_BYTE) - 128;\ + if(tmp>>6)\ + {ERROR}\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = (GET_16BIT);\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = (GET_16BIT) - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + {ERROR}\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/cpu.h b/LedOK/ffmpeg-mac/include/libavutil/cpu.h new file mode 100644 index 0000000..8fa5ea9 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/cpu.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2000, 2001, 2002 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 +#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used +#define AV_CPU_FLAG_AVX512ICL 0x200000 ///< F/CD/BW/DQ/VL/VNNI/IFMA/VBMI/VBMI2/VPOPCNTDQ/BITALG/GFNI/VAES/VPCLMULQDQ +#define AV_CPU_FLAG_SLOW_GATHER 0x2000000 ///< CPU has slow gathers. + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +#define AV_CPU_FLAG_MMI (1 << 0) +#define AV_CPU_FLAG_MSA (1 << 1) + +//Loongarch SIMD extension. +#define AV_CPU_FLAG_LSX (1 << 0) +#define AV_CPU_FLAG_LASX (1 << 1) + +// RISC-V extensions +#define AV_CPU_FLAG_RVI (1 << 0) ///< I (full GPR bank) +#define AV_CPU_FLAG_RVF (1 << 1) ///< F (single precision FP) +#define AV_CPU_FLAG_RVD (1 << 2) ///< D (double precision FP) +#define AV_CPU_FLAG_RVV_I32 (1 << 3) ///< Vectors of 8/16/32-bit int's */ +#define AV_CPU_FLAG_RVV_F32 (1 << 4) ///< Vectors of float's */ +#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 + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Overrides cpu count detection and forces the specified count. + * Count < 1 disables forcing of specific count. + */ +void av_cpu_force_count(int count); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/crc.h b/LedOK/ffmpeg-mac/include/libavutil/crc.h new file mode 100644 index 0000000..7f59812 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/crc.h @@ -0,0 +1,102 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ + AV_CRC_24_IEEE, + AV_CRC_8_EBU, + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param ctx initialized AVCRC array (see av_crc_init()) + * @param crc CRC of previous blocks if any or initial value for CRC + * @param buffer buffer whose CRC to calculate + * @param length length of the buffer + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/csp.h b/LedOK/ffmpeg-mac/include/libavutil/csp.h new file mode 100644 index 0000000..73bce52 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/csp.h @@ -0,0 +1,150 @@ +/* + * 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 + * 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_CSP_H +#define AVUTIL_CSP_H + +#include "pixfmt.h" +#include "rational.h" + +/** + * @file + * Colorspace value utility functions for libavutil. + * @ingroup lavu_math_csp + * @author Ronald S. Bultje + * @author Leo Izen + * @author Kevin Wheatley + */ + +/** + * @defgroup lavu_math_csp Colorspace Utility + * @ingroup lavu_math + * @{ + */ + +/** + * Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar + * calculations. + */ +typedef struct AVLumaCoefficients { + AVRational cr, cg, cb; +} AVLumaCoefficients; + +/** + * Struct containing chromaticity x and y values for the standard CIE 1931 + * chromaticity definition. + */ +typedef struct AVCIExy { + AVRational x, y; +} AVCIExy; + +/** + * Struct defining the red, green, and blue primary locations in terms of CIE + * 1931 chromaticity x and y. + */ +typedef struct AVPrimaryCoefficients { + AVCIExy r, g, b; +} AVPrimaryCoefficients; + +/** + * Struct defining white point location in terms of CIE 1931 chromaticity x + * and y. + */ +typedef AVCIExy AVWhitepointCoefficients; + +/** + * Struct that contains both white point location and primaries location, providing + * the complete description of a color gamut. + */ +typedef struct AVColorPrimariesDesc { + AVWhitepointCoefficients wp; + 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. + * @param csp An enum constant indicating YUV or similar colorspace. + * @return The Luma coefficients associated with that colorspace, or NULL + * if the constant is unknown to libavutil. + */ +const AVLumaCoefficients *av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp); + +/** + * Retrieves a complete gamut description from an enum constant describing the + * color primaries. + * @param prm An enum constant indicating primaries + * @return A description of the colorspace gamut associated with that enum + * constant, or NULL if the constant is unknown to libavutil. + */ +const AVColorPrimariesDesc *av_csp_primaries_desc_from_id(enum AVColorPrimaries prm); + +/** + * Detects which enum AVColorPrimaries constant corresponds to the given complete + * gamut description. + * @see enum AVColorPrimaries + * @param prm A description of the colorspace gamut + * @return The enum constant associated with this gamut, or + * AVCOL_PRI_UNSPECIFIED if no clear match can be idenitified. + */ +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); + +/** + * @} + */ + +#endif /* AVUTIL_CSP_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/des.h b/LedOK/ffmpeg-mac/include/libavutil/des.h new file mode 100644 index 0000000..3a3e6fa --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/des.h @@ -0,0 +1,81 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param d pointer to a AVDES structure to initialize + * @param key pointer to the key to use + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param d pointer to the AVDES structure + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param d pointer to the AVDES structure + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param count number of 8 byte blocks + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/detection_bbox.h b/LedOK/ffmpeg-mac/include/libavutil/detection_bbox.h new file mode 100644 index 0000000..0119880 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/detection_bbox.h @@ -0,0 +1,108 @@ +/* + * 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_DETECTION_BBOX_H +#define AVUTIL_DETECTION_BBOX_H + +#include "rational.h" +#include "avassert.h" +#include "frame.h" + +typedef struct AVDetectionBBox { + /** + * Distance in pixels from the left/top edge of the frame, + * together with width and height, defining the bounding box. + */ + int x; + int y; + int w; + int h; + +#define AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE 64 + + /** + * Detect result with confidence + */ + char detect_label[AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE]; + AVRational detect_confidence; + + /** + * At most 4 classifications based on the detected bounding box. + * For example, we can get max 4 different attributes with 4 different + * DNN models on one bounding box. + * classify_count is zero if no classification. + */ +#define AV_NUM_DETECTION_BBOX_CLASSIFY 4 + uint32_t classify_count; + char classify_labels[AV_NUM_DETECTION_BBOX_CLASSIFY][AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE]; + AVRational classify_confidences[AV_NUM_DETECTION_BBOX_CLASSIFY]; +} AVDetectionBBox; + +typedef struct AVDetectionBBoxHeader { + /** + * Information about how the bounding box is generated. + * for example, the DNN model name. + */ + char source[256]; + + /** + * Number of bounding boxes in the array. + */ + uint32_t nb_bboxes; + + /** + * Offset in bytes from the beginning of this structure at which + * the array of bounding boxes starts. + */ + size_t bboxes_offset; + + /** + * Size of each bounding box in bytes. + */ + size_t bbox_size; +} AVDetectionBBoxHeader; + +/* + * Get the bounding box at the specified {@code idx}. Must be between 0 and nb_bboxes. + */ +static av_always_inline AVDetectionBBox * +av_get_detection_bbox(const AVDetectionBBoxHeader *header, unsigned int idx) +{ + av_assert0(idx < header->nb_bboxes); + return (AVDetectionBBox *)((uint8_t *)header + header->bboxes_offset + + idx * header->bbox_size); +} + +/** + * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes} + * AVDetectionBBox, and initializes the variables. + * Can be freed with a normal av_free() call. + * + * @param nb_bboxes number of AVDetectionBBox structures to allocate + * @param out_size if non-NULL, the size in bytes of the resulting data array is + * written here. + */ +AVDetectionBBoxHeader *av_detection_bbox_alloc(uint32_t nb_bboxes, size_t *out_size); + +/** + * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes} + * AVDetectionBBox, in the given AVFrame {@code frame} as AVFrameSideData of type + * AV_FRAME_DATA_DETECTION_BBOXES and initializes the variables. + */ +AVDetectionBBoxHeader *av_detection_bbox_create_side_data(AVFrame *frame, uint32_t nb_bboxes); +#endif diff --git a/LedOK/ffmpeg-mac/include/libavutil/dict.h b/LedOK/ffmpeg-mac/include/libavutil/dict.h new file mode 100644 index 0000000..713c9e3 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/dict.h @@ -0,0 +1,241 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Public dictionary API. + * @deprecated + * AVDictionary is provided for compatibility with libav. It is both in + * implementation as well as API inefficient. It does not scale and is + * extremely slow with large dictionaries. + * It is recommended that new code uses our tree container from tree.c/h + * where applicable, which uses AVL trees to achieve O(log n) performance. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +/** + * @addtogroup lavu_dict AVDictionary + * @ingroup lavu_data + * + * @brief Simple key:value store + * + * @{ + * Dictionaries are used for storing key-value pairs. + * + * - To **create an AVDictionary**, simply pass an address of a NULL + * pointer to av_dict_set(). NULL can be used as an empty dictionary + * wherever a pointer to an AVDictionary is required. + * - 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 + AVDictionaryEntry *t = NULL; + + av_dict_set(&d, "foo", "bar", 0); // add an entry + + char *k = av_strdup("key"); // if your strings are already allocated, + char *v = av_strdup("value"); // you can avoid copying them like this + av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + + while ((t = av_dict_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(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 /**< Don't overwrite existing entries. */ +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ +/** + * @} + */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key Matching key + * @param flags A collection of AV_DICT_* flags controlling how the + * entry is retrieved + * + * @return Found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * 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. + * + * @param m dictionary + * @return number of entries in dictionary + */ +int av_dict_count(const AVDictionary *m); + +/** + * Set the given entry in *pm, overwriting an existing entry. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * @warning Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get() 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 + */ +int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); + +/** + * Convenience wrapper for av_dict_set() that converts the value to a string + * and stores it. + * + * Note: If ::AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created dictionary. + * + * @param key_val_sep A 0-terminated list of characters used to separate + * key from value + * @param pairs_sep A 0-terminated list of characters used to separate + * two pairs from each other + * @param flags Flags to use when adding to 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, + const char *key_val_sep, const char *pairs_sep, + int flags); + +/** + * Copy entries from one AVDictionary struct into another. + * + * @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. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @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 + * + * @return >= 0 on success, negative on error + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/display.h b/LedOK/ffmpeg-mac/include/libavutil/display.h new file mode 100644 index 0000000..50f2b44 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/display.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_video_display + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include + +/** + * @defgroup lavu_video_display Display transformation matrix functions + * @ingroup lavu_video + * + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + * + * @{ + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure clockwise + * rotation by the specified angle (in degrees). + * + * @param[out] matrix a transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param[in,out] matrix a transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/dovi_meta.h b/LedOK/ffmpeg-mac/include/libavutil/dovi_meta.h new file mode 100644 index 0000000..3d11e02 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/dovi_meta.h @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2020 Vacing Fang + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * DOVI configuration + */ + + +#ifndef AVUTIL_DOVI_META_H +#define AVUTIL_DOVI_META_H + +#include +#include +#include "rational.h" + +/* + * DOVI configuration + * ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2 + dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2 + * @code + * uint8_t dv_version_major, the major version number that the stream complies with + * uint8_t dv_version_minor, the minor version number that the stream complies with + * uint8_t dv_profile, the Dolby Vision profile + * uint8_t dv_level, the Dolby Vision level + * uint8_t rpu_present_flag + * uint8_t el_present_flag + * uint8_t bl_present_flag + * uint8_t dv_bl_signal_compatibility_id + * @endcode + * + * @note The struct must be allocated with av_dovi_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVDOVIDecoderConfigurationRecord { + uint8_t dv_version_major; + uint8_t dv_version_minor; + uint8_t dv_profile; + uint8_t dv_level; + uint8_t rpu_present_flag; + uint8_t el_present_flag; + uint8_t bl_present_flag; + uint8_t dv_bl_signal_compatibility_id; +} AVDOVIDecoderConfigurationRecord; + +/** + * Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its + * fields to default values. + * + * @return the newly allocated struct or NULL on failure + */ +AVDOVIDecoderConfigurationRecord *av_dovi_alloc(size_t *size); + +/** + * Dolby Vision RPU data header. + * + * @note sizeof(AVDOVIRpuDataHeader) is not part of the public ABI. + */ +typedef struct AVDOVIRpuDataHeader { + uint8_t rpu_type; + uint16_t rpu_format; + uint8_t vdr_rpu_profile; + uint8_t vdr_rpu_level; + uint8_t chroma_resampling_explicit_filter_flag; + uint8_t coef_data_type; /* informative, lavc always converts to fixed */ + uint8_t coef_log2_denom; + uint8_t vdr_rpu_normalized_idc; + uint8_t bl_video_full_range_flag; + uint8_t bl_bit_depth; /* [8, 16] */ + uint8_t el_bit_depth; /* [8, 16] */ + uint8_t vdr_bit_depth; /* [8, 16] */ + uint8_t spatial_resampling_filter_flag; + uint8_t el_spatial_resampling_filter_flag; + uint8_t disable_residual_flag; +} AVDOVIRpuDataHeader; + +enum AVDOVIMappingMethod { + AV_DOVI_MAPPING_POLYNOMIAL = 0, + AV_DOVI_MAPPING_MMR = 1, +}; + +/** + * Coefficients of a piece-wise function. The pieces of the function span the + * value ranges between two adjacent pivot values. + */ +#define AV_DOVI_MAX_PIECES 8 +typedef struct AVDOVIReshapingCurve { + uint8_t num_pivots; /* [2, 9] */ + uint16_t pivots[AV_DOVI_MAX_PIECES + 1]; /* sorted ascending */ + enum AVDOVIMappingMethod mapping_idc[AV_DOVI_MAX_PIECES]; + /* AV_DOVI_MAPPING_POLYNOMIAL */ + uint8_t poly_order[AV_DOVI_MAX_PIECES]; /* [1, 2] */ + int64_t poly_coef[AV_DOVI_MAX_PIECES][3]; /* x^0, x^1, x^2 */ + /* AV_DOVI_MAPPING_MMR */ + uint8_t mmr_order[AV_DOVI_MAX_PIECES]; /* [1, 3] */ + int64_t mmr_constant[AV_DOVI_MAX_PIECES]; + int64_t mmr_coef[AV_DOVI_MAX_PIECES][3/* order - 1 */][7]; +} AVDOVIReshapingCurve; + +enum AVDOVINLQMethod { + AV_DOVI_NLQ_NONE = -1, + AV_DOVI_NLQ_LINEAR_DZ = 0, +}; + +/** + * Coefficients of the non-linear inverse quantization. For the interpretation + * of these, see ETSI GS CCM 001. + */ +typedef struct AVDOVINLQParams { + uint16_t nlq_offset; + uint64_t vdr_in_max; + /* AV_DOVI_NLQ_LINEAR_DZ */ + uint64_t linear_deadzone_slope; + uint64_t linear_deadzone_threshold; +} AVDOVINLQParams; + +/** + * Dolby Vision RPU data mapping parameters. + * + * @note sizeof(AVDOVIDataMapping) is not part of the public ABI. + */ +typedef struct AVDOVIDataMapping { + uint8_t vdr_rpu_id; + uint8_t mapping_color_space; + uint8_t mapping_chroma_format_idc; + AVDOVIReshapingCurve curves[3]; /* per component */ + + /* Non-linear inverse quantization */ + enum AVDOVINLQMethod nlq_method_idc; + uint32_t num_x_partitions; + uint32_t num_y_partitions; + AVDOVINLQParams nlq[3]; /* per component */ +} AVDOVIDataMapping; + +/** + * Dolby Vision RPU colorspace metadata parameters. + * + * @note sizeof(AVDOVIColorMetadata) is not part of the public ABI. + */ +typedef struct AVDOVIColorMetadata { + uint8_t dm_metadata_id; + uint8_t scene_refresh_flag; + + /** + * Coefficients of the custom Dolby Vision IPT-PQ matrices. These are to be + * used instead of the matrices indicated by the frame's colorspace tags. + * The output of rgb_to_lms_matrix is to be fed into a BT.2020 LMS->RGB + * matrix based on a Hunt-Pointer-Estevez transform, but without any + * crosstalk. (See the definition of the ICtCp colorspace for more + * information.) + */ + AVRational ycc_to_rgb_matrix[9]; /* before PQ linearization */ + AVRational ycc_to_rgb_offset[3]; /* input offset of neutral value */ + AVRational rgb_to_lms_matrix[9]; /* after PQ linearization */ + + /** + * Extra signal metadata (see Dolby patents for more info). + */ + uint16_t signal_eotf; + uint16_t signal_eotf_param0; + uint16_t signal_eotf_param1; + uint32_t signal_eotf_param2; + uint8_t signal_bit_depth; + uint8_t signal_color_space; + uint8_t signal_chroma_format; + uint8_t signal_full_range_flag; /* [0, 3] */ + uint16_t source_min_pq; + uint16_t source_max_pq; + uint16_t source_diagonal; +} AVDOVIColorMetadata; + +/** + * Combined struct representing a combination of header, mapping and color + * metadata, for attaching to frames as side data. + * + * @note The struct must be allocated with av_dovi_metadata_alloc() and + * its size is not a part of the public ABI. + */ + +typedef struct AVDOVIMetadata { + /** + * Offset in bytes from the beginning of this structure at which the + * respective structs start. + */ + size_t header_offset; /* AVDOVIRpuDataHeader */ + size_t mapping_offset; /* AVDOVIDataMapping */ + size_t color_offset; /* AVDOVIColorMetadata */ +} AVDOVIMetadata; + +static av_always_inline AVDOVIRpuDataHeader * +av_dovi_get_header(const AVDOVIMetadata *data) +{ + return (AVDOVIRpuDataHeader *)((uint8_t *) data + data->header_offset); +} + +static av_always_inline AVDOVIDataMapping * +av_dovi_get_mapping(const AVDOVIMetadata *data) +{ + return (AVDOVIDataMapping *)((uint8_t *) data + data->mapping_offset); +} + +static av_always_inline AVDOVIColorMetadata * +av_dovi_get_color(const AVDOVIMetadata *data) +{ + return (AVDOVIColorMetadata *)((uint8_t *) data + data->color_offset); +} + +/** + * Allocate an AVDOVIMetadata structure and initialize its + * fields to default values. + * + * @param size If this parameter is non-NULL, the size in bytes of the + * allocated struct will be written here on success + * + * @return the newly allocated struct or NULL on failure + */ +AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size); + +#endif /* AVUTIL_DOVI_META_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/downmix_info.h b/LedOK/ffmpeg-mac/include/libavutil/downmix_info.h new file mode 100644 index 0000000..221cf5b --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/encryption_info.h b/LedOK/ffmpeg-mac/include/libavutil/encryption_info.h new file mode 100644 index 0000000..8fe7ebf --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/encryption_info.h @@ -0,0 +1,205 @@ +/** + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_ENCRYPTION_INFO_H +#define AVUTIL_ENCRYPTION_INFO_H + +#include +#include + +typedef struct AVSubsampleEncryptionInfo { + /** The number of bytes that are clear. */ + unsigned int bytes_of_clear_data; + + /** + * The number of bytes that are protected. If using pattern encryption, + * the pattern applies to only the protected bytes; if not using pattern + * encryption, all these bytes are encrypted. + */ + unsigned int bytes_of_protected_data; +} AVSubsampleEncryptionInfo; + +/** + * This describes encryption info for a packet. This contains frame-specific + * info for how to decrypt the packet before passing it to the decoder. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInfo { + /** The fourcc encryption scheme, in big-endian byte order. */ + uint32_t scheme; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are encrypted. + */ + uint32_t crypt_byte_block; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are clear. + */ + uint32_t skip_byte_block; + + /** + * The ID of the key used to encrypt the packet. This should always be + * 16 bytes long, but may be changed in the future. + */ + uint8_t *key_id; + uint32_t key_id_size; + + /** + * The initialization vector. This may have been zero-filled to be the + * correct block size. This should always be 16 bytes long, but may be + * changed in the future. + */ + uint8_t *iv; + uint32_t iv_size; + + /** + * An array of subsample encryption info specifying how parts of the sample + * are encrypted. If there are no subsamples, then the whole sample is + * encrypted. + */ + AVSubsampleEncryptionInfo *subsamples; + uint32_t subsample_count; +} AVEncryptionInfo; + +/** + * This describes info used to initialize an encryption key system. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInitInfo { + /** + * A unique identifier for the key system this is for, can be NULL if it + * is not known. This should always be 16 bytes, but may change in the + * future. + */ + uint8_t* system_id; + uint32_t system_id_size; + + /** + * An array of key IDs this initialization data is for. All IDs are the + * same length. Can be NULL if there are no known key IDs. + */ + uint8_t** key_ids; + /** The number of key IDs. */ + uint32_t num_key_ids; + /** + * The number of bytes in each key ID. This should always be 16, but may + * change in the future. + */ + uint32_t key_id_size; + + /** + * Key-system specific initialization data. This data is copied directly + * from the file and the format depends on the specific key system. This + * can be NULL if there is no initialization data; in that case, there + * will be at least one key ID. + */ + uint8_t* data; + uint32_t data_size; + + /** + * An optional pointer to the next initialization info in the list. + */ + struct AVEncryptionInitInfo *next; +} AVEncryptionInitInfo; + +/** + * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given + * number of subsamples. This will allocate pointers for the key ID, IV, + * and subsample entries, set the size members, and zero-initialize the rest. + * + * @param subsample_count The number of subsamples. + * @param key_id_size The number of bytes in the key ID, should be 16. + * @param iv_size The number of bytes in the IV, should be 16. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size); + +/** + * Allocates an AVEncryptionInfo structure with a copy of the given data. + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info); + +/** + * Frees the given encryption info object. This MUST NOT be used to free the + * side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_info_free(AVEncryptionInfo *info); + +/** + * Creates a copy of the AVEncryptionInfo that is contained in the given side + * data. The resulting object should be passed to av_encryption_info_free() + * when done. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * info. The resulting pointer should be either freed using av_free or given + * to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_info_add_side_data( + const AVEncryptionInfo *info, size_t *side_data_size); + + +/** + * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the + * given sizes. This will allocate pointers and set all the fields. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_alloc( + uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size); + +/** + * Frees the given encryption init info object. This MUST NOT be used to free + * the side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_init_info_free(AVEncryptionInitInfo* info); + +/** + * Creates a copy of the AVEncryptionInitInfo that is contained in the given + * side data. The resulting object should be passed to + * av_encryption_init_info_free() when done. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_get_side_data( + const uint8_t* side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * init info. The resulting pointer should be either freed using av_free or + * given to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_init_info_add_side_data( + const AVEncryptionInitInfo *info, size_t *side_data_size); + +#endif /* AVUTIL_ENCRYPTION_INFO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/error.h b/LedOK/ffmpeg-mac/include/libavutil/error.h new file mode 100644 index 0000000..0d3269a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/error.h @@ -0,0 +1,128 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +#include "macros.h" + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found +/** + * This is semantically identical to AVERROR_BUG + * it has been introduced in Libav after our AVERROR_BUG and with a modified value. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define AV_ERROR_MAX_STRING_SIZE 64 + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +/** + * Fill the provided buffer with a string containing an error string + * corresponding to the AVERROR code errnum. + * + * @param errbuf a buffer + * @param errbuf_size size in bytes of errbuf + * @param errnum error code to describe + * @return the buffer in input, filled with the error description + * @see av_strerror() + */ +static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) +{ + av_strerror(errnum, errbuf, errbuf_size); + return errbuf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_err2str(errnum) \ + av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/eval.h b/LedOK/ffmpeg-mac/include/libavutil/eval.h new file mode 100644 index 0000000..ee8cffb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/eval.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_offset log level offset, can be used to silence error messages + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_offset log level offset, can be used to silence error messages + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param e the AVExpr to evaluate + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Track the presence of variables and their number of occurrences in a parsed expression + * + * @param e the AVExpr to track variables in + * @param counter a zero-initialized array where the count of each variable will be stored + * @param size size of array + * @return 0 on success, a negative value indicates that no expression or array was passed + * or size was zero + */ +int av_expr_count_vars(AVExpr *e, unsigned *counter, int size); + +/** + * Track the presence of user provided functions and their number of occurrences + * in a parsed expression. + * + * @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. + * @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 + * or size was zero + */ +int av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/ffversion.h b/LedOK/ffmpeg-mac/include/libavutil/ffversion.h new file mode 100644 index 0000000..b722eb6 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "6.0" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/fifo.h b/LedOK/ffmpeg-mac/include/libavutil/fifo.h new file mode 100644 index 0000000..70f9376 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/fifo.h @@ -0,0 +1,448 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_fifo + * A generic FIFO API + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_fifo AVFifo + * @ingroup lavu_data + * + * @{ + * A generic FIFO API + */ + +typedef struct AVFifo AVFifo; + +/** + * Callback for writing or reading from a FIFO, passed to (and invoked from) the + * av_fifo_*_cb() functions. It may be invoked multiple times from a single + * av_fifo_*_cb() call and may process less data than the maximum size indicated + * by nb_elems. + * + * @param opaque the opaque pointer provided to the av_fifo_*_cb() function + * @param buf the buffer for reading or writing the data, depending on which + * av_fifo_*_cb function is called + * @param nb_elems On entry contains the maximum number of elements that can be + * read from / written into buf. On success, the callback should + * update it to contain the number of elements actually written. + * + * @return 0 on success, a negative error code on failure (will be returned from + * the invoking av_fifo_*_cb() function) + */ +typedef int AVFifoCB(void *opaque, void *buf, size_t *nb_elems); + +/** + * Automatically resize the FIFO on writes, so that the data fits. This + * automatic resizing happens up to a limit that can be modified with + * av_fifo_auto_grow_limit(). + */ +#define AV_FIFO_FLAG_AUTO_GROW (1 << 0) + +/** + * Allocate and initialize an AVFifo with a given element size. + * + * @param elems initial number of elements that can be stored in the FIFO + * @param elem_size Size in bytes of a single element. Further operations on + * the returned FIFO will implicitly use this element size. + * @param flags a combination of AV_FIFO_FLAG_* + * + * @return newly-allocated AVFifo on success, a negative error code on failure + */ +AVFifo *av_fifo_alloc2(size_t elems, size_t elem_size, + unsigned int flags); + +/** + * @return Element size for FIFO operations. This element size is set at + * FIFO allocation and remains constant during its lifetime + */ +size_t av_fifo_elem_size(const AVFifo *f); + +/** + * Set the maximum size (in elements) to which the FIFO can be resized + * automatically. Has no effect unless AV_FIFO_FLAG_AUTO_GROW is used. + */ +void av_fifo_auto_grow_limit(AVFifo *f, size_t max_elems); + +/** + * @return number of elements available for reading from the given FIFO. + */ +size_t av_fifo_can_read(const AVFifo *f); + +/** + * @return Number of elements that can be written into the given FIFO without + * growing it. + * + * In other words, this number of elements or less is guaranteed to fit + * into the FIFO. More data may be written when the + * AV_FIFO_FLAG_AUTO_GROW flag was specified at FIFO creation, but this + * may involve memory allocation, which can fail. + */ +size_t av_fifo_can_write(const AVFifo *f); + +/** + * Enlarge an AVFifo. + * + * On success, the FIFO will be large enough to hold exactly + * inc + av_fifo_can_read() + av_fifo_can_write() + * elements. In case of failure, the old FIFO is kept unchanged. + * + * @param f AVFifo to resize + * @param inc number of elements to allocate for, in addition to the current + * allocated size + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_grow2(AVFifo *f, size_t inc); + +/** + * Write data into a FIFO. + * + * In case nb_elems > av_fifo_can_write(f) and the AV_FIFO_FLAG_AUTO_GROW flag + * was not specified at FIFO creation, nothing is written and an error + * is returned. + * + * Calling function is guaranteed to succeed if nb_elems <= av_fifo_can_write(f). + * + * @param f the FIFO buffer + * @param buf Data to be written. nb_elems * av_fifo_elem_size(f) bytes will be + * read from buf on success. + * @param nb_elems number of elements to write into FIFO + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems); + +/** + * Write data from a user-provided callback into a FIFO. + * + * @param f the FIFO buffer + * @param read_cb Callback supplying the data to the FIFO. May be called + * multiple times. + * @param opaque opaque user data to be provided to read_cb + * @param nb_elems Should point to the maximum number of elements that can be + * written. Will be updated to contain the number of elements + * actually written. + * + * @return non-negative number on success, a negative error code on failure + */ +int av_fifo_write_from_cb(AVFifo *f, AVFifoCB read_cb, + void *opaque, size_t *nb_elems); + +/** + * Read data from a FIFO. + * + * In case nb_elems > av_fifo_can_read(f), nothing is read and an error + * is returned. + * + * @param f the FIFO buffer + * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes + * will be written into buf on success. + * @param nb_elems number of elements to read from FIFO + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems); + +/** + * Feed data from a FIFO into a user-provided callback. + * + * @param f the FIFO buffer + * @param write_cb Callback the data will be supplied to. May be called + * multiple times. + * @param opaque opaque user data to be provided to write_cb + * @param nb_elems Should point to the maximum number of elements that can be + * read. Will be updated to contain the total number of elements + * actually sent to the callback. + * + * @return non-negative number on success, a negative error code on failure + */ +int av_fifo_read_to_cb(AVFifo *f, AVFifoCB write_cb, + void *opaque, size_t *nb_elems); + +/** + * Read data from a FIFO without modifying FIFO state. + * + * Returns an error if an attempt is made to peek to nonexistent elements + * (i.e. if offset + nb_elems is larger than av_fifo_can_read(f)). + * + * @param f the FIFO buffer + * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes + * will be written into buf. + * @param nb_elems number of elements to read from FIFO + * @param offset number of initial elements to skip. + * + * @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); + +/** + * Feed data from a FIFO into a user-provided callback. + * + * @param f the FIFO buffer + * @param write_cb Callback the data will be supplied to. May be called + * multiple times. + * @param opaque opaque user data to be provided to write_cb + * @param nb_elems Should point to the maximum number of elements that can be + * read. Will be updated to contain the total number of elements + * actually sent to the callback. + * @param offset number of initial elements to skip; offset + *nb_elems must not + * be larger than av_fifo_can_read(f). + * + * @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, + size_t *nb_elems, size_t offset); + +/** + * Discard the specified amount of data from an AVFifo. + * @param size number of elements to discard, MUST NOT be larger than + * av_fifo_can_read(f) + */ +void av_fifo_drain2(AVFifo *f, size_t size); + +/* + * Empty the AVFifo. + * @param f AVFifo to reset + */ +void av_fifo_reset2(AVFifo *f); + +/** + * Free an AVFifo and reset pointer to NULL. + * @param f Pointer to an AVFifo to free. *f == NULL is allowed. + */ +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 + +/** + * @} + */ + +#endif /* AVUTIL_FIFO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/file.h b/LedOK/ffmpeg-mac/include/libavutil/file.h new file mode 100644 index 0000000..fc87a9c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/file.h @@ -0,0 +1,80 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include +#include + +#include "version.h" +#include "attributes.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * Unlike mmap this function succeeds with zero sized files, in this + * case *bufptr will be set to NULL and *size will be set to 0. + * The returned buffer must be released with av_file_unmap(). + * + * @param filename path to the file + * @param[out] bufptr pointee is set to the mapped or allocated buffer + * @param[out] size pointee is set to the size in bytes of the buffer + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param bufptr the buffer previously created with av_file_map() + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +#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/LedOK/ffmpeg-mac/include/libavutil/film_grain_params.h b/LedOK/ffmpeg-mac/include/libavutil/film_grain_params.h new file mode 100644 index 0000000..f3bd0a4 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/film_grain_params.h @@ -0,0 +1,260 @@ +/* + * 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_FILM_GRAIN_PARAMS_H +#define AVUTIL_FILM_GRAIN_PARAMS_H + +#include "frame.h" + +enum AVFilmGrainParamsType { + AV_FILM_GRAIN_PARAMS_NONE = 0, + + /** + * The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom) + */ + AV_FILM_GRAIN_PARAMS_AV1, + + /** + * The union is valid when interpreted as AVFilmGrainH274Params (codec.h274) + */ + AV_FILM_GRAIN_PARAMS_H274, +}; + +/** + * This structure describes how to handle film grain synthesis for AOM codecs. + * + * @note The struct must be allocated as part of AVFilmGrainParams using + * av_film_grain_params_alloc(). Its size is not a part of the public ABI. + */ +typedef struct AVFilmGrainAOMParams { + /** + * Number of points, and the scale and value for each point of the + * piecewise linear scaling function for the uma plane. + */ + int num_y_points; + uint8_t y_points[14][2 /* value, scaling */]; + + /** + * Signals whether to derive the chroma scaling function from the luma. + * Not equivalent to copying the luma values and scales. + */ + int chroma_scaling_from_luma; + + /** + * If chroma_scaling_from_luma is set to 0, signals the chroma scaling + * function parameters. + */ + int num_uv_points[2 /* cb, cr */]; + uint8_t uv_points[2 /* cb, cr */][10][2 /* value, scaling */]; + + /** + * Specifies the shift applied to the chroma components. For AV1, its within + * [8; 11] and determines the range and quantization of the film grain. + */ + int scaling_shift; + + /** + * Specifies the auto-regression lag. + */ + int ar_coeff_lag; + + /** + * Luma auto-regression coefficients. The number of coefficients is given by + * 2 * ar_coeff_lag * (ar_coeff_lag + 1). + */ + int8_t ar_coeffs_y[24]; + + /** + * Chroma auto-regression coefficients. The number of coefficients is given by + * 2 * ar_coeff_lag * (ar_coeff_lag + 1) + !!num_y_points. + */ + int8_t ar_coeffs_uv[2 /* cb, cr */][25]; + + /** + * Specifies the range of the auto-regressive coefficients. Values of 6, + * 7, 8 and so on represent a range of [-2, 2), [-1, 1), [-0.5, 0.5) and + * so on. For AV1 must be between 6 and 9. + */ + int ar_coeff_shift; + + /** + * Signals the down shift applied to the generated gaussian numbers during + * synthesis. + */ + int grain_scale_shift; + + /** + * Specifies the luma/chroma multipliers for the index to the component + * scaling function. + */ + int uv_mult[2 /* cb, cr */]; + int uv_mult_luma[2 /* cb, cr */]; + + /** + * Offset used for component scaling function. For AV1 its a 9-bit value + * with a range [-256, 255] + */ + int uv_offset[2 /* cb, cr */]; + + /** + * Signals whether to overlap film grain blocks. + */ + int overlap_flag; + + /** + * Signals to clip to limited color levels after film grain application. + */ + int limit_output_range; +} AVFilmGrainAOMParams; + +/** + * This structure describes how to handle film grain synthesis for codecs using + * the ITU-T H.274 Versatile suplemental enhancement information message. + * + * @note The struct must be allocated as part of AVFilmGrainParams using + * av_film_grain_params_alloc(). Its size is not a part of the public ABI. + */ +typedef struct AVFilmGrainH274Params { + /** + * Specifies the film grain simulation mode. + * 0 = Frequency filtering, 1 = Auto-regression + */ + int model_id; + + /** + * Specifies the bit depth used for the luma component. + */ + int bit_depth_luma; + + /** + * Specifies the bit depth used for the chroma components. + */ + int bit_depth_chroma; + + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + + /** + * Specifies the blending mode used to blend the simulated film grain + * with the decoded images. + * + * 0 = Additive, 1 = Multiplicative + */ + int blending_mode_id; + + /** + * Specifies a scale factor used in the film grain characterization equations. + */ + int log2_scale_factor; + + /** + * Indicates if the modelling of film grain for a given component is present. + */ + int component_model_present[3 /* y, cb, cr */]; + + /** + * Specifies the number of intensity intervals for which a specific set of + * model values has been estimated, with a range of [1, 256]. + */ + uint16_t num_intensity_intervals[3 /* y, cb, cr */]; + + /** + * Specifies the number of model values present for each intensity interval + * in which the film grain has been modelled, with a range of [1, 6]. + */ + uint8_t num_model_values[3 /* y, cb, cr */]; + + /** + * Specifies the lower ounds of each intensity interval for whichthe set of + * model values applies for the component. + */ + uint8_t intensity_interval_lower_bound[3 /* y, cb, cr */][256 /* intensity interval */]; + + /** + * Specifies the upper bound of each intensity interval for which the set of + * model values applies for the component. + */ + uint8_t intensity_interval_upper_bound[3 /* y, cb, cr */][256 /* intensity interval */]; + + /** + * Specifies the model values for the component for each intensity interval. + * - When model_id == 0, the following applies: + * For comp_model_value[y], the range of values is [0, 2^bit_depth_luma - 1] + * For comp_model_value[cb..cr], the range of values is [0, 2^bit_depth_chroma - 1] + * - Otherwise, the following applies: + * For comp_model_value[y], the range of values is [-2^(bit_depth_luma - 1), 2^(bit_depth_luma - 1) - 1] + * For comp_model_value[cb..cr], the range of values is [-2^(bit_depth_chroma - 1), 2^(bit_depth_chroma - 1) - 1] + */ + int16_t comp_model_value[3 /* y, cb, cr */][256 /* intensity interval */][6 /* model value */]; +} AVFilmGrainH274Params; + +/** + * This structure describes how to handle film grain synthesis in video + * for specific codecs. Must be present on every frame where film grain is + * meant to be synthesised for correct presentation. + * + * @note The struct must be allocated with av_film_grain_params_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVFilmGrainParams { + /** + * Specifies the codec for which this structure is valid. + */ + enum AVFilmGrainParamsType type; + + /** + * Seed to use for the synthesis process, if the codec allows for it. + * + * @note For H.264, this refers to `pic_offset` as defined in + * SMPTE RDD 5-2006. + */ + uint64_t seed; + + /** + * 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. + */ + union { + AVFilmGrainAOMParams aom; + AVFilmGrainH274Params h274; + } codec; +} AVFilmGrainParams; + +/** + * Allocate an AVFilmGrainParams structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * If size is not NULL it will be set to the number of bytes allocated. + * + * @return An AVFilmGrainParams filled with default values or NULL + * on failure. + */ +AVFilmGrainParams *av_film_grain_params_alloc(size_t *size); + +/** + * Allocate a complete AVFilmGrainParams and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVFilmGrainParams structure to be filled by caller. + */ +AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_FILM_GRAIN_PARAMS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/frame.h b/LedOK/ffmpeg-mac/include/libavutil/frame.h new file mode 100644 index 0000000..2580269 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/frame.h @@ -0,0 +1,964 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "channel_layout.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, + + /** + * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.h. + */ + AV_FRAME_DATA_S12M_TIMECODE, + + /** + * HDR dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRPlus type and contains information for color + * volume transform - application 4 of SMPTE 2094-40:2016 standard. + */ + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, + + /** + * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of + * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size. + */ + AV_FRAME_DATA_REGIONS_OF_INTEREST, + + /** + * Encoding parameters for a video frame, as described by AVVideoEncParams. + */ + AV_FRAME_DATA_VIDEO_ENC_PARAMS, + + /** + * User data unregistered metadata associated with a video frame. + * This is the H.26[45] UDU SEI message, and shouldn't be used for any other purpose + * The data is stored as uint8_t in AVFrameSideData.data which is 16 bytes of + * uuid_iso_iec_11578 followed by AVFrameSideData.size - 16 bytes of user_data_payload_byte. + */ + AV_FRAME_DATA_SEI_UNREGISTERED, + + /** + * Film grain parameters for a frame, described by AVFilmGrainParams. + * Must be present for every frame which should have film grain applied. + */ + AV_FRAME_DATA_FILM_GRAIN_PARAMS, + + /** + * Bounding boxes for object detection and classification, + * as described by AVDetectionBBoxHeader. + */ + AV_FRAME_DATA_DETECTION_BBOXES, + + /** + * Dolby Vision RPU raw data, suitable for passing to x265 + * or other libraries. Array of uint8_t, with NAL emulation + * bytes intact. + */ + AV_FRAME_DATA_DOVI_RPU_BUFFER, + + /** + * Parsed Dolby Vision metadata, suitable for passing to a software + * implementation. The payload is the AVDOVIMetadata struct defined in + * libavutil/dovi_meta.h. + */ + AV_FRAME_DATA_DOVI_METADATA, + + /** + * HDR Vivid dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRVivid type and contains information for color + * 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, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + size_t size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * Structure describing a single Region Of Interest. + * + * When multiple regions are defined in a single side-data block, they + * should be ordered from most to least important - some encoders are only + * capable of supporting a limited number of distinct regions, so will have + * to truncate the list. + * + * When overlapping regions are defined, the first region containing a given + * area of the frame applies. + */ +typedef struct AVRegionOfInterest { + /** + * Must be set to the size of this data structure (that is, + * sizeof(AVRegionOfInterest)). + */ + uint32_t self_size; + /** + * Distance in pixels from the top edge of the frame to the top and + * bottom edges and from the left edge of the frame to the left and + * right edges of the rectangle defining this region of interest. + * + * The constraints on a region are encoder dependent, so the region + * actually affected may be slightly larger for alignment or other + * reasons. + */ + int top; + int bottom; + int left; + int right; + /** + * Quantisation offset. + * + * Must be in the range -1 to +1. A value of zero indicates no quality + * change. A negative value asks for better quality (less quantisation), + * while a positive value asks for worse quality (greater quantisation). + * + * The range is calibrated so that the extreme values indicate the + * largest possible offset - if the rest of the frame is encoded with the + * worst possible quality, an offset of -1 indicates that this region + * should be encoded with the best possible quality anyway. Intermediate + * values are then interpolated in some codec-dependent way. + * + * For example, in 10-bit H.264 the quantisation parameter varies between + * -12 and 51. A typical qoffset value of -1/10 therefore indicates that + * this region should be encoded with a QP around one-tenth of the full + * range better than the rest of the frame. So, if most of the frame + * were to be encoded with a QP of around 30, this region would get a QP + * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). + * An extreme value of -1 would indicate that this region should be + * encoded with the best possible quality regardless of the treatment of + * the rest of the frame - that is, should be encoded at a QP of -12. + */ + AVRational qoffset; +} AVRegionOfInterest; + +/** + * This structure describes decoded (raw) audio or video data. + * + * AVFrame must be allocated using av_frame_alloc(). Note that this only + * allocates the AVFrame itself, the buffers for the data must be managed + * through other means (see below). + * AVFrame must be freed with av_frame_free(). + * + * AVFrame is typically allocated once and then reused multiple times to hold + * different data (e.g. a single AVFrame to hold frames received from a + * decoder). In such a case, av_frame_unref() will free any references held by + * the frame and reset it to its original clean state before it + * is reused again. + * + * The data described by an AVFrame is usually reference counted through the + * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / + * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at + * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, + * every single data plane must be contained in one of the buffers in + * AVFrame.buf or AVFrame.extended_buf. + * There may be a single buffer for all the data, or one separate buffer for + * each plane, or anything in between. + * + * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * pointer to the picture/channel planes. + * This might be different from the first allocated byte. For video, + * it could even point to the end of the image data. + * + * All pointers in data and extended_data must point into one of the + * AVBufferRef in buf or extended_buf. + * + * Some decoders access areas outside 0,0 - width,height, please + * see avcodec_align_dimensions2(). Some filters and swscale can read + * up to 16 bytes beyond the planes, if these filters are to be used, + * then 16 extra bytes must be allocated. + * + * NOTE: Pointers not needed by the format MUST be set to NULL. + * + * @attention In case of video, the data[] pointers can point to the + * end of image data in order to reverse line order, when used in + * combination with negative values in the linesize[] array. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * For video, a positive or negative value, which is typically indicating + * the size in bytes of each picture line, but it can also be: + * - the negative byte size of lines for vertical flipping + * (with data[n] pointing to the end of the data + * - a positive or negative multiple of the byte size as for accessing + * even and odd fields of a frame (possibly flipped) + * + * For audio, only linesize[0] may be set. For planar audio, each channel + * plane must be the same size. + * + * For video the linesizes should be multiples of the CPUs alignment + * preference, this is 16 or 32 for modern desktop CPUs. + * Some code requires such alignment other code can be slower without + * correct alignment, for yet other it makes no difference. + * + * @note The linesize may be larger than the size of usable data -- there + * may be extra padding present for performance reasons. + * + * @attention In case of video, line size values can be negative to achieve + * a vertically inverted iteration over image lines. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data should always be set in a valid frame, + * but for planar audio with more channels that can fit in data, + * extended_data must be used in order to access all channels. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * Time base for the timestamps in this frame. + * In the future, this field may be set on frames output by decoders or + * filters, but its value will be by default ignored on input to encoders + * or filters. + */ + AVRational time_base; + +#if FF_API_FRAME_PICTURE_NUMBER + /** + * picture number in bitstream order + */ + attribute_deprecated + int coded_picture_number; + /** + * picture number in display order + */ + attribute_deprecated + int display_picture_number; +#endif + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + +#if FF_API_REORDERED_OPAQUE + /** + * 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 + * + * @deprecated Use AV_CODEC_FLAG_COPY_OPAQUE instead + */ + attribute_deprecated + 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 + * extended_buf. This array must be filled contiguously -- if buf[i] is + * non-NULL then buf[j] must also be non-NULL for all j < i. + * + * There may be at most one AVBuffer per data plane, so for video this array + * always contains all the references. For planar audio with more than + * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in + * this array. Then the extra AVBufferRef pointers are stored in the + * extended_buf array. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * For planar audio which requires more than AV_NUM_DATA_POINTERS + * AVBufferRef pointers, this array will hold all the references which + * cannot fit into AVFrame.buf. + * + * Note that this is different from AVFrame.extended_data, which always + * contains all the pointers. This array only contains the extra pointers, + * which cannot fit into AVFrame.buf. + * + * This array is always allocated using av_malloc() by whoever constructs + * the frame. It is freed in av_frame_unref(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + +#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 + */ + attribute_deprecated + int64_t pkt_duration; +#endif + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * decode error flags of the frame, set to a combination of + * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there + * were errors during the decoding. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 +#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 +#define FF_DECODE_ERROR_DECODE_SLICES 8 + +#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 + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ + + /** + * AVBufferRef for internal use by a single libav* library. + * Must not be used to transfer data between libraries. + * Has to be NULL when ownership of the frame leaves the respective library. + * + * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. + * + * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. + * av_frame_copy_props() calls create a new reference with av_buffer_ref() + * for the target frame's private_ref field. + */ + AVBufferRef *private_ref; + + /** + * Channel layout of the audio data. + */ + AVChannelLayout ch_layout; + + /** + * Duration of the frame, in the same units as pts. 0 if unknown. + */ + int64_t duration; +} AVFrame; + + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct must be freed using av_frame_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * + * @note this only allocates the AVFrame itself, not the data buffers. Those + * must be allocated through other means, e.g. with av_frame_get_buffer() or + * manually. + */ +AVFrame *av_frame_alloc(void); + +/** + * Free the frame and any dynamically allocated objects in it, + * e.g. extended_data. If the frame is reference counted, it will be + * unreferenced first. + * + * @param frame frame to be freed. The pointer will be set to NULL. + */ +void av_frame_free(AVFrame **frame); + +/** + * Set up a new reference to the data described by the source frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src. + * + * If src is not reference counted, new buffers are allocated and the data is + * copied. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_frame_ref(AVFrame *dst, const AVFrame *src); + +/** + * Create a new frame that references the same data as src. + * + * This is a shortcut for av_frame_alloc()+av_frame_ref(). + * + * @return newly created AVFrame on success, NULL on error. + */ +AVFrame *av_frame_clone(const AVFrame *src); + +/** + * Unreference all the buffers referenced by frame and reset the frame fields. + */ +void av_frame_unref(AVFrame *frame); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +void av_frame_move_ref(AVFrame *dst, AVFrame *src); + +/** + * Allocate new buffer(s) for audio or video data. + * + * The following fields must be set on frame before calling this function: + * - format (pixel format for video, sample format for audio) + * - width and height for video + * - nb_samples and ch_layout for audio + * + * This function will fill AVFrame.data and AVFrame.buf arrays and, if + * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. + * For planar formats, one buffer will be allocated for each plane. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_frame_get_buffer(AVFrame *frame, int align); + +/** + * Check if the frame data is writable. + * + * @return A positive value if the frame data is writable (which is true if and + * only if each of the underlying buffers has only one reference, namely the one + * stored in this frame). Return 0 otherwise. + * + * If 1 is returned the answer is valid until av_buffer_ref() is called on any + * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). + * + * @see av_frame_make_writable(), av_buffer_is_writable() + */ +int av_frame_is_writable(AVFrame *frame); + +/** + * Ensure that the frame data is writable, avoiding data copy if possible. + * + * Do nothing if the frame is writable, allocate new buffers and copy the data + * if it is not. Non-refcounted frames behave as non-writable, i.e. a copy + * is always made. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_frame_is_writable(), av_buffer_is_writable(), + * av_buffer_make_writable() + */ +int av_frame_make_writable(AVFrame *frame); + +/** + * Copy the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * Copy only "metadata" fields from src to dst. + * + * Metadata for the purpose of this function are those fields that do not affect + * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample + * aspect ratio (for video), but not width/height or channel layout. + * Side data is also copied. + */ +int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Get the buffer reference a given data plane is stored in. + * + * @param frame the frame to get the plane's buffer from + * @param plane index of the data plane of interest in frame->extended_data. + * + * @return the buffer reference that contains the plane or NULL if the input + * frame is not valid. + */ +AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); + +/** + * Add a new side data to a frame. + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param size size of the side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data(AVFrame *frame, + enum AVFrameSideDataType type, + size_t size); + +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type the type of the added side data + * @param buf an AVBufferRef to add as side data. The ownership of + * the reference is transferred to the frame. + * + * @return newly added side data on success, NULL on error. On failure + * the frame is unchanged and the AVBufferRef remains owned by + * the caller. + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + +/** + * @return a pointer to the side data of a given type on success, NULL if there + * is no side data with such type in this frame. + */ +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, + enum AVFrameSideDataType type); + +/** + * Remove and free all side data instances of the given type. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hash.h b/LedOK/ffmpeg-mac/include/libavutil/hash.h new file mode 100644 index 0000000..94151de --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hash.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include +#include + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len); + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_metadata.h b/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_metadata.h new file mode 100644 index 0000000..2d72de5 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_metadata.h @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Mohammad Izadi + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H +#define AVUTIL_HDR_DYNAMIC_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Option for overlapping elliptical pixel selectors in an image. + */ +enum AVHDRPlusOverlapProcessOption { + AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, + AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, +}; + +/** + * Represents the percentile at a specific percentage in + * a distribution. + */ +typedef struct AVHDRPlusPercentile { + /** + * The percentage value corresponding to a specific percentile linearized + * RGB value in the processing window in the scene. The value shall be in + * the range of 0 to100, inclusive. + */ + uint8_t percentage; + + /** + * The linearized maxRGB value at a specific percentile in the processing + * window in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.00001. + */ + AVRational percentile; +} AVHDRPlusPercentile; + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * SMPTE 2094-40. + */ +typedef struct AVHDRPlusColorTransformParams { + /** + * The relative x coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_x; + + /** + * The relative y coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_y; + + /** + * The relative x coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_x; + + /** + * The relative y coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_y; + + /** + * The x coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (width of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_x; + + /** + * The y coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (height of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_y; + + /** + * The clockwise rotation angle in degree of arc with respect to the + * positive direction of the x-axis of the concentric internal and external + * ellipses of the elliptical pixel selector in the processing window. The + * value shall be in the range of 0 to 180, inclusive and in multiples of 1. + */ + uint8_t rotation_angle; + + /** + * The semi-major axis value of the internal ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_internal_ellipse; + + /** + * The semi-major axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value + * shall not be less than semimajor_axis_internal_ellipse of the current + * processing window. The value shall be in the range of 1 to 65535, + * inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_external_ellipse; + + /** + * The semi-minor axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semiminor_axis_external_ellipse; + + /** + * Overlap process option indicates one of the two methods of combining + * rendered pixels in the processing window in an image with at least one + * elliptical pixel selector. For overlapping elliptical pixel selectors + * in an image, overlap_process_option shall have the same value. + */ + enum AVHDRPlusOverlapProcessOption overlap_process_option; + + /** + * The maximum of the color components of linearized RGB values in the + * processing window in the scene. The values should be in the range of 0 to + * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and + * maxscl[ 2 ] are corresponding to R, G, B color components respectively. + */ + AVRational maxscl[3]; + + /** + * The average of linearized maxRGB values in the processing window in the + * scene. The value should be in the range of 0 to 1, inclusive and in + * multiples of 0.00001. + */ + AVRational average_maxrgb; + + /** + * The number of linearized maxRGB values at given percentiles in the + * processing window in the scene. The maximum value shall be 15. + */ + uint8_t num_distribution_maxrgb_percentiles; + + /** + * The linearized maxRGB values at given percentiles in the + * processing window in the scene. + */ + AVHDRPlusPercentile distribution_maxrgb[15]; + + /** + * The fraction of selected pixels in the image that contains the brightest + * pixel in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.001. + */ + AVRational fraction_bright_pixels; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + uint8_t tone_mapping_flag; + + /** + * The x coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_x; + + /** + * The y coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_y; + + /** + * The number of the intermediate anchor parameters of the tone mapping + * function in the processing window. The maximum value shall be 15. + */ + uint8_t num_bezier_curve_anchors; + + /** + * The intermediate anchor parameters of the tone mapping function in the + * processing window in the scene. The values should be in the range of 0 + * to 1, inclusive and in multiples of 1/1023. + */ + AVRational bezier_curve_anchors[15]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. Other values are reserved for future use. + */ + uint8_t color_saturation_mapping_flag; + + /** + * The color saturation gain in the processing window in the scene. The + * value shall be in the range of 0 to 63/8, inclusive and in multiples of + * 1/8. The default value shall be 1. + */ + AVRational color_saturation_weight; +} AVHDRPlusColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * application 4 of SMPTE 2094-40:2016 standard. + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_plus_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRPlus { + /** + * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. + */ + uint8_t itu_t_t35_country_code; + + /** + * Application version in the application defining document in ST-2094 + * suite. The value shall be set to 0. + */ + uint8_t application_version; + + /** + * The number of processing windows. The value shall be in the range + * of 1 to 3, inclusive. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRPlusColorTransformParams params[3]; + + /** + * The nominal maximum display luminance of the targeted system display, + * in units of 0.0001 candelas per square metre. The value shall be in + * the range of 0 to 10000, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag shall be equal to 0 in bit streams conforming to this version + * of this Specification. The value 1 is reserved for future use. + */ + uint8_t targeted_system_display_actual_peak_luminance_flag; + + /** + * The number of rows in the targeted system_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_targeted_system_display_actual_peak_luminance; + + /** + * The number of columns in the + * targeted_system_display_actual_peak_luminance array. The value shall be + * in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_targeted_system_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the targeted system display. The + * values should be in the range of 0 to 1, inclusive and in multiples of + * 1/15. + */ + AVRational targeted_system_display_actual_peak_luminance[25][25]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. The value 1 is reserved for future use. + */ + uint8_t mastering_display_actual_peak_luminance_flag; + + /** + * The number of rows in the mastering_display_actual_peak_luminance array. + * The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_mastering_display_actual_peak_luminance; + + /** + * The number of columns in the mastering_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_mastering_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the mastering display used for + * mastering the image essence. The values should be in the range of 0 to 1, + * inclusive and in multiples of 1/15. + */ + AVRational mastering_display_actual_peak_luminance[25][25]; +} AVDynamicHDRPlus; + +/** + * Allocate an AVDynamicHDRPlus structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRPlus filled with default values or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRPlus and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRPlus structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_vivid_metadata.h b/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_vivid_metadata.h new file mode 100644 index 0000000..a34f830 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hdr_dynamic_vivid_metadata.h @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2021 Limin Wang + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H +#define AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Color tone mapping parameters at a processing window in a dynamic metadata for + * CUVA 005.1:2021. + */ +typedef struct AVHDRVividColorToneMappingParams { + /** + * The nominal maximum display luminance of the targeted system display, + * in multiples of 1.0/4095 candelas per square metre. The value shall be in + * the range of 0.0 to 1.0, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag indicates that transfer the base paramter(for value of 1) + */ + int base_enable_flag; + + /** + * base_param_m_p in the base parameter, + * in multiples of 1.0/16383. The value shall be in + * the range of 0.0 to 1.0, inclusive. + */ + AVRational base_param_m_p; + + /** + * base_param_m_m in the base parameter, + * in multiples of 1.0/10. The value shall be in + * the range of 0.0 to 6.3, inclusive. + */ + AVRational base_param_m_m; + + /** + * base_param_m_a in the base parameter, + * in multiples of 1.0/1023. The value shall be in + * the range of 0.0 to 1.0 inclusive. + */ + AVRational base_param_m_a; + + /** + * base_param_m_b in the base parameter, + * in multiples of 1/1023. The value shall be in + * the range of 0.0 to 1.0, inclusive. + */ + AVRational base_param_m_b; + + /** + * base_param_m_n in the base parameter, + * in multiples of 1.0/10. The value shall be in + * the range of 0.0 to 6.3, inclusive. + */ + AVRational base_param_m_n; + + /** + * indicates k1_0 in the base parameter, + * base_param_k1 <= 1: k1_0 = base_param_k1 + * base_param_k1 > 1: reserved + */ + int base_param_k1; + + /** + * indicates k2_0 in the base parameter, + * base_param_k2 <= 1: k2_0 = base_param_k2 + * base_param_k2 > 1: reserved + */ + int base_param_k2; + + /** + * indicates k3_0 in the base parameter, + * base_param_k3 == 1: k3_0 = base_param_k3 + * base_param_k3 == 2: k3_0 = maximum_maxrgb + * base_param_k3 > 2: reserved + */ + int base_param_k3; + + /** + * This flag indicates that delta mode of base paramter(for value of 1) + */ + int base_param_Delta_enable_mode; + + /** + * base_param_Delta in the base parameter, + * in multiples of 1.0/127. The value shall be in + * the range of 0.0 to 1.0, inclusive. + */ + AVRational base_param_Delta; + + /** + * indicates 3Spline_enable_flag in the base parameter, + * This flag indicates that transfer three Spline of base paramter(for value of 1) + */ + int three_Spline_enable_flag; + + /** + * The number of three Spline. The value shall be in the range + * of 1 to 2, inclusive. + */ + int three_Spline_num; + + /** + * The mode of three Spline. the value shall be in the range + * of 0 to 3, inclusive. + */ + 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. + * + */ + 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. + */ + 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. + */ + 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. + */ + 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. + */ + AVRational three_Spline_enable_Strength; +} AVHDRVividColorToneMappingParams; + + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * CUVA 005.1:2021. + */ +typedef struct AVHDRVividColorTransformParams { + /** + * Indicates the minimum brightness of the displayed content. + * The values should be in the range of 0.0 to 1.0, + * inclusive and in multiples of 1/4095. + */ + AVRational minimum_maxrgb; + + /** + * Indicates the average brightness of the displayed content. + * The values should be in the range of 0.0 to 1.0, + * inclusive and in multiples of 1/4095. + */ + AVRational average_maxrgb; + + /** + * Indicates the variance brightness of the displayed content. + * The values should be in the range of 0.0 to 1.0, + * inclusive and in multiples of 1/4095. + */ + AVRational variance_maxrgb; + + /** + * Indicates the maximum brightness of the displayed content. + * The values should be in the range of 0.0 to 1.0, inclusive + * and in multiples of 1/4095. + */ + AVRational maximum_maxrgb; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + int tone_mapping_mode_flag; + + /** + * The number of tone mapping param. The value shall be in the range + * of 1 to 2, inclusive. + */ + int tone_mapping_param_num; + + /** + * The color tone mapping parameters. + */ + AVHDRVividColorToneMappingParams tm_params[2]; + + /** + * This flag indicates that the metadata for the color saturation mapping in + * the processing window is present (for value of 1). + */ + int color_saturation_mapping_flag; + + /** + * The number of color saturation param. The value shall be in the range + * of 0 to 7, inclusive. + */ + int color_saturation_num; + + /** + * Indicates the color correction strength parameter. + * The values should be in the range of 0.0 to 2.0, inclusive + * and in multiples of 1/128. + */ + AVRational color_saturation_gain[8]; +} AVHDRVividColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * CUVA 005.1:2021 standard + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_vivid_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRVivid { + /** + * The system start code. The value shall be set to 0x01. + */ + uint8_t system_start_code; + + /** + * The number of processing windows. The value shall be set to 0x01 + * if the system_start_code is 0x01. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRVividColorTransformParams params[3]; +} AVDynamicHDRVivid; + +/** + * Allocate an AVDynamicHDRVivid structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRVivid filled with default values or NULL + * on failure. + */ +AVDynamicHDRVivid *av_dynamic_hdr_vivid_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRVivid and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRVivid structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRVivid *av_dynamic_hdr_vivid_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hmac.h b/LedOK/ffmpeg-mac/include/libavutil/hmac.h new file mode 100644 index 0000000..ca4da6a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hmac.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2012 Martin Storsjo + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext.h new file mode 100644 index 0000000..7ff08c8 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext.h @@ -0,0 +1,610 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, + AV_HWDEVICE_TYPE_OPENCL, + AV_HWDEVICE_TYPE_MEDIACODEC, + AV_HWDEVICE_TYPE_VULKAN, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param prev AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * This function performs the same action as av_hwdevice_ctx_create_derived, + * however, it is able to set options for the new device to be derived. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param options Options for the new device to create, same format as in + * av_hwdevice_ctx_create. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, + AVDictionary *options, int flags); + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * On failure, the destination frame will be left blank, except for the + * hw_frames_ctx/format fields thay may have been set by the caller - those will + * be preserved as they were. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param format The AVPixelFormat for the derived context. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_cuda.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000..cefbe0c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,69 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + CUstream stream; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +/** + * @defgroup hwcontext_cuda Device context creation flags + * + * Flags for av_hwdevice_ctx_create. + * + * @{ + */ + +/** + * Use primary device context instead of creating a new one. + */ +#define AV_CUDA_USE_PRIMARY_CONTEXT (1 << 0) + +/** + * @} + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_d3d11va.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_d3d11va.h new file mode 100644 index 0000000..77d2d72 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,178 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; + + /** + * In case if texture structure member above is not NULL contains the same texture + * pointer for all elements and different indexes into the array texture. + * In case if texture structure member above is NULL, all elements contains + * pointers to separate non-array textures and 0 indexes. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + AVD3D11FrameDescriptor *texture_infos; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_drm.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_drm.h new file mode 100644 index 0000000..42709f2 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_drm.h @@ -0,0 +1,169 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + * + * If the format modifier is unknown then this should be set to + * DRM_FORMAT_MOD_INVALID. + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_dxva2.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_mediacodec.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_mediacodec.h new file mode 100644 index 0000000..fc0263c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_mediacodec.h @@ -0,0 +1,61 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H +#define AVUTIL_HWCONTEXT_MEDIACODEC_H + +/** + * MediaCodec details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVMediaCodecDeviceContext { + /** + * android/view/Surface handle, to be filled by the user. + * + * This is the default surface used by decoders on this device. + */ + void *surface; + + /** + * 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/LedOK/ffmpeg-mac/include/libavutil/hwcontext_opencl.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_opencl.h new file mode 100644 index 0000000..ef54486 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_opencl.h @@ -0,0 +1,100 @@ +/* + * 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_OPENCL_H +#define AVUTIL_HWCONTEXT_OPENCL_H + +#ifdef __APPLE__ +#include +#else +#include +#endif + +#include "frame.h" + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_OPENCL. + * + * Pools allocated internally are always dynamic, and are primarily intended + * to be used in OpenCL-only cases. If interoperation is required, it is + * typically required to allocate frames in the other API and then map the + * frames context to OpenCL with av_hwframe_ctx_create_derived(). + */ + +/** + * OpenCL frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + */ +typedef struct AVOpenCLFrameDescriptor { + /** + * Number of planes in the frame. + */ + int nb_planes; + /** + * OpenCL image2d objects for each plane of the frame. + */ + cl_mem planes[AV_NUM_DATA_POINTERS]; +} AVOpenCLFrameDescriptor; + +/** + * OpenCL device details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVOpenCLDeviceContext { + /** + * The primary device ID of the device. If multiple OpenCL devices + * are associated with the context then this is the one which will + * be used for all operations internal to FFmpeg. + */ + cl_device_id device_id; + /** + * The OpenCL context which will contain all operations and frames on + * this device. + */ + cl_context context; + /** + * The default command queue for this device, which will be used by all + * frames contexts which do not have their own command queue. If not + * intialised by the user, a default queue will be created on the + * primary device. + */ + cl_command_queue command_queue; +} AVOpenCLDeviceContext; + +/** + * OpenCL-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVOpenCLFramesContext { + /** + * The command queue used for internal asynchronous operations on this + * device (av_hwframe_transfer_data(), av_hwframe_map()). + * + * If this is not set, the command queue from the associated device is + * used instead. + */ + cl_command_queue command_queue; +} AVOpenCLFramesContext; + +#endif /* AVUTIL_HWCONTEXT_OPENCL_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_qsv.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000..e2dba8a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_qsv.h @@ -0,0 +1,64 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; + /** + * The mfxLoader handle used for mfxSession creation + * + * This field is only available for oneVPL user. For non-oneVPL user, this + * field must be set to NULL. + * + * Filled by the user before calling av_hwdevice_ctx_init() and should be + * cast to mfxLoader handle. Deallocating the AVHWDeviceContext will always + * release this interface. + */ + void *loader; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vaapi.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000..0b2e071 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vdpau.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000..1b7ea1e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_videotoolbox.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 0000000..25dde85 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,96 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "frame.h" +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API supports frame allocation using a native CVPixelBufferPool + * instead of an AVBufferPool. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * Note that the underlying CVPixelBuffer could be retained by OS frameworks + * 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. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +/** + * Same as av_map_videotoolbox_format_from_pixfmt function, but can map and + * return full range pixel formats via a flag. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range); + +/** + * Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc); + +/** + * Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space); + +/** + * Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri); + +/** + * Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer + * function string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc); + +/** + * Update a CVPixelBufferRef's metadata to based on an AVFrame. + * Returns 0 if no known equivalent was found. + */ +int av_vt_pixbuf_set_attachments(void *log_ctx, + CVPixelBufferRef pixbuf, const struct AVFrame *src); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vulkan.h b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vulkan.h new file mode 100644 index 0000000..df86c85 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/hwcontext_vulkan.h @@ -0,0 +1,281 @@ +/* + * 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_VULKAN_H +#define AVUTIL_HWCONTEXT_VULKAN_H + +#if defined(_WIN32) && !defined(VK_USE_PLATFORM_WIN32_KHR) +#define VK_USE_PLATFORM_WIN32_KHR +#endif +#include + +#include "pixfmt.h" +#include "frame.h" + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VULKAN. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to an AVVkFrame. + */ + +/** + * Main Vulkan context, allocated as AVHWDeviceContext.hwctx. + * All of these can be set before init to change what the context uses + */ +typedef struct AVVulkanDeviceContext { + /** + * Custom memory allocator, else NULL + */ + const VkAllocationCallbacks *alloc; + + /** + * Pointer to the instance-provided vkGetInstanceProcAddr loading function. + * If NULL, will pick either libvulkan or libvolk, depending on libavutil's + * compilation settings, and set this field. + */ + PFN_vkGetInstanceProcAddr get_proc_addr; + + /** + * Vulkan instance. Must be at least version 1.2. + */ + VkInstance inst; + + /** + * Physical device + */ + VkPhysicalDevice phys_dev; + + /** + * Active device + */ + VkDevice act_dev; + + /** + * This structure should be set to the set of features that present and enabled + * during device creation. When a device is created by FFmpeg, it will default to + * enabling all that are present of the shaderImageGatherExtended, + * fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features. + */ + VkPhysicalDeviceFeatures2 device_features; + + /** + * Enabled instance extensions. + * If supplying your own device context, set this to an array of strings, with + * each entry containing the specified Vulkan extension string to enable. + * Duplicates are possible and accepted. + * If no extensions are enabled, set these fields to NULL, and 0 respectively. + */ + const char * const *enabled_inst_extensions; + int nb_enabled_inst_extensions; + + /** + * Enabled device extensions. By default, VK_KHR_external_memory_fd, + * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier, + * VK_KHR_external_semaphore_fd and VK_EXT_external_memory_host are enabled if found. + * If supplying your own device context, these fields takes the same format as + * the above fields, with the same conditions that duplicates are possible + * and accepted, and that NULL and 0 respectively means no extensions are enabled. + */ + const char * const *enabled_dev_extensions; + int nb_enabled_dev_extensions; + + /** + * Queue family index for graphics operations, and the number of queues + * enabled for it. If unavaiable, will be set to -1. Not required. + * av_hwdevice_create() will attempt to find a dedicated queue for each + * queue family, or pick the one with the least unrelated flags set. + * Queue indices here may overlap if a queue has to share capabilities. + */ + int queue_family_index; + int nb_graphics_queues; + + /** + * Queue family index for transfer operations and the number of queues + * enabled. Required. + */ + int queue_family_tx_index; + int nb_tx_queues; + + /** + * Queue family index for compute operations and the number of queues + * enabled. Required. + */ + int queue_family_comp_index; + int nb_comp_queues; + + /** + * Queue family index for video encode ops, and the amount of queues enabled. + * If the device doesn't support such, queue_family_encode_index will be -1. + * Not required. + */ + int queue_family_encode_index; + int nb_encode_queues; + + /** + * Queue family index for video decode ops, and the amount of queues enabled. + * If the device doesn't support such, queue_family_decode_index will be -1. + * Not required. + */ + int queue_family_decode_index; + int nb_decode_queues; +} AVVulkanDeviceContext; + +/** + * Defines the behaviour of frame allocation. + */ +typedef enum AVVkFrameFlags { + /* Unless this flag is set, autodetected flags will be OR'd based on the + * 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. */ + AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY = (1ULL << 1), +} AVVkFrameFlags; + +/** + * Allocated as AVHWFramesContext.hwctx, used to set pool-specific options + */ +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. + */ + VkImageTiling tiling; + + /** + * Defines extra usage of output frames. If left as 0, the following bits + * are set: TRANSFER_SRC, TRANSFER_DST. SAMPLED and STORAGE. + */ + 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. + * Additional structures may be added at av_hwframe_ctx_init() time, + * which will be freed automatically on uninit(), so users need only free + * any structures they've allocated themselves. + */ + void *create_pnext; + + /** + * Extension data for memory allocation. Must have as many entries as + * the number of planes of the sw_format. + * This will be chained to VkExportMemoryAllocateInfo, which is used + * to make all pool images exportable to other APIs if the necessary + * extensions are present in enabled_dev_extensions. + */ + void *alloc_pnext[AV_NUM_DATA_POINTERS]; + + /** + * A combination of AVVkFrameFlags. Unless AV_VK_FRAME_FLAG_NONE is set, + * autodetected flags will be OR'd based on the device and tiling during + * av_hwframe_ctx_init(). + */ + AVVkFrameFlags flags; +} 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. + * + * @note the size of this structure is not part of the ABI, to allocate + * you must use @av_vk_frame_alloc(). + */ +typedef struct AVVkFrame { + /** + * Vulkan images to which the memory is bound to. + */ + VkImage img[AV_NUM_DATA_POINTERS]; + + /** + * The same tiling must be used for all images in 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. + */ + VkDeviceMemory mem[AV_NUM_DATA_POINTERS]; + size_t size[AV_NUM_DATA_POINTERS]; + + /** + * OR'd flags for all memory allocated + */ + VkMemoryPropertyFlagBits flags; + + /** + * Updated after every barrier + */ + VkAccessFlagBits access[AV_NUM_DATA_POINTERS]; + VkImageLayout layout[AV_NUM_DATA_POINTERS]; + + /** + * Synchronization timeline semaphores, one for each sw_format plane. + * 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. + */ + VkSemaphore sem[AV_NUM_DATA_POINTERS]; + + /** + * Up to date semaphore value at which each image becomes accessible. + * Clients must wait on this value when submitting a command queue, + * and increment it when signalling. + */ + uint64_t sem_value[AV_NUM_DATA_POINTERS]; + + /** + * Internal data. + */ + struct AVVkFrameInternal *internal; + + /** + * Describes the binding offset of each plane to the VkDeviceMemory. + */ + ptrdiff_t offset[AV_NUM_DATA_POINTERS]; +} AVVkFrame; + +/** + * Allocates a single AVVkFrame and initializes everything as 0. + * @note Must be freed via av_free() + */ +AVVkFrame *av_vk_frame_alloc(void); + +/** + * Returns the format of each image up to the number of planes for a given sw_format. + * Returns NULL on unsupported formats. + */ +const VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p); + +#endif /* AVUTIL_HWCONTEXT_VULKAN_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/imgutils.h b/LedOK/ffmpeg-mac/include/libavutil/imgutils.h new file mode 100644 index 0000000..e10ac14 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/imgutils.h @@ -0,0 +1,331 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include +#include +#include "pixdesc.h" +#include "pixfmt.h" +#include "rational.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + * @param pixdesc the AVPixFmtDescriptor for the image, describing its format + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @param pix_fmt the AVPixelFormat of the image + * @param width width of the image in pixels + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); + +/** + * Fill plane sizes for an image with pixel format pix_fmt and height height. + * + * @param size the array to be filled with the size of each image plane + * @param pix_fmt the AVPixelFormat of the image + * @param height height of the image in pixels + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return >= 0 in case of success, a negative error code otherwise + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_fill_linesizes(). + */ +int av_image_fill_plane_sizes(size_t size[4], enum AVPixelFormat pix_fmt, + int height, const ptrdiff_t linesizes[4]); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param pix_fmt the AVPixelFormat of the image + * @param height height of the image in pixels + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param pointers array to be filled with the pointer for each image plane + * @param linesizes the array filled with the linesize for each plane + * @param w width of the image in pixels + * @param h height of the image in pixels + * @param pix_fmt the AVPixelFormat of the image + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum AVPixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @param dst destination plane to copy to + * @param dst_linesize linesize for the image plane in dst + * @param src source plane to copy from + * @param src_linesize linesize for the image plane in src + * @param height height (number of lines) of the plane + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy_plane(). + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy_plane(). + * @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_plane_uc_from(uint8_t *dst, ptrdiff_t dst_linesize, + const uint8_t *src, ptrdiff_t src_linesize, + ptrdiff_t bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_data destination image data buffer to copy to + * @param dst_linesizes linesizes for the image in dst_data + * @param src_data source image data buffer to copy from + * @param src_linesizes linesizes for the image in src_data + * @param pix_fmt the AVPixelFormat of the image + * @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], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Setup the data pointers and linesizes based on the specified image + * parameters and the provided array. + * + * The fields of the given image are filled in by using the src + * address which points to the image data buffer. Depending on the + * specified pixel format, one or multiple image data pointers and + * line sizes will be set. If a planar format is specified, several + * pointers will be set pointing to the different picture planes and + * the line sizes of the different planes will be stored in the + * lines_sizes array. Call with src == NULL to get the required + * size for the src buffer. + * + * To allocate the buffer and fill in the dst_data and dst_linesize in + * one call, use av_image_alloc(). + * + * @param dst_data data pointers to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in + * @param src buffer which will contain or contains the actual image data, can be NULL + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the value used in src for linesize alignment + * @return the size in bytes required for src, a negative error code + * in case of failure + */ +int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], + const uint8_t *src, + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Return the size in bytes of the amount of data required to store an + * image with the given parameters. + * + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Copy image data from an image into a buffer. + * + * av_image_get_buffer_size() can be used to compute the required size + * for the buffer to fill. + * + * @param dst a buffer into which picture data will be copied + * @param dst_size the size in bytes of dst + * @param src_data pointers containing the source image data + * @param src_linesize linesizes for the image in src_data + * @param pix_fmt the pixel format of the source image + * @param width the width of the source image in pixels + * @param height the height of the source image in pixels + * @param align the assumed linesize alignment for dst + * @return the number of bytes written to dst, or a negative value + * (error code) on error + */ +int av_image_copy_to_buffer(uint8_t *dst, int dst_size, + const uint8_t * const src_data[4], const int src_linesize[4], + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/intfloat.h b/LedOK/ffmpeg-mac/include/libavutil/intfloat.h new file mode 100644 index 0000000..fe3d7ec --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/intreadwrite.h b/LedOK/ffmpeg-mac/include/libavutil/intreadwrite.h new file mode 100644 index 0000000..4c8413a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/intreadwrite.h @@ -0,0 +1,644 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p)) +# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v)) +#else +# define AV_RLA(s, p) AV_RN##s##A(p) +# define AV_WLA(s, p, v) AV_WN##s##A(p, v) +#endif + +#ifndef AV_RL64A +# define AV_RL64A(p) AV_RLA(64, p) +#endif +#ifndef AV_WL64A +# define AV_WL64A(p, v) AV_WLA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/lfg.h b/LedOK/ffmpeg-mac/include/libavutil/lfg.h new file mode 100644 index 0000000..e75a986 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/lfg.h @@ -0,0 +1,81 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +/** + * Context structure for the Lagged Fibonacci PRNG. + * The exact layout, types and content of this struct may change and should + * not be accessed directly. Only its `sizeof()` is guaranteed to stay the same + * to allow easy instanciation. + */ +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * @return 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + c->index += 1U; + return a; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + a = c->state[c->index & 63] = 2*a*b+a+b; + c->index += 1U; + return a; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param lfg pointer to the contex structure + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/log.h b/LedOK/ffmpeg-mac/include/libavutil/log.h new file mode 100644 index 0000000..ab7ceab --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/log.h @@ -0,0 +1,387 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "attributes.h" +#include "version.h" + +typedef enum { + AV_CLASS_CATEGORY_NA = 0, + AV_CLASS_CATEGORY_INPUT, + AV_CLASS_CATEGORY_OUTPUT, + AV_CLASS_CATEGORY_MUXER, + AV_CLASS_CATEGORY_DEMUXER, + AV_CLASS_CATEGORY_ENCODER, + AV_CLASS_CATEGORY_DECODER, + AV_CLASS_CATEGORY_FILTER, + AV_CLASS_CATEGORY_BITSTREAM_FILTER, + AV_CLASS_CATEGORY_SWSCALER, + AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +struct AVOptionRanges; + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for + * logging is stored. For example a decoder could pass its AVCodecContext + * to eval as such a parent context, which an av_log() implementation + * could then leverage to display the parent context. + * The offset can be NULL. + */ + int parent_log_context_offset; + + /** + * Category used for visualization (like color) + * This is only set if the category is equal for all objects using this class. + * available since version (51 << 16 | 56 << 8 | 100) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * Iterate over the AVClasses corresponding to potential AVOptions-enabled + * children. + * + * @param iter pointer to opaque iteration state. The caller must initialize + * *iter to NULL before the first call. + * @return AVClass for the next AVOptions-enabled child or NULL if there are + * no more such children. + * + * @note The difference between child_next and this is that child_next + * iterates over _already existing_ objects, while child_class_iterate + * iterates over _all possible_ children. + */ + const struct AVClass* (*child_class_iterate)(void **iter); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + */ +void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Send the specified message to the log once with the initial_level and then with + * the subsequent_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param initial_level importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant" for the first occurance. + * @param subsequent_level importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant" after the first occurance. + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param state a variable to keep trak of if a message has already been printed + * this must be initialized to 0 before the first use. The same state + * must not be accessed by 2 Threads simultaneously. + */ +void av_log_once(void* avcl, int initial_level, int subsequent_level, int *state, const char *fmt, ...) av_printf_format(5, 6); + + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_vlog(void *avcl, int level, const char *fmt, va_list vl); + +/** + * Get the current log level + * + * @see lavu_log_constants + * + * @return Current log level + */ +int av_log_get_level(void); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * Set the logging callback + * + * @note The callback must be thread safe, even if the application does not use + * threads itself as some codecs are multithreaded. + * + * @see av_log_default_callback + * + * @param callback A logging function with a compatible signature. + */ +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); + +/** + * Default logging callback + * + * It prints the message to stderr, optionally colorizing it. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, int level, const char *fmt, + va_list vl); + +/** + * Return the context name + * + * @param ctx The AVClass context + * + * @return The AVClass class_name + */ +const char* av_default_item_name(void* ctx); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line + * @param line_size size of the buffer + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + */ +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/lzo.h b/LedOK/ffmpeg-mac/include/libavutil/lzo.h new file mode 100644 index 0000000..c034039 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/macros.h b/LedOK/ffmpeg-mac/include/libavutil/macros.h new file mode 100644 index 0000000..2a7567c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/macros.h @@ -0,0 +1,80 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/mastering_display_metadata.h b/LedOK/ffmpeg-mac/include/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000..c23b07c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016 Neil Birkbeck + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/mathematics.h b/LedOK/ffmpeg-mac/include/libavutil/mathematics.h new file mode 100644 index 0000000..e4aff1e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/mathematics.h @@ -0,0 +1,245 @@ +/* + * copyright (c) 2005-2012 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a Operand + * @param b Operand + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * If the result is not representable then INT64_MIN is returned. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a Operand + * @param b Operand + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/md5.h b/LedOK/ffmpeg-mac/include/libavutil/md5.h new file mode 100644 index 0000000..fc2eabd --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/md5.h @@ -0,0 +1,89 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/mem.h b/LedOK/ffmpeg-mac/include/libavutil/mem.h new file mode 100644 index 0000000..62b4ca6 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/mem.h @@ -0,0 +1,609 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "avutil.h" +#include "version.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see
Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2); + +/** + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. The returned pointer must be freed after even + * if size is zero. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. The returned pointer must be freed after even if + * nmemb is zero. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. *ptr must be freed after even if nmemb is zero. + */ +int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to the size of buffer `ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. + * + * The array to grow is supposed to be an array of pointers to + * structures, and the element to add must be a pointer to an already + * allocated structure. + * + * The array is reallocated when its size reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element of size `elem_size` to a dynamic array. + * + * The array is reallocated when its number of elements reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a Operand of multiplication + * @param[in] b Operand of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow + */ +int av_size_mult(size_t a, size_t b, size_t *r); + +/** + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/motion_vector.h b/LedOK/ffmpeg-mac/include/libavutil/motion_vector.h new file mode 100644 index 0000000..ec29556 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/murmur3.h b/LedOK/ffmpeg-mac/include/libavutil/murmur3.h new file mode 100644 index 0000000..d90bc2f --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/murmur3.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include +#include + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len); + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/opt.h b/LedOK/ffmpeg-mac/include/libavutil/opt.h new file mode 100644 index 0000000..461b5d3 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/opt.h @@ -0,0 +1,891 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "channel_layout.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" + +/** + * @defgroup avoptions AVOptions + * @ingroup lavu_data + * @{ + * AVOptions provide a generic system to declare options on arbitrary structs + * ("objects"). An option can have a help text, a type and a range of possible + * values. Options may then be enumerated, read and written to. + * + * @section avoptions_implement Implementing AVOptions + * This section describes how to add AVOptions capabilities to a struct. + * + * All AVOptions-related information is stored in an AVClass. Therefore + * the first member of the struct should be a pointer to an AVClass describing it. + * The option field of the AVClass must be set to a NULL-terminated static array + * of AVOptions. Each AVOption must have a non-empty name, a type, a default + * value and for number-type AVOptions also a range of allowed values. It must + * also declare an offset in bytes from the start of the struct, where the field + * associated with this AVOption is located. Other fields in the AVOption struct + * should also be set when applicable, but are not required. + * + * The following example illustrates an AVOptions-enabled struct: + * @code + * typedef struct test_struct { + * const AVClass *class; + * int int_opt; + * char *str_opt; + * uint8_t *bin_opt; + * int bin_len; + * } test_struct; + * + * static const AVOption test_options[] = { + * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), + * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, + * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), + * AV_OPT_TYPE_STRING }, + * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), + * AV_OPT_TYPE_BINARY }, + * { NULL }, + * }; + * + * static const AVClass test_class = { + * .class_name = "test class", + * .item_name = av_default_item_name, + * .option = test_options, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * @endcode + * + * Next, when allocating your struct, you must ensure that the AVClass pointer + * is set to the correct value. Then, av_opt_set_defaults() can be called to + * initialize defaults. After that the struct is ready to be used with the + * AVOptions API. + * + * When cleaning up, you may use the av_opt_free() function to automatically + * free all the allocated string and binary options. + * + * Continuing with the above example: + * + * @code + * test_struct *alloc_test_struct(void) + * { + * test_struct *ret = av_mallocz(sizeof(*ret)); + * ret->class = &test_class; + * av_opt_set_defaults(ret); + * return ret; + * } + * void free_test_struct(test_struct **foo) + * { + * av_opt_free(*foo); + * av_freep(foo); + * } + * @endcode + * + * @subsection avoptions_implement_nesting Nesting + * It may happen that an AVOptions-enabled struct contains another + * AVOptions-enabled struct as a member (e.g. AVCodecContext in + * libavcodec exports generic options, while its priv_data field exports + * codec-specific options). In such a case, it is possible to set up the + * parent struct to export a child's options. To do that, simply + * implement AVClass.child_next() and AVClass.child_class_iterate() in the + * parent struct's AVClass. + * Assuming that the test_struct from above now also contains a + * child_struct field: + * + * @code + * typedef struct child_struct { + * AVClass *class; + * int flags_opt; + * } child_struct; + * static const AVOption child_opts[] = { + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, + * { NULL }, + * }; + * static const AVClass child_class = { + * .class_name = "child class", + * .item_name = av_default_item_name, + * .option = child_opts, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * + * void *child_next(void *obj, void *prev) + * { + * test_struct *t = obj; + * if (!prev && t->child_struct) + * return t->child_struct; + * return NULL + * } + * const AVClass child_class_iterate(void **iter) + * { + * const AVClass *c = *iter ? NULL : &child_class; + * *iter = (void*)(uintptr_t)c; + * return c; + * } + * @endcode + * Putting child_next() and child_class_iterate() as defined above into + * test_class will now make child_struct's options accessible through + * test_struct (again, proper setup as described above needs to be done on + * child_struct right after it is created). + * + * From the above example it might not be clear why both child_next() + * and child_class_iterate() are needed. The distinction is that child_next() + * iterates over actually existing objects, while child_class_iterate() + * iterates over all possible child classes. E.g. if an AVCodecContext + * was initialized to use a codec which has private options, then its + * child_next() will return AVCodecContext.priv_data and finish + * iterating. OTOH child_class_iterate() on AVCodecContext.av_class will + * iterate over all available codecs with private options. + * + * @subsection avoptions_implement_named_constants Named constants + * It is possible to create named constants for options. Simply set the unit + * field of the option the constants should apply to a string and + * create the constants themselves as options of type AV_OPT_TYPE_CONST + * with their unit field set to the same string. + * Their default_val field should contain the value of the named + * constant. + * For example, to add some named constants for the test_flags option + * above, put the following into the child_opts array: + * @code + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, + * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, + * @endcode + * + * @section avoptions_use Using AVOptions + * This section deals with accessing options in an AVOptions-enabled struct. + * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or + * AVFormatContext in libavformat. + * + * @subsection avoptions_use_examine Examining AVOptions + * The basic functions for examining options are av_opt_next(), which iterates + * over all options defined for one object, and av_opt_find(), which searches + * for an option with the given name. + * + * The situation is more complicated with nesting. An AVOptions-enabled struct + * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag + * to av_opt_find() will make the function search children recursively. + * + * For enumerating there are basically two cases. The first is when you want to + * get all options that may potentially exist on the struct and its children + * (e.g. when constructing documentation). In that case you should call + * av_opt_child_class_iterate() recursively on the parent struct's AVClass. The + * second case is when you have an already initialized struct with all its + * children and you want to get all options that can be actually written or read + * from it. In that case you should call av_opt_child_next() recursively (and + * av_opt_next() on each result). + * + * @subsection avoptions_use_get_set Reading and writing AVOptions + * When setting options, you often have a string read directly from the + * user. In such a case, simply passing it to av_opt_set() is enough. For + * non-string type options, av_opt_set() will parse the string according to the + * option type. + * + * Similarly av_opt_get() will read any option type and convert it to a string + * which will be returned. Do not forget that the string is allocated, so you + * have to free it with av_free(). + * + * In some cases it may be more convenient to put all options into an + * AVDictionary and call av_opt_set_dict() on it. A specific case of this + * are the format/codec open functions in lavf/lavc which take a dictionary + * filled with option as a parameter. This makes it possible to set some options + * that cannot be set otherwise, since e.g. the input file format is not known + * before the file is actually opened. + */ + +enum AVOptionType{ + AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_INT, + AV_OPT_TYPE_INT64, + AV_OPT_TYPE_DOUBLE, + AV_OPT_TYPE_FLOAT, + AV_OPT_TYPE_STRING, + AV_OPT_TYPE_RATIONAL, + AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + AV_OPT_TYPE_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST, + AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT, + AV_OPT_TYPE_SAMPLE_FMT, + AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational + AV_OPT_TYPE_DURATION, + AV_OPT_TYPE_COLOR, +#if FF_API_OLD_CHANNEL_LAYOUT + AV_OPT_TYPE_CHANNEL_LAYOUT, +#endif + AV_OPT_TYPE_BOOL, + AV_OPT_TYPE_CHLAYOUT, +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering +#define AV_OPT_FLAG_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 + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +/** + * Set the values of all AVOption fields to their default values. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + */ +void av_opt_set_defaults(void *s); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param opts options string to parse, may be NULL + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_opt_set() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +/** + * Parse the key-value pairs list in opts. For each key=value pair found, + * set the value of the corresponding option in ctx. + * + * @param ctx the AVClass object to set options on + * @param opts the options string, key-value pairs separated by a + * delimiter + * @param shorthand a NULL-terminated array of options names for shorthand + * notation: if the first field in opts has no key part, + * the key is taken from the first element of shorthand; + * then again for the second, etc., until either opts is + * finished, shorthand is finished or a named option is + * found; after that, all options must be named + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @return the number of successfully set key=value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + * + * Options names must use only the following characters: a-z A-Z 0-9 - . / _ + * Separators must use characters distinct from option names and from each + * other. + */ +int av_opt_set_from_string(void *ctx, const char *opts, + const char *const *shorthand, + const char *key_val_sep, const char *pairs_sep); +/** + * Free all allocated objects in obj. + */ +void av_opt_free(void *obj); + +/** + * Check whether a particular flag is set in a flags field. + * + * @param field_name the name of the flag field option + * @param flag_name the name of the flag to check + * @return non-zero if the flag is set, zero if the flag isn't set, + * isn't of the right type, or the flags field doesn't exist. + */ +int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict(void *obj, struct AVDictionary **options); + + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * Extract a key-value pair from the beginning of a string. + * + * @param ropts pointer to the options string, will be updated to + * point to the rest of the string (one of the pairs_sep + * or the final NUL) + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @param flags flags; see the AV_OPT_FLAG_* values below + * @param rkey parsed key; must be freed using av_free() + * @param rval parsed value; must be freed using av_free() + * + * @return >=0 for success, or a negative value corresponding to an + * AVERROR code in case of error; in particular: + * AVERROR(EINVAL) if no key is present + * + */ +int av_opt_get_key_value(const char **ropts, + const char *key_val_sep, const char *pairs_sep, + unsigned flags, + char **rkey, char **rval); + +enum { + + /** + * Accept to parse a value without a key; the key will then be returned + * as NULL. + */ + AV_OPT_FLAG_IMPLICIT_KEY = 1, +}; + +/** + * @defgroup opt_eval_funcs Evaluating option strings + * @{ + * This group of functions can be used to evaluate option strings + * and get numbers out of them. They do the same thing as av_opt_set(), + * except the result is written into the caller-supplied pointer. + * + * @param obj a struct whose first element is a pointer to AVClass. + * @param o an option for which the string is to be evaluated. + * @param val string to be evaluated. + * @param *_out value of the string will be written here. + * + * @return 0 on success, a negative number on failure. + */ +int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); +int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); +int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); +int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); +int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the + given object first. */ +/** + * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass + * instead of a required pointer to a struct containing AVClass. This is + * useful for searching for options without needing to allocate the corresponding + * object. + */ +#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return A pointer to the option found, or NULL if no option + * was found. + * + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable + * directly with av_opt_set(). Use special calls which take an options + * AVDictionary (e.g. avformat_open_input()) to set options found with this + * flag. + */ +const AVOption *av_opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags); + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * @param[out] target_obj if non-NULL, an object to which the option belongs will be + * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present + * in search_flags. This parameter is ignored if search_flags contain + * AV_OPT_SEARCH_FAKE_OBJ. + * + * @return A pointer to the option found, or NULL if no option + * was found. + */ +const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags, void **target_obj); + +/** + * Iterate over all AVOptions belonging to obj. + * + * @param obj an AVOptions-enabled struct or a double pointer to an + * AVClass describing it. + * @param prev result of the previous call to av_opt_next() on this object + * or NULL + * @return next AVOption or NULL + */ +const AVOption *av_opt_next(const void *obj, const AVOption *prev); + +/** + * Iterate over AVOptions-enabled children of obj. + * + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL + */ +void *av_opt_child_next(void *obj, void *prev); + +/** + * Iterate over potential AVOptions-enabled children of parent. + * + * @param 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_set_funcs Option setting functions + * @{ + * Those functions set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. In case of av_opt_set() if the field is not + * of a string type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * If the field is of a dictionary type, it has to be a ':' separated list of + * key=value parameters. Values containing ':' special characters must be + * escaped. + * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be set on a child of obj. + * + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_opt_set (void *obj, const char *name, const char *val, int search_flags); +int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); +int av_opt_set_double (void *obj, const char *name, double val, int search_flags); +int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); +int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); +int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); +int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); +#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 + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ + AVERROR(EINVAL) : \ + av_opt_set_bin(obj, name, (const uint8_t *)(val), \ + av_int_list_length(val, term) * sizeof(*(val)), flags)) + +/** + * @} + */ + +/** + * @defgroup opt_get_funcs Option getting functions + * @{ + * Those functions get a value of the option with the given name from an object. + * + * @param[in] obj a struct whose first element is a pointer to an AVClass. + * @param[in] name name of the option to get. + * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be found in a child of obj. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + */ +/** + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the + * option is of type AV_OPT_TYPE_STRING, AV_OPT_TYPE_BINARY or AV_OPT_TYPE_DICT + * and is set to NULL, *out_val will be set to NULL instead of an allocated + * empty string. + */ +int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); +int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); +int av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val); +int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); +int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); +int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); +#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 + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * Gets a pointer to the requested field in a struct. + * This function allows accessing a struct even when its fields are moved or + * renamed since the application making the access has been compiled, + * + * @returns a pointer to the field, it can be cast to the correct type and read + * or written to. + */ +void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); + +/** + * Free an AVOptionRanges struct and set it to NULL. + */ +void av_opt_freep_ranges(AVOptionRanges **ranges); + +/** + * Get a list of allowed ranges for the given option. + * + * The returned list may depend on other fields in obj like for example profile. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * 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. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/parseutils.h b/LedOK/ffmpeg-mac/include/libavutil/parseutils.h new file mode 100644 index 0000000..dad5c27 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/parseutils.h @@ -0,0 +1,197 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @file + * misc parsing utilities + */ + +/** + * Parse str and store the parsed ratio in q. + * + * Note that a ratio with infinite (1/0) or negative value is + * considered valid, so you should check on the returned value if you + * want to exclude those values. + * + * The undefined value can be expressed using the "0:0" string. + * + * @param[in,out] q pointer to the AVRational which will contain the ratio + * @param[in] str the string to parse: it has to be a string in the format + * num:den, a float number or an expression + * @param[in] max the maximum allowed numerator and denominator + * @param[in] log_offset log level offset which is applied to the log + * level of log_ctx + * @param[in] log_ctx parent logging context + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_ratio(AVRational *q, const char *str, int max, + int log_offset, void *log_ctx); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param rgba_color 4-elements array of uint8_t values, where the respective + * red, green, blue and alpha component values are written. + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @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()). Can be NULL. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +/** + * Get the name of a color from the internal table of hard-coded named + * colors. + * + * This function is meant to enumerate the color names recognized by + * av_parse_color(). + * + * @param color_idx index of the requested color, starting from 0 + * @param rgb if not NULL, will point to a 3-elements array with the color value in RGB + * @return the color name string or NULL if color_idx is not in the array + */ +const char *av_get_known_color_name(int color_idx, const uint8_t **rgb); + +/** + * Parse timestr and return in *time a corresponding number of + * microseconds. + * + * @param timeval puts here the number of microseconds corresponding + * to the string in timestr. If the string represents a duration, it + * is the number of microseconds contained in the time interval. If + * the string is a date, is the number of microseconds since 1st of + * January, 1970 up to the time of the parsed date. If timestr cannot + * be successfully parsed, set *time to INT64_MIN. + + * @param timestr a string representing a date or a duration. + * - If a date the syntax is: + * @code + * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] + * now + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * - If a duration the syntax is: + * @code + * [-][HH:]MM:SS[.m...] + * [-]S+[.m...] + * @endcode + * @param duration flag which tells how to interpret timestr, if not + * zero timestr is interpreted as a duration, otherwise as a date + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_parse_time(int64_t *timeval, const char *timestr, int duration); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * This implementation supports only a subset of the formats supported + * by the standard strptime(). + * + * The supported input field descriptors are listed below. + * - `%%H`: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - `%%J`: hours as a decimal number, in the range '0' through INT_MAX + * - `%%M`: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - `%%S`: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - `%%Y`: the year as a decimal number, using the Gregorian calendar + * - `%%m`: the month as a decimal number, in the range '1' through '12' + * - `%%d`: the day of the month as a decimal number, in the range '1' + * through '31' + * - `%%T`: alias for `%%H:%%M:%%S` + * - `%%`: a literal `%` + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/pixdesc.h b/LedOK/ffmpeg-mac/include/libavutil/pixdesc.h new file mode 100644 index 0000000..0df73e6 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/pixdesc.h @@ -0,0 +1,435 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; +} AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * If the format has 1 or 2 components, then luma is 0. + * If the format has 3 or 4 components: + * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; + * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always + * straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. Note that this is not the same as the number + * of bits per sample. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * Return the number of bits per pixel for the pixel format + * described by pixdesc, including any padding or unused bits. + */ +int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * @return a pixel format descriptor for provided pixel format or NULL if + * this pixel format is unknown. + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); + +/** + * Iterate over all pixel format descriptors known to libavutil. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); + +/** + * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc + * is not a valid pointer to a pixel format descriptor. + */ +enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); + +/** + * Utility function to access log2_chroma_w log2_chroma_h from + * the pixel format AVPixFmtDescriptor. + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format + */ +int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, + int *h_shift, int *v_shift); + +/** + * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a + * valid pixel format. + */ +int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * Converts AVChromaLocation to swscale x/y chroma position. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +int av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation pos); + +/** + * Converts swscale x/y chroma position to AVChromaLocation. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + * @param dst_element_size size of elements in dst array (2 or 4 byte) + */ +void av_read_image_line2(void *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component, + int dst_element_size); + +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + * @param src_element_size size of elements in src array (2 or 4 byte) + */ +void av_write_image_line2(const void *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int src_element_size); + +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + +/** + * Utility function to swap the endianness of a pixel format. + * + * @param[in] pix_fmt the pixel format + * + * @return pixel format with swapped endianness if it exists, + * otherwise AV_PIX_FMT_NONE + */ +enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ +#define FF_LOSS_EXCESS_RESOLUTION 0x0040 /**< loss due to unneeded extra resolution */ +#define FF_LOSS_EXCESS_DEPTH 0x0080 /**< loss due to unneeded extra color depth */ + + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/pixelutils.h b/LedOK/ffmpeg-mac/include/libavutil/pixelutils.h new file mode 100644 index 0000000..7a997cd --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/pixelutils.h @@ -0,0 +1,51 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 + +/** + * Pixel format. + * + * @note + * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * + * @par + * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB32 palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * @par + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + */ +enum AVPixelFormat { + AV_PIX_FMT_NONE = -1, + AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + AV_PIX_FMT_GRAY8, ///< Y , 8bpp + AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range + AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range + AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) + AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, + + AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian + + /** + * The following 12 formats have the disadvantage of needing 1 format for each bit depth. + * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. + * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. + */ + AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian + AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian + AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian + AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian + AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) + AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian + AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian + AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + + AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface + + AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + + AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) + + AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp + AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian + AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + * + * 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, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB, ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian + AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian + AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian + AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian + AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range + + AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples + AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples + AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples + AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples + AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian + AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian + AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian + AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian + AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian + AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian + AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian + AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian + +#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 + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + /** + * Hardware surfaces for OpenCL. + * + * data[i] contain 2D image objects (typed in C as cl_mem, used + * in OpenCL as image2d_t) for each plane of the surface. + */ + AV_PIX_FMT_OPENCL, + + AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian + AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian + + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + + AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian + AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian + + AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped + + /** + * Vulkan hardware images. + * + * data[0] points to an AVVkFrame + */ + AV_PIX_FMT_VULKAN, + + AV_PIX_FMT_Y210BE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian + AV_PIX_FMT_Y210LE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian + + AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_X2BGR10LE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_X2BGR10BE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), big-endian, X=unused/undefined + + AV_PIX_FMT_P210BE, ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, big-endian + AV_PIX_FMT_P210LE, ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, little-endian + + AV_PIX_FMT_P410BE, ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, big-endian + AV_PIX_FMT_P410LE, ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, little-endian + + AV_PIX_FMT_P216BE, ///< interleaved chroma YUV 4:2:2, 32bpp, big-endian + AV_PIX_FMT_P216LE, ///< interleaved chroma YUV 4:2:2, 32bpp, little-endian + + AV_PIX_FMT_P416BE, ///< interleaved chroma YUV 4:4:4, 48bpp, big-endian + AV_PIX_FMT_P416LE, ///< interleaved chroma YUV 4:4:4, 48bpp, little-endian + + AV_PIX_FMT_VUYA, ///< packed VUYA 4:4:4, 32bpp, VUYAVUYA... + + AV_PIX_FMT_RGBAF16BE, ///< IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., big-endian + AV_PIX_FMT_RGBAF16LE, ///< IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., little-endian + + AV_PIX_FMT_VUYX, ///< packed VUYX 4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined + + AV_PIX_FMT_P012LE, ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P012BE, ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_Y212BE, ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, big-endian + AV_PIX_FMT_Y212LE, ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, little-endian + + AV_PIX_FMT_XV30BE, ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), big-endian, variant of Y410 where alpha channel is left undefined + AV_PIX_FMT_XV30LE, ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), little-endian, variant of Y410 where alpha channel is left undefined + + AV_PIX_FMT_XV36BE, ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, big-endian, variant of Y412 where alpha channel is left undefined + AV_PIX_FMT_XV36LE, ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, little-endian, variant of Y412 where alpha channel is left undefined + + AV_PIX_FMT_RGBF32BE, ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., big-endian + AV_PIX_FMT_RGBF32LE, ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., little-endian + + 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_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE) +#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P012 AV_PIX_FMT_NE(P012BE, P012LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +#define AV_PIX_FMT_Y210 AV_PIX_FMT_NE(Y210BE, Y210LE) +#define AV_PIX_FMT_Y212 AV_PIX_FMT_NE(Y212BE, Y212LE) +#define AV_PIX_FMT_XV30 AV_PIX_FMT_NE(XV30BE, XV30LE) +#define AV_PIX_FMT_XV36 AV_PIX_FMT_NE(XV36BE, XV36LE) +#define AV_PIX_FMT_X2RGB10 AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE) +#define AV_PIX_FMT_X2BGR10 AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE) + +#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_P216 AV_PIX_FMT_NE(P216BE, P216LE) +#define AV_PIX_FMT_P416 AV_PIX_FMT_NE(P416BE, P416LE) + +#define AV_PIX_FMT_RGBAF16 AV_PIX_FMT_NE(RGBAF16BE, RGBAF16LE) + +#define AV_PIX_FMT_RGBF32 AV_PIX_FMT_NE(RGBF32BE, RGBF32LE) +#define AV_PIX_FMT_RGBAF32 AV_PIX_FMT_NE(RGBAF32BE, RGBAF32LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.1 and ITU-T H.273. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< identical to above, also called "SMPTE C" even though it uses D65 + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_EBU3213 = 22, ///< EBU Tech. 3213-E (nothing there) / one of JEDEC P22 group phosphors + AVCOL_PRI_JEDEC_P22 = AVCOL_PRI_EBU3213, + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1 + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, ///< reserved for future use by ITU-T and ISO/IEC just like 15-255 are + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above + AVCOL_SPC_SMPTE240M = 7, ///< derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries + AVCOL_SPC_YCGCO = 8, ///< used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * Visual content value range. + * + * These values are based on definitions that can be found in multiple + * specifications, such as ITU-T BT.709 (3.4 - Quantization of RGB, luminance + * and colour-difference signals), ITU-T BT.2020 (Table 5 - Digital + * Representation) as well as ITU-T BT.2100 (Table 9 - Digital 10- and 12-bit + * integer representation). At the time of writing, the BT.2100 one is + * recommended, as it also defines the full range representation. + * + * Common definitions: + * - For RGB and luma planes such as Y in YCbCr and I in ICtCp, + * 'E' is the original value in range of 0.0 to 1.0. + * - For chroma planes such as Cb,Cr and Ct,Cp, 'E' is the original + * value in range of -0.5 to 0.5. + * - 'n' is the output bit depth. + * - For additional definitions such as rounding and clipping to valid n + * bit unsigned integer range, please refer to BT.2100 (Table 9). + */ +enum AVColorRange { + AVCOL_RANGE_UNSPECIFIED = 0, + + /** + * Narrow or limited range content. + * + * - For luma planes: + * + * (219 * E + 16) * 2^(n-8) + * + * F.ex. the range of 16-235 for 8 bits + * + * - For chroma planes: + * + * (224 * E + 128) * 2^(n-8) + * + * F.ex. the range of 16-240 for 8 bits + */ + AVCOL_RANGE_MPEG = 1, + + /** + * Full range content. + * + * - For RGB and luma planes: + * + * (2^n - 1) * E + * + * F.ex. the range of 0-255 for 8 bits + * + * - For chroma planes: + * + * (2^n - 1) * E + 2^(n - 1) + * + * F.ex. the range of 1-255 for 8 bits + */ + AVCOL_RANGE_JPEG = 2, + AVCOL_RANGE_NB ///< Not part of ABI +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/random_seed.h b/LedOK/ffmpeg-mac/include/libavutil/random_seed.h new file mode 100644 index 0000000..0462a04 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/rational.h b/LedOK/ffmpeg-mac/include/libavutil/rational.h new file mode 100644 index 0000000..8cbfc8e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/rational.h @@ -0,0 +1,221 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b First rational + * @param c Second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b First rational + * @param c Second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b First rational + * @param c Second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b First rational + * @param c Second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Invert a rational. + * @param q value + * @return 1 / q + */ +static av_always_inline AVRational av_inv_q(AVRational q) +{ + AVRational r = { q.den, q.num }; + return r; +} + +/** + * Convert a double precision floating point number to a rational. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1 Rational to be tested + * @param q2 Rational to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * Return the best rational so that a and b are multiple of it. + * If the resulting denominator is larger than max_den, return def. + */ +AVRational av_gcd_q(AVRational a, AVRational b, int max_den, AVRational def); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/rc4.h b/LedOK/ffmpeg-mac/include/libavutil/rc4.h new file mode 100644 index 0000000..bf0ca6e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/rc4.h @@ -0,0 +1,69 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param d pointer to the AVRC4 context + * @param key buffer containig the key + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param d pointer to the AVRC4 context + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/replaygain.h b/LedOK/ffmpeg-mac/include/libavutil/replaygain.h new file mode 100644 index 0000000..b49bf1a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/ripemd.h b/LedOK/ffmpeg-mac/include/libavutil/ripemd.h new file mode 100644 index 0000000..9df9f90 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/ripemd.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include +#include + +#include "attributes.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/samplefmt.h b/LedOK/ffmpeg-mac/include/libavutil/samplefmt.h new file mode 100644 index 0000000..6bad0e2 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/samplefmt.h @@ -0,0 +1,269 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - The data described by the sample format is always in native-endian order. + * Sample values can be expressed by native C types, hence the lack of a signed + * 24-bit sample format even though it is a common raw audio data format. + * + * - The floating-point formats are based on full volume being in the range + * [-1.0, 1.0]. Any values outside this range are beyond full volume level. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * For planar sample formats, each audio channel is in a separate data plane, + * and linesize is the buffer size, in bytes, for a single plane. All data + * planes must be the same size. For packed sample formats, only the first data + * plane is used, and samples for each channel are interleaved. In this case, + * linesize is the buffer size, in bytes, for the 1 plane. + * + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + + AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar + AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar + AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar + AV_SAMPLE_FMT_FLTP, ///< float, planar + AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar + + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Return the planar<->packed alternative form of the given sample format, or + * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the + * requested planar/packed format, the format returned is the same as the + * input. + */ +enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); + +/** + * Get the packed alternative form of the given sample format. + * + * If the passed sample_fmt is already in packed format, the format returned is + * the same as the input. + * + * @return the packed alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Get the planar alternative form of the given sample format. + * + * If the passed sample_fmt is already in planar format, the format returned is + * the same as the input. + * + * @return the planar alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return number of bytes per sample. + * + * @param sample_fmt the sample format + * @return number of bytes per sample or zero if unknown for the given + * sample format + */ +int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); + +/** + * Check if the sample format is planar. + * + * @param sample_fmt the sample format to inspect + * @return 1 if the sample format is planar, 0 if it is interleaved + */ +int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); + +/** + * Get the required buffer size for the given audio parameters. + * + * @param[out] linesize calculated linesize, may be NULL + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return required buffer size, or negative error code on failure + */ +int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * Fill plane data pointers and linesize for samples with sample + * format sample_fmt. + * + * The audio_data array is filled with the pointers to the samples data planes: + * for planar, set the start point of each channel's data within the buffer, + * for packed, set the start point of the entire buffer only. + * + * The value pointed to by linesize is set to the aligned size of each + * channel's data buffer for planar layout, or to the aligned size of the + * buffer for all channels for packed layout. + * + * The buffer in buf must be big enough to contain all the samples + * (use av_samples_get_buffer_size() to compute its minimum size), + * otherwise the audio_data pointers will point to invalid data. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize calculated linesize, may be NULL + * @param buf the pointer to a buffer containing the samples + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return minimum size in bytes required for the buffer on success, + * or a negative error code on failure + */ +int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, + const uint8_t *buf, + int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a samples buffer for nb_samples samples, and fill data pointers and + * linesize accordingly. + * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) + * Allocated data will be initialized to silence. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize aligned size for audio buffer(s), may be NULL + * @param nb_channels number of audio channels + * @param nb_samples number of samples per channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return the size of the allocated buffer in case of success at the next bump + * @see av_samples_fill_arrays() + * @see av_samples_alloc_array_and_samples() + */ +int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a data pointers array, samples buffer for nb_samples + * samples, and fill data pointers and linesize accordingly. + * + * This is the same as av_samples_alloc(), but also allocates the data + * pointers array. + * + * @see av_samples_alloc() + */ +int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Copy samples from src to dst. + * + * @param dst destination array of pointers to data planes + * @param src source array of pointers to data planes + * @param dst_offset offset in samples at which the data will be written to dst + * @param src_offset offset in samples at which the data will be read from src + * @param nb_samples number of samples to be copied + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, + int src_offset, int nb_samples, int nb_channels, + enum AVSampleFormat sample_fmt); + +/** + * Fill an audio buffer with silence. + * + * @param audio_data array of pointers to data planes + * @param offset offset in samples at which to start filling + * @param nb_samples number of samples to fill + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, + int nb_channels, enum AVSampleFormat sample_fmt); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/sha.h b/LedOK/ffmpeg-mac/include/libavutil/sha.h new file mode 100644 index 0000000..2e1220a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/sha.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/sha512.h b/LedOK/ffmpeg-mac/include/libavutil/sha512.h new file mode 100644 index 0000000..a4a3f23 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/sha512.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/spherical.h b/LedOK/ffmpeg-mac/include/libavutil/spherical.h new file mode 100644 index 0000000..828ac83 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/spherical.h @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_video_spherical + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @defgroup lavu_video_spherical Spherical video mapping + * @ingroup lavu_video + * + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + * @{ + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/stereo3d.h b/LedOK/ffmpeg-mac/include/libavutil/stereo3d.h new file mode 100644 index 0000000..3aab959 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/stereo3d.h @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu_video_stereo3d + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @ingroup lavu_video + * + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * + * @{ + */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + +/** + * List of possible view types. + */ +enum AVStereo3DView { + /** + * Frame contains two packed views. + */ + AV_STEREO3D_VIEW_PACKED, + + /** + * Frame contains only the left view. + */ + AV_STEREO3D_VIEW_LEFT, + + /** + * Frame contains only the right view. + */ + AV_STEREO3D_VIEW_RIGHT, +}; + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; + + /** + * Determines which views are packed. + */ + enum AVStereo3DView view; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/tea.h b/LedOK/ffmpeg-mac/include/libavutil/tea.h new file mode 100644 index 0000000..dd929bd --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/threadmessage.h b/LedOK/ffmpeg-mac/include/libavutil/threadmessage.h new file mode 100644 index 0000000..42ce655 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/threadmessage.h @@ -0,0 +1,115 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with FFmpeg; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/time.h b/LedOK/ffmpeg-mac/include/libavutil/time.h new file mode 100644 index 0000000..dc169b0 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * Sleep for a period of time. Although the duration is expressed in + * microseconds, the actual delay may be rounded to the precision of the + * system timer. + * + * @param usec Number of microseconds to sleep. + * @return zero on success or (negative) error code. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/timecode.h b/LedOK/ffmpeg-mac/include/libavutil/timecode.h new file mode 100644 index 0000000..060574a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/timecode.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, multiples of 30 + * @return adjusted frame number + * @warning adjustment is only valid for multiples of NTSC 29.97 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * See SMPTE ST 314M-2005 Sec 4.4.2.2.1 "Time code pack (TC)" + * the format description as follows: + * bits 0-5: hours, in BCD(6bits) + * bits 6: BGF1 + * bits 7: BGF2 (NTSC) or FIELD (PAL) + * bits 8-14: minutes, in BCD(7bits) + * bits 15: BGF0 (NTSC) or BGF2 (PAL) + * bits 16-22: seconds, in BCD(7bits) + * bits 23: FIELD (NTSC) or BGF0 (PAL) + * bits 24-29: frames, in BCD(6bits) + * bits 30: drop frame flag (0: non drop, 1: drop) + * bits 31: color frame flag (0: unsync mode, 1: sync mode) + * @note BCD numbers (6 or 7 bits): 4 or 5 lower bits for units, 2 higher bits for tens. + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF) and binary group flags (BGF) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Convert sei info to SMPTE 12M binary representation. + * + * @param rate frame rate in rational form + * @param drop drop flag + * @param hh hour + * @param mm minute + * @param ss second + * @param ff frame number + * @return the SMPTE binary representation + */ +uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * In contrast to av_timecode_make_smpte_tc_string this function supports 50/60 + * fps timecodes by using the field bit. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param rate frame rate of the timecode + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @param skip_field prevent the use of a field flag when it is known the field + * bit is arbitrary (e.g. because it is used as PC flag) + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * 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, ... + * (see AVTimecodeFlag) + * @param hh hours + * @param mm minutes + * @param ss seconds + * @param ff frames + * @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); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/timestamp.h b/LedOK/ffmpeg-mac/include/libavutil/timestamp.h new file mode 100644 index 0000000..e082f01 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/tree.h b/LedOK/ffmpeg-mac/include/libavutil/tree.h new file mode 100644 index 0000000..bbb8fbb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/tree.h @@ -0,0 +1,137 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/twofish.h b/LedOK/ffmpeg-mac/include/libavutil/twofish.h new file mode 100644 index 0000000..67f359e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/tx.h b/LedOK/ffmpeg-mac/include/libavutil/tx.h new file mode 100644 index 0000000..064edbc --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/tx.h @@ -0,0 +1,176 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_TX_H +#define AVUTIL_TX_H + +#include +#include + +typedef struct AVTXContext AVTXContext; + +typedef struct AVComplexFloat { + float re, im; +} AVComplexFloat; + +typedef struct AVComplexDouble { + double re, im; +} AVComplexDouble; + +typedef struct AVComplexInt32 { + int32_t re, im; +} AVComplexInt32; + +enum AVTXType { + /** + * Standard complex to complex FFT with sample data type of AVComplexFloat, + * AVComplexDouble or AVComplexInt32, for each respective variant. + * + * Output is not 1/len normalized. Scaling currently unsupported. + * The stride parameter must be set to the size of a single sample in bytes. + */ + AV_TX_FLOAT_FFT = 0, + AV_TX_DOUBLE_FFT = 2, + AV_TX_INT32_FFT = 4, + + /** + * Standard MDCT with a sample data type of float, double or int32_t, + * respecively. For the float and int32 variants, the scale type is + * 'float', while for the double variant, it's 'double'. + * If scale is NULL, 1.0 will be used as a default. + * + * Length is the frame size, not the window size (which is 2x frame). + * For forward transforms, the stride specifies the spacing between each + * sample in the output array in bytes. The input must be a flat array. + * + * For inverse transforms, the stride specifies the spacing between each + * sample in the input array in bytes. The output must be a flat array. + * + * NOTE: the inverse transform is half-length, meaning the output will not + * contain redundant data. This is what most codecs work with. To do a full + * inverse transform, set the AV_TX_FULL_IMDCT flag on init. + */ + AV_TX_FLOAT_MDCT = 1, + AV_TX_DOUBLE_MDCT = 3, + AV_TX_INT32_MDCT = 5, + + /** + * Real to complex and complex to real DFTs. + * For the float and int32 variants, the scale type is 'float', while for + * the double variant, it's a 'double'. If scale is NULL, 1.0 will be used + * as a default. + * + * 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. + * + * The inverse transform performs a complex-to-real DFT of N/2+1 complex + * values to N real samples. The output is not normalized, but can be + * made so by setting the scale value to 1.0/len. + * NOTE: the inverse transform always overwrites the input. + */ + AV_TX_FLOAT_RDFT = 6, + 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, + + /* Not part of the API, do not use */ + AV_TX_NB, +}; + +/** + * Function pointer to a function to perform the transform. + * + * @note Using a different context than the one allocated during av_tx_init() + * is not allowed. + * + * @param s the transform context + * @param out the output array + * @param in the input array + * @param stride the input or output stride in bytes + * + * The out and in arrays must be aligned to the maximum required by the CPU + * architecture unless the AV_TX_UNALIGNED flag was set in av_tx_init(). + * The stride must follow the constraints the transform type has specified. + */ +typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); + +/** + * Flags for av_tx_init() + */ +enum AVTXFlags { + /** + * Allows for in-place transformations, where input == output. + * May be unsupported or slower for some transform types. + */ + AV_TX_INPLACE = 1ULL << 0, + + /** + * Relaxes alignment requirement for the in and out arrays of av_tx_fn(). + * May be slower with certain transform types. + */ + AV_TX_UNALIGNED = 1ULL << 1, + + /** + * Performs a full inverse MDCT rather than leaving out samples that can be + * derived through symmetry. Requires an output array of 'len' floats, + * rather than the usual 'len/2' floats. + * Ignored for all transforms but inverse MDCTs. + */ + AV_TX_FULL_IMDCT = 1ULL << 2, +}; + +/** + * Initialize a transform context with the given configuration + * (i)MDCTs with an odd length are currently not supported. + * + * @param ctx the context to allocate, will be NULL on error + * @param tx pointer to the transform function pointer to set + * @param type type the type of transform + * @param inv whether to do an inverse or a forward transform + * @param len the size of the transform in samples + * @param scale pointer to the value to scale the output if supported by type + * @param flags a bitmask of AVTXFlags or 0 + * + * @return 0 on success, negative error code on failure + */ +int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, + int inv, int len, const void *scale, uint64_t flags); + +/** + * Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL. + */ +void av_tx_uninit(AVTXContext **ctx); + +#endif /* AVUTIL_TX_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/uuid.h b/LedOK/ffmpeg-mac/include/libavutil/uuid.h new file mode 100644 index 0000000..748b7ed --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/uuid.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2022 Pierre-Anthony Lemieux + * Zane van Iperen + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * UUID parsing and serialization utilities. + * The library treats the UUID as an opaque sequence of 16 unsigned bytes, + * i.e. ignoring the internal layout of the UUID, which depends on the type + * of the UUID. + * + * @author Pierre-Anthony Lemieux + * @author Zane van Iperen + */ + +#ifndef AVUTIL_UUID_H +#define AVUTIL_UUID_H + +#include +#include + +#define AV_PRI_UUID \ + "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-" \ + "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" + +#define AV_PRI_URN_UUID \ + "urn:uuid:%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-" \ + "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" + +/* AV_UUID_ARG() is used together with AV_PRI_UUID() or AV_PRI_URN_UUID + * to print UUIDs, e.g. + * av_log(NULL, AV_LOG_DEBUG, "UUID: " AV_PRI_UUID, AV_UUID_ARG(uuid)); + */ +#define AV_UUID_ARG(x) \ + (x)[ 0], (x)[ 1], (x)[ 2], (x)[ 3], \ + (x)[ 4], (x)[ 5], (x)[ 6], (x)[ 7], \ + (x)[ 8], (x)[ 9], (x)[10], (x)[11], \ + (x)[12], (x)[13], (x)[14], (x)[15] + +#define AV_UUID_LEN 16 + +/* Binary representation of a UUID */ +typedef uint8_t AVUUID[AV_UUID_LEN]; + +/** + * Parses a string representation of a UUID formatted according to IETF RFC 4122 + * into an AVUUID. The parsing is case-insensitive. The string must be 37 + * characters long, including the terminating NUL character. + * + * Example string representation: "2fceebd0-7017-433d-bafb-d073a7116696" + * + * @param[in] in String representation of a UUID, + * e.g. 2fceebd0-7017-433d-bafb-d073a7116696 + * @param[out] uu AVUUID + * @return A non-zero value in case of an error. + */ +int av_uuid_parse(const char *in, AVUUID uu); + +/** + * Parses a URN representation of a UUID, as specified at IETF RFC 4122, + * into an AVUUID. The parsing is case-insensitive. The string must be 46 + * characters long, including the terminating NUL character. + * + * Example string representation: "urn:uuid:2fceebd0-7017-433d-bafb-d073a7116696" + * + * @param[in] in URN UUID + * @param[out] uu AVUUID + * @return A non-zero value in case of an error. + */ +int av_uuid_urn_parse(const char *in, AVUUID uu); + +/** + * Parses a string representation of a UUID formatted according to IETF RFC 4122 + * into an AVUUID. The parsing is case-insensitive. + * + * @param[in] in_start Pointer to the first character of the string representation + * @param[in] in_end Pointer to the character after the last character of the + * string representation. That memory location is never + * accessed. It is an error if `in_end - in_start != 36`. + * @param[out] uu AVUUID + * @return A non-zero value in case of an error. + */ +int av_uuid_parse_range(const char *in_start, const char *in_end, AVUUID uu); + +/** + * Serializes a AVUUID into a string representation according to IETF RFC 4122. + * The string is lowercase and always 37 characters long, including the + * terminating NUL character. + * + * @param[in] uu AVUUID + * @param[out] out Pointer to an array of no less than 37 characters. + */ +void av_uuid_unparse(const AVUUID uu, char *out); + +/** + * Compares two UUIDs for equality. + * + * @param[in] uu1 AVUUID + * @param[in] uu2 AVUUID + * @return Nonzero if uu1 and uu2 are identical, 0 otherwise + */ +static inline int av_uuid_equal(const AVUUID uu1, const AVUUID uu2) +{ + return memcmp(uu1, uu2, AV_UUID_LEN) == 0; +} + +/** + * Copies the bytes of src into dest. + * + * @param[out] dest AVUUID + * @param[in] src AVUUID + */ +static inline void av_uuid_copy(AVUUID dest, const AVUUID src) +{ + memcpy(dest, src, AV_UUID_LEN); +} + +/** + * Sets a UUID to the nil UUID, i.e. a UUID with have all + * its 128 bits set to zero. + * + * @param[in,out] uu UUID to be set to the nil UUID + */ +static inline void av_uuid_nil(AVUUID uu) +{ + memset(uu, 0, AV_UUID_LEN); +} + +#endif /* AVUTIL_UUID_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/version.h b/LedOK/ffmpeg-mac/include/libavutil/version.h new file mode 100644 index 0000000..e8ec604 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/version.h @@ -0,0 +1,122 @@ +/* + * copyright (c) 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + +#define LIBAVUTIL_VERSION_MAJOR 58 +#define LIBAVUTIL_VERSION_MINOR 2 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_AV_FOPEN_UTF8 (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_PKT_DURATION (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_REORDERED_OPAQUE (LIBAVUTIL_VERSION_MAJOR < 59) +#define FF_API_FRAME_PICTURE_NUMBER (LIBAVUTIL_VERSION_MAJOR < 59) + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/video_enc_params.h b/LedOK/ffmpeg-mac/include/libavutil/video_enc_params.h new file mode 100644 index 0000000..fc0c3bc --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/video_enc_params.h @@ -0,0 +1,171 @@ +/* + * 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_ENC_PARAMS_H +#define AVUTIL_VIDEO_ENC_PARAMS_H + +#include +#include + +#include "libavutil/avassert.h" +#include "libavutil/frame.h" + +enum AVVideoEncParamsType { + AV_VIDEO_ENC_PARAMS_NONE = -1, + /** + * VP9 stores: + * - per-frame base (luma AC) quantizer index, exported as AVVideoEncParams.qp + * - deltas for luma DC, chroma AC and chroma DC, exported in the + * corresponding entries in AVVideoEncParams.delta_qp + * - per-segment delta, exported as for each block as AVVideoBlockParams.delta_qp + * + * To compute the resulting quantizer index for a block: + * - for luma AC, add the base qp and the per-block delta_qp, saturating to + * unsigned 8-bit. + * - for luma DC and chroma AC/DC, add the corresponding + * AVVideoBlockParams.delta_qp to the luma AC index, again saturating to + * unsigned 8-bit. + */ + AV_VIDEO_ENC_PARAMS_VP9, + + /** + * H.264 stores: + * - in PPS (per-picture): + * * initial QP_Y (luma) value, exported as AVVideoEncParams.qp + * * delta(s) for chroma QP values (same for both, or each separately), + * exported as in the corresponding entries in AVVideoEncParams.delta_qp + * - per-slice QP delta, not exported directly, added to the per-MB value + * - per-MB delta; not exported directly; the final per-MB quantizer + * parameter - QP_Y - minus the value in AVVideoEncParams.qp is exported + * as AVVideoBlockParams.qp_delta. + */ + AV_VIDEO_ENC_PARAMS_H264, + + /* + * MPEG-2-compatible quantizer. + * + * Summing the frame-level qp with the per-block delta_qp gives the + * resulting quantizer for the block. + */ + AV_VIDEO_ENC_PARAMS_MPEG2, +}; + +/** + * Video encoding parameters for a given frame. This struct is allocated along + * with an optional array of per-block AVVideoBlockParams descriptors. + * Must be allocated with av_video_enc_params_alloc(). + */ +typedef struct AVVideoEncParams { + /** + * Number of blocks in the array. + * + * May be 0, in which case no per-block information is present. In this case + * the values of blocks_offset / block_size are unspecified and should not + * be accessed. + */ + unsigned int nb_blocks; + /** + * Offset in bytes from the beginning of this structure at which the array + * of blocks starts. + */ + size_t blocks_offset; + /* + * Size of each block in bytes. May not match sizeof(AVVideoBlockParams). + */ + size_t block_size; + + /** + * Type of the parameters (the codec they are used with). + */ + enum AVVideoEncParamsType type; + + /** + * Base quantisation parameter for the frame. The final quantiser for a + * given block in a given plane is obtained from this value, possibly + * combined with {@code delta_qp} and the per-block delta in a manner + * documented for each type. + */ + int32_t qp; + + /** + * Quantisation parameter offset from the base (per-frame) qp for a given + * plane (first index) and AC/DC coefficients (second index). + */ + int32_t delta_qp[4][2]; +} AVVideoEncParams; + +/** + * Data structure for storing block-level encoding information. + * It is allocated as a part of AVVideoEncParams and should be retrieved with + * av_video_enc_params_block(). + * + * sizeof(AVVideoBlockParams) is not a part of the ABI and new fields may be + * added to it. + */ +typedef struct AVVideoBlockParams { + /** + * Distance in luma pixels from the top-left corner of the visible frame + * to the top-left corner of the block. + * Can be negative if top/right padding is present on the coded frame. + */ + int src_x, src_y; + /** + * Width and height of the block in luma pixels. + */ + int w, h; + + /** + * Difference between this block's final quantization parameter and the + * corresponding per-frame value. + */ + int32_t delta_qp; +} AVVideoBlockParams; + +/* + * Get the block at the specified {@code idx}. Must be between 0 and nb_blocks. + */ +static av_always_inline AVVideoBlockParams* +av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx) +{ + av_assert0(idx < par->nb_blocks); + return (AVVideoBlockParams *)((uint8_t *)par + par->blocks_offset + + idx * par->block_size); +} + +/** + * Allocates memory for AVVideoEncParams of the given type, plus an array of + * {@code nb_blocks} AVVideoBlockParams and initializes the variables. Can be + * freed with a normal av_free() call. + * + * @param out_size if non-NULL, the size in bytes of the resulting data array is + * written here. + */ +AVVideoEncParams *av_video_enc_params_alloc(enum AVVideoEncParamsType type, + unsigned int nb_blocks, size_t *out_size); + +/** + * Allocates memory for AVEncodeInfoFrame plus an array of + * {@code nb_blocks} AVEncodeInfoBlock in the given AVFrame {@code frame} + * as AVFrameSideData of type AV_FRAME_DATA_VIDEO_ENC_PARAMS + * and initializes the variables. + */ +AVVideoEncParams* +av_video_enc_params_create_side_data(AVFrame *frame, enum AVVideoEncParamsType type, + unsigned int nb_blocks); + +#endif /* AVUTIL_VIDEO_ENC_PARAMS_H */ diff --git a/LedOK/ffmpeg-mac/include/libavutil/xtea.h b/LedOK/ffmpeg-mac/include/libavutil/xtea.h new file mode 100644 index 0000000..735427c --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/LedOK/ffmpeg-mac/include/libpostproc/postprocess.h b/LedOK/ffmpeg-mac/include/libpostproc/postprocess.h new file mode 100644 index 0000000..5decb7e --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libpostproc/postprocess.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "libpostproc/version.h" +#endif + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#include + +typedef void pp_context; +typedef void pp_mode; + +extern const char pp_help[]; ///< a simple help text + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/LedOK/ffmpeg-mac/include/libpostproc/version.h b/LedOK/ffmpeg-mac/include/libpostproc/version.h new file mode 100644 index 0000000..8294f00 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libpostproc/version.h @@ -0,0 +1,46 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBPOSTPROC_VERSION_MINOR 1 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#endif /* POSTPROC_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libpostproc/version_major.h b/LedOK/ffmpeg-mac/include/libpostproc/version_major.h new file mode 100644 index 0000000..771e17a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libpostproc/version_major.h @@ -0,0 +1,31 @@ +/* + * Version macros. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef POSTPROC_VERSION_MAJOR_H +#define POSTPROC_VERSION_MAJOR_H + +/** + * @file + * Libpostproc version macros + */ + +#define LIBPOSTPROC_VERSION_MAJOR 57 + +#endif /* POSTPROC_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libswresample/swresample.h b/LedOK/ffmpeg-mac/include/libswresample/swresample.h new file mode 100644 index 0000000..d4dcaeb --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswresample/swresample.h @@ -0,0 +1,650 @@ +/* + * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of libswresample + * + * libswresample is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * libswresample is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * Interaction with lswr is done through SwrContext, which is + * allocated with swr_alloc() or swr_alloc_set_opts2(). It is opaque, so all parameters + * must be set with the @ref avoptions API. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts2(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * For example the following code will setup conversion from planar float sample + * format to interleaved signed 16-bit integer, downsampling from 48kHz to + * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing + * matrix). This is using the swr_alloc() function. + * @code + * SwrContext *swr = swr_alloc(); + * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); + * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_int(swr, "in_sample_rate", 48000, 0); + * av_opt_set_int(swr, "out_sample_rate", 44100, 0); + * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); + * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + * @endcode + * + * The same job can be done using swr_alloc_set_opts2() as well: + * @code + * SwrContext *swr = NULL; + * int ret = swr_alloc_set_opts2(&swr, // we're allocating a new context + * &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @endcode + * + * Once all values have been set, it must be initialized with swr_init(). If + * you need to change the conversion parameters, you can change the parameters + * using @ref avoptions, as described above in the first example; or by using + * swr_alloc_set_opts2(), but with the first argument the allocated context. + * You must then call swr_init() again. + * + * The conversion itself is done by repeatedly calling swr_convert(). + * Note that the samples may get buffered in swr if you provide insufficient + * output space or if sample rate conversion is done, which requires "future" + * samples. Samples that do not require future input can be retrieved at any + * time by using swr_convert() (in_count can be set to 0). + * At the end of conversion the resampling buffer can be flushed by calling + * swr_convert() with NULL in and 0 in_count. + * + * The samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * The delay between input and output, can at any time be found by using + * swr_get_delay(). + * + * The following code demonstrates the conversion loop assuming the parameters + * from above and caller-defined functions get_input() and handle_output(): + * @code + * uint8_t **input; + * int in_samples; + * + * while (get_input(&input, &in_samples)) { + * uint8_t *output; + * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + + * in_samples, 44100, 48000, AV_ROUND_UP); + * av_samples_alloc(&output, NULL, 2, out_samples, + * AV_SAMPLE_FMT_S16, 0); + * out_samples = swr_convert(swr, &output, out_samples, + * input, in_samples); + * handle_output(output, out_samples); + * av_freep(&output); + * } + * @endcode + * + * When the conversion is finished, the conversion + * context and everything associated with it must be freed with swr_free(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "libswresample/version.h" +#endif + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +enum SwrDitherType { + SWR_DITHER_NONE = 0, + SWR_DITHER_RECTANGULAR, + SWR_DITHER_TRIANGULAR, + SWR_DITHER_TRIANGULAR_HIGHPASS, + + SWR_DITHER_NS = 64, ///< not part of API/ABI + SWR_DITHER_NS_LIPSHITZ, + SWR_DITHER_NS_F_WEIGHTED, + SWR_DITHER_NS_MODIFIED_E_WEIGHTED, + SWR_DITHER_NS_IMPROVED_E_WEIGHTED, + SWR_DITHER_NS_SHIBATA, + SWR_DITHER_NS_LOW_SHIBATA, + SWR_DITHER_NS_HIGH_SHIBATA, + SWR_DITHER_NB, ///< not part of API/ABI +}; + +/** Resampling Engines */ +enum SwrEngine { + SWR_ENGINE_SWR, /**< SW Resampler */ + SWR_ENGINE_SOXR, /**< SoX Resampler */ + SWR_ENGINE_NB, ///< not part of API/ABI +}; + +/** Resampling Filter Types */ +enum SwrFilterType { + SWR_FILTER_TYPE_CUBIC, /**< Cubic */ + SWR_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall windowed sinc */ + SWR_FILTER_TYPE_KAISER, /**< Kaiser windowed sinc */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * Allocate SwrContext. + * + * If you use this function you will need to set the parameters (manually or + * with swr_alloc_set_opts2()) before calling swr_init(). + * + * @see swr_alloc_set_opts2(), swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc(void); + +/** + * Initialize context after user parameters have been set. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(struct SwrContext *s); + +#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. + * + * This function does not require *ps to be allocated with swr_alloc(). On the + * other hand, swr_alloc() can use swr_alloc_set_opts2() to set the parameters + * on the allocated context. + * + * @param ps Pointer to an existing Swr context if available, or to NULL if not. + * On success, *ps will be set to the allocated context. + * @param out_ch_layout output channel layout (e.g. AV_CHANNEL_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 (e.g. AV_CHANNEL_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 0 on success, a negative AVERROR code on error. + * On error, the Swr context is freed and *ps set to NULL. + */ +int swr_alloc_set_opts2(struct SwrContext **ps, + const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, + const AVChannelLayout *in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, + int log_offset, void *log_ctx); +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** Convert audio. + * + * in and in_count can be set to 0 to flush the last few samples out at the + * end. + * + * If more input is provided than output space, then the input will be buffered. + * You can avoid this buffering by using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion will run directly without copying whenever possible. + * + * @param s allocated Swr context, with parameters set + * @param out output buffers, only the first one need be set in case of packed audio + * @param out_count amount of space available for output in samples per channel + * @param in input buffers, only the first one need to be set in case of packed audio + * @param in_count number of input samples available in one channel + * + * @return number of samples output per channel, negative value on error + */ +int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, + const uint8_t **in , int in_count); + +/** + * Convert the next timestamp from input to output + * timestamps are in 1/(in_sample_rate * out_sample_rate) units. + * + * @note There are 2 slightly differently behaving modes. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param[in] s initialized Swr context + * @param[in] pts timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +#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. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix2(const AVChannelLayout *in_layout, const AVChannelLayout *out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double maxval, + double rematrix_volume, double *matrix, + ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding, + void *log_context); + +/** + * Set a customized remix matrix. + * + * @param s allocated Swr context, not yet initialized + * @param matrix remix coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o + * @param stride offset between lines of the matrix + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_inject_silence(struct SwrContext *s, int count); + +/** + * Gets the delay the next input sample will experience relative to the next output sample. + * + * Swresample can buffer data if more input has been provided than available + * output space, also converting between sample rates needs a delay. + * This function returns the sum of all such delays. + * The exact delay is not necessarily an integer value in either input or + * output sample rate. Especially when downsampling by a large value, the + * output sample rate may be a poor choice to represent the delay, similarly + * for upsampling and the input sample rate. + * + * @param s swr context + * @param base timebase in which the returned delay will be: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param out output AVFrame + * @param in input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/LedOK/ffmpeg-mac/include/libswresample/version.h b/LedOK/ffmpeg-mac/include/libswresample/version.h new file mode 100644 index 0000000..31ecf6f --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswresample/version.h @@ -0,0 +1,46 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * libswresample is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBSWRESAMPLE_VERSION_MINOR 10 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libswresample/version_major.h b/LedOK/ffmpeg-mac/include/libswresample/version_major.h new file mode 100644 index 0000000..7f265c2 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswresample/version_major.h @@ -0,0 +1,31 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * libswresample is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_MAJOR_H +#define SWRESAMPLE_VERSION_MAJOR_H + +/** + * @file + * Libswresample version macros + */ + +#define LIBSWRESAMPLE_VERSION_MAJOR 4 + +#endif /* SWRESAMPLE_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/include/libswscale/swscale.h b/LedOK/ffmpeg-mac/include/libswscale/swscale.h new file mode 100644 index 0000000..9d4612a --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswscale/swscale.h @@ -0,0 +1,436 @@ +/* + * Copyright (C) 2001-2011 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version_major.h" +#ifndef HAVE_AV_CONFIG_H +/* When included as part of the ffmpeg build, only include the major version + * to avoid unnecessary rebuilds. When included externally, keep including + * the full version information. */ +#include "version.h" +#endif + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * Return the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Return the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Return the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * Return a pointer to yuv<->rgb coefficients for the given colorspace + * suitable for sws_setColorspaceDetails(). + * + * @param colorspace One of the SWS_CS_* macros. If invalid, + * SWS_CS_DEFAULT is used. + */ +const int *sws_getCoefficients(int colorspace); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Return a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum AVPixelFormat pix_fmt); + +/** + * Return a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); + +/** + * @param[in] pix_fmt the pixel format + * @return a positive value if an endianness conversion for pix_fmt is + * supported, 0 otherwise. + */ +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); + +/** + * Allocate an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initialize the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +av_warn_unused_result +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Free the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +/** + * Allocate and return an SwsContext. You need it to perform + * scaling/conversion operations using sws_scale(). + * + * @param srcW the width of the source image + * @param srcH the height of the source image + * @param srcFormat the source image format + * @param dstW the width of the destination image + * @param dstH the height of the destination image + * @param dstFormat the destination image format + * @param flags specify which algorithm and options to use for rescaling + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @return a pointer to an allocated context, or NULL in case of error + * @note this function is to be removed after a saner alternative is + * written + */ +struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Scale the image slice in srcSlice and put the resulting scaled + * slice in the image in dst. A slice is a sequence of consecutive + * rows in an image. + * + * Slices have to be provided in sequential order, either in + * top-bottom or bottom-top order. If slices are provided in + * non-sequential order the behavior of the function is undefined. + * + * @param c the scaling context previously created with + * sws_getContext() + * @param srcSlice the array containing the pointers to the planes of + * the source slice + * @param srcStride the array containing the strides for each plane of + * the source image + * @param srcSliceY the position in the source image of the slice to + * process, that is the number (counted starting from + * zero) in the image of the first row of the slice + * @param srcSliceH the height of the source slice, that is the number + * of rows in the slice + * @param dst the array containing the pointers to the planes of + * the destination image + * @param dstStride the array containing the strides for each plane of + * the destination image + * @return the height of the output slice + */ +int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], + const int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *const dst[], const int dstStride[]); + +/** + * Scale source data from src and write the output to dst. + * + * This is merely a convenience wrapper around + * - sws_frame_start() + * - sws_send_slice(0, src->height) + * - sws_receive_slice(0, dst->height) + * - sws_frame_end() + * + * @param c The scaling context + * @param dst The destination frame. See documentation for sws_frame_start() for + * more details. + * @param src The source frame. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int sws_scale_frame(struct SwsContext *c, AVFrame *dst, const AVFrame *src); + +/** + * Initialize the scaling process for a given pair of source/destination frames. + * Must be called before any calls to sws_send_slice() and sws_receive_slice(). + * + * This function will retain references to src and dst, so they must both use + * refcounted buffers (if allocated by the caller, in case of dst). + * + * @param c The scaling context + * @param dst The destination frame. + * + * The data buffers may either be already allocated by the caller or + * left clear, in which case they will be allocated by the scaler. + * The latter may have performance advantages - e.g. in certain cases + * some output planes may be references to input planes, rather than + * copies. + * + * Output data will be written into this frame in successful + * sws_receive_slice() calls. + * @param src The source frame. The data buffers must be allocated, but the + * frame data does not have to be ready at this point. Data + * availability is then signalled by sws_send_slice(). + * @return 0 on success, a negative AVERROR code on failure + * + * @see sws_frame_end() + */ +int sws_frame_start(struct SwsContext *c, AVFrame *dst, const AVFrame *src); + +/** + * Finish the scaling process for a pair of source/destination frames previously + * submitted with sws_frame_start(). Must be called after all sws_send_slice() + * and sws_receive_slice() calls are done, before any new sws_frame_start() + * calls. + * + * @param c The scaling context + */ +void sws_frame_end(struct SwsContext *c); + +/** + * Indicate that a horizontal slice of input data is available in the source + * frame previously provided to sws_frame_start(). The slices may be provided in + * any order, but may not overlap. For vertically subsampled pixel formats, the + * slices must be aligned according to subsampling. + * + * @param c The scaling context + * @param slice_start first row of the slice + * @param slice_height number of rows in the slice + * + * @return a non-negative number on success, a negative AVERROR code on failure. + */ +int sws_send_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height); + +/** + * Request a horizontal slice of the output data to be written into the frame + * previously provided to sws_frame_start(). + * + * @param c The scaling context + * @param slice_start first row of the slice; must be a multiple of + * sws_receive_slice_alignment() + * @param slice_height number of rows in the slice; must be a multiple of + * sws_receive_slice_alignment(), except for the last slice + * (i.e. when slice_start+slice_height is equal to output + * frame height) + * + * @return a non-negative number if the data was successfully written into the output + * AVERROR(EAGAIN) if more input data needs to be provided before the + * output can be produced + * another negative AVERROR code on other kinds of scaling failure + */ +int sws_receive_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height); + +/** + * Get the alignment required for slices + * + * @param c The scaling context + * @return alignment required for output slices requested with sws_receive_slice(). + * Slice offsets and sizes passed to sws_receive_slice() must be + * multiples of the value returned from this function. + */ +unsigned int sws_receive_slice_alignment(const struct SwsContext *c); + +/** + * @param c the scaling context + * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) + * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) + * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] + * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] + * @param brightness 16.16 fixed point brightness correction + * @param contrast 16.16 fixed point contrast correction + * @param saturation 16.16 fixed point saturation correction + * + * @return A negative error code on error, non negative otherwise. + * If `LIBSWSCALE_VERSION_MAJOR < 7`, returns -1 if not supported. + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return A negative error code on error, non negative otherwise. + * If `LIBSWSCALE_VERSION_MAJOR < 7`, returns -1 if not supported. + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocate and return an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Return a normalized Gaussian curve used to filter stuff + * quality = 3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Scale all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scale all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Check if context can be reused, otherwise reallocate a new one. + * + * If context is NULL, just calls sws_getContext() to get a new + * context. Otherwise, checks if the parameters are the ones already + * saved in context. If that is the case, returns the current + * context. Otherwise, frees context and gets a new context with + * the new parameters. + * + * Be warned that srcFilter and dstFilter are not checked, they + * are assumed to remain the same. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. + * + * The output frame will have the same packed format as the palette. + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. + * + * With the palette format "ABCD", the destination frame ends up with the format "ABC". + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Get the AVClass for swsContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *sws_get_class(void); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/LedOK/ffmpeg-mac/include/libswscale/version.h b/LedOK/ffmpeg-mac/include/libswscale/version.h new file mode 100644 index 0000000..4e54701 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswscale/version.h @@ -0,0 +1,44 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#include "version_major.h" + +#define LIBSWSCALE_VERSION_MINOR 1 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +#endif /* SWSCALE_VERSION_H */ diff --git a/LedOK/ffmpeg-mac/include/libswscale/version_major.h b/LedOK/ffmpeg-mac/include/libswscale/version_major.h new file mode 100644 index 0000000..88577a2 --- /dev/null +++ b/LedOK/ffmpeg-mac/include/libswscale/version_major.h @@ -0,0 +1,35 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWSCALE_VERSION_MAJOR_H +#define SWSCALE_VERSION_MAJOR_H + +/** + * @file + * swscale version macros + */ + +#define LIBSWSCALE_VERSION_MAJOR 7 + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* SWSCALE_VERSION_MAJOR_H */ diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libavcodec.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libavcodec.pc new file mode 100644 index 0000000..944f823 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libavcodec.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libavcodec +Description: FFmpeg codec library +Version: 60.3.100 +Requires: +Requires.private: libswresample >= 4.10.100, libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lavcodec +Libs.private: -L/usr/local/Cellar/libvpx/1.13.0/lib -lvpx -lm -L/usr/local/Cellar/libvpx/1.13.0/lib -lvpx -lm -L/usr/local/Cellar/libvpx/1.13.0/lib -lvpx -lm -L/usr/local/Cellar/libvpx/1.13.0/lib -lvpx -lm -L/usr/local/Cellar/webp/1.3.0/lib -lwebpmux -lwebp -lsharpyuv -liconv -lm -llzma -L/usr/local/Cellar/aribb24/1.0.4/lib -laribb24 -L/usr/local/Cellar/dav1d/1.1.0/lib -ldav1d -lopencore-amrwb -lsnappy -lstdc++ -framework AudioToolbox -L/usr/local/Cellar/jpeg-xl/0.8.1_2/lib -L/usr/local/Cellar/libvmaf/2.3.1/lib -L/usr/local/Cellar/aom/3.6.0/lib -laom -lvmaf -ljxl -lmp3lame -lm -lopencore-amrnb -L/usr/local/Cellar/openjpeg/2.5.0/lib -lopenjp2 -L/usr/local/Cellar/opus/1.3.1/lib -lopus -L/usr/local/Cellar/rav1e/0.6.4/lib -lrav1e -L/usr/local/Cellar/speex/1.2.1/lib -lspeex -L/usr/local/Cellar/svt-av1/1.4.1/lib -lSvtAv1Enc -ltheoraenc -ltheoradec -logg -L/usr/local/Cellar/libvorbis/1.3.7/lib -lvorbis -L/usr/local/Cellar/libvorbis/1.3.7/lib -lvorbisenc -L/usr/local/Cellar/webp/1.3.0/lib -lwebp -lsharpyuv -L/usr/local/Cellar/x264/r3095/lib -lx264 -L/usr/local/Cellar/x265/3.5/lib -lx265 -lxvidcore -pthread -lz -framework VideoToolbox -framework CoreFoundation -framework CoreMedia -framework CoreVideo -framework CoreServices +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libavdevice.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libavdevice.pc new file mode 100644 index 0000000..e2650a2 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libavdevice.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libavdevice +Description: FFmpeg device handling library +Version: 60.1.100 +Requires: +Requires.private: libavfilter >= 9.3.100, libswscale >= 7.1.100, libpostproc >= 57.1.100, libavformat >= 60.3.100, libavcodec >= 60.3.100, libswresample >= 4.10.100, libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lavdevice +Libs.private: -framework Foundation -framework AudioToolbox -framework CoreAudio -lm -framework AVFoundation -framework CoreVideo -framework CoreMedia -framework CoreGraphics -L/usr/local/Cellar/libxcb/1.15_1/lib -lxcb -L/usr/local/Cellar/libxcb/1.15_1/lib -lxcb-shm -L/usr/local/Cellar/libxcb/1.15_1/lib -lxcb-shape -L/usr/local/Cellar/libxcb/1.15_1/lib -lxcb-xfixes -framework AudioToolbox -pthread -L/usr/local/lib -lSDL2 +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libavfilter.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libavfilter.pc new file mode 100644 index 0000000..e96546f --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libavfilter.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libavfilter +Description: FFmpeg audio/video filtering library +Version: 9.3.100 +Requires: +Requires.private: libswscale >= 7.1.100, libpostproc >= 57.1.100, libavformat >= 60.3.100, libavcodec >= 60.3.100, libswresample >= 4.10.100, libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lavfilter +Libs.private: -framework OpenGL -framework OpenGL -pthread -lm -L/usr/local/Cellar/libsamplerate/0.2.2/lib -L/usr/local/Cellar/rubberband/3.2.1/lib -lrubberband -framework Accelerate -lsamplerate -lstdc++ -L/usr/local/Cellar/libvmaf/2.3.1/lib -lvmaf -L/usr/local/Cellar/tesseract/5.3.1/lib -L/usr/local/Cellar/libarchive/3.6.2_1/lib -ltesseract -larchive -lcurl -L/usr/local/Cellar/libass/0.17.1/lib -lass -L/usr/local/Cellar/libvidstab/1.1.1/lib -lvidstab -lm -framework Metal -framework VideoToolbox -L/usr/local/Cellar/zeromq/4.3.4/lib -lzmq -L/usr/local/Cellar/zimg/3.0.4/lib -lzimg -framework CoreImage -framework AppKit -L/usr/local/opt/freetype/lib -L/usr/local/Cellar/fontconfig/2.14.2/lib -lfontconfig -lfreetype -L/usr/local/opt/freetype/lib -lfreetype -framework CoreFoundation -framework CoreMedia -framework CoreVideo -framework CoreServices +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libavformat.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libavformat.pc new file mode 100644 index 0000000..fc2c01a --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libavformat.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libavformat +Description: FFmpeg container format library +Version: 60.3.100 +Requires: +Requires.private: libavcodec >= 60.3.100, libswresample >= 4.10.100, libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lavformat +Libs.private: -lm -lxml2 -lbz2 -L/usr/local/Cellar/libbluray/1.3.4/lib -lbluray -lz -L/usr/local/Cellar/gnutls/3.8.0/lib -lgnutls -L/usr/local/Cellar/librist/0.2.7_3/lib -lrist -L/usr/local/Cellar/srt/1.5.1/lib -lsrt -L/usr/local/Cellar/zeromq/4.3.4/lib -lzmq +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libavutil.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libavutil.pc new file mode 100644 index 0000000..f917fa0 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libavutil.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libavutil +Description: FFmpeg utility library +Version: 58.2.100 +Requires: +Requires.private: +Conflicts: +Libs: -L${libdir} -lavutil +Libs.private: -pthread -lm -framework VideoToolbox -L/usr/local/Cellar/libx11/1.8.4/lib -lX11 -framework CoreFoundation -framework CoreMedia -framework CoreVideo -framework CoreServices +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libpostproc.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libpostproc.pc new file mode 100644 index 0000000..b935ec2 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libpostproc.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libpostproc +Description: FFmpeg postprocessing library +Version: 57.1.100 +Requires: +Requires.private: libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lpostproc +Libs.private: -lm +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libswresample.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libswresample.pc new file mode 100644 index 0000000..1712591 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libswresample.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libswresample +Description: FFmpeg audio resampling library +Version: 4.10.100 +Requires: +Requires.private: libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lswresample +Libs.private: -lm -lsoxr +Cflags: -I${includedir} diff --git a/LedOK/ffmpeg-mac/lib/pkgconfig/libswscale.pc b/LedOK/ffmpeg-mac/lib/pkgconfig/libswscale.pc new file mode 100644 index 0000000..563eb23 --- /dev/null +++ b/LedOK/ffmpeg-mac/lib/pkgconfig/libswscale.pc @@ -0,0 +1,14 @@ +prefix=/usr/local/Cellar/ffmpeg/6.0 +exec_prefix=${prefix} +libdir=/usr/local/Cellar/ffmpeg/6.0/lib +includedir=/usr/local/Cellar/ffmpeg/6.0/include + +Name: libswscale +Description: FFmpeg image rescaling library +Version: 7.1.100 +Requires: +Requires.private: libavutil >= 58.2.100 +Conflicts: +Libs: -L${libdir} -lswscale +Libs.private: -lm +Cflags: -I${includedir} diff --git a/LedOK/gutil/qgui.h b/LedOK/gutil/qgui.h index 4412faa..59b56da 100644 --- a/LedOK/gutil/qgui.h +++ b/LedOK/gutil/qgui.h @@ -259,12 +259,6 @@ public: obj->setFont(font); return *this; } - inline Wrp& font(int size){ - QFont font = obj->font(); - font.setPointSize(size); - obj->setFont(font); - return *this; - } inline Wrp& width(int w){ obj->setFixedWidth(w); diff --git a/LedOK/mainwindow.cpp b/LedOK/mainwindow.cpp index ae40d11..b160ace 100644 --- a/LedOK/mainwindow.cpp +++ b/LedOK/mainwindow.cpp @@ -1,5 +1,4 @@ #include "mainwindow.h" -#include "base/aboutdlg.h" #include "base/softconfigdialog.h" #include "gutil/qgui.h" #include "cfg.h" @@ -184,7 +183,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { auto label = new QLabel(tr("CurVersion")+": "+APP_VERSION); auto font = label->font(); - font.setPointSize(14); + font.setPixelSize(18); label->setFont(font); vBox->addWidget(label); @@ -244,7 +243,42 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { act_about = new QAction(tr("About")); connect(act_about, &QAction::triggered, this, [this] { - AboutDlg dlg(this); + QDialog dlg(this); + dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, false); + dlg.setWindowTitle(tr("About")); + + auto hBox = new HBox(&dlg); + hBox->setContentsMargins(24, 24, 24, 24); + hBox->setSpacing(24); + + auto label = new QLabel; + label->setPixmap(QPixmap(":/res/Logo.png")); + hBox->addWidget(label); + + auto vBox = new VBox(hBox); + + label = new QLabel("LedOK Express"); + label->setAlignment(Qt::AlignCenter); + auto font = label->font(); + font.setPixelSize(30); + label->setFont(font); + vBox->addWidget(label); + + label = new QLabel(APP_VERSION); + font = label->font(); + font.setPixelSize(18); + label->setFont(font); + label->setAlignment(Qt::AlignCenter); + vBox->addWidget(label); + + label = new QLabel("www.ledok.cn"); + font = label->font(); + font.setPixelSize(20); + label->setFont(font); + label->setAlignment(Qt::AlignCenter); + label->setOpenExternalLinks(true); + vBox->addWidget(label); + dlg.exec(); }); menu_setting->addAction(act_about); diff --git a/LedOK/program/eaclock.cpp b/LedOK/program/eaclock.cpp index 413e2e2..169aa01 100644 --- a/LedOK/program/eaclock.cpp +++ b/LedOK/program/eaclock.cpp @@ -178,7 +178,7 @@ void EAClock::drawMarkNumber(QPainter *painter, const QPointF &pos, const QColor { QRectF rect(pos.x()-len/2, pos.y()-len/2, len, len); QFont font("Arial"); - font.setPointSizeF(len*0.75); + font.setPixelSize(round(len)); QTextOption opt; opt.setAlignment(Qt::AlignCenter); painter->save(); @@ -533,7 +533,8 @@ QWidget* EAClock::attrWgt() { fdFontFamily->setEditable(false); fdFontFamily->setCurrentText(m_attr.textFont.family()); connect(fdFontFamily, &QFontComboBox::currentFontChanged, this, [this](const QFont &font) { - QFont newFont(font.family(), m_attr.textFont.pointSize()); + QFont newFont(font.family()); + newFont.setPixelSize(m_attr.textFont.pixelSize()); newFont.setBold(m_attr.textFont.bold()); newFont.setItalic(m_attr.textFont.italic()); newFont.setUnderline(m_attr.textFont.underline()); @@ -544,9 +545,9 @@ QWidget* EAClock::attrWgt() { auto fdFontSize = new QSpinBox(); fdFontSize->setRange(4, 9999); - fdFontSize->setValue(m_attr.textFont.pointSize()); + fdFontSize->setValue(m_attr.textFont.pixelSize()); connect(fdFontSize, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { - m_attr.textFont.setPointSize(value); + m_attr.textFont.setPixelSize(value); update(); }); hBox->addWidget(fdFontSize); @@ -677,7 +678,7 @@ QJsonObject EAClock::attrJson() const { widget["secHandColor"] = m_attr.secHandColor.name(); widget["text"] = m_attr.text; widget["textFontFamily"] = m_attr.textFont.family(); - widget["textFontSize"] = m_attr.textFont.pointSize(); + widget["textFontSize"] = m_attr.textFont.pixelSize(); widget["textFontBold"] = m_attr.textFont.bold(); widget["textFontItalics"] = m_attr.textFont.italic(); widget["textFontUnderline"] = m_attr.textFont.underline(); diff --git a/LedOK/program/edclock.cpp b/LedOK/program/edclock.cpp index a63fb8d..050debb 100644 --- a/LedOK/program/edclock.cpp +++ b/LedOK/program/edclock.cpp @@ -355,7 +355,8 @@ QWidget* EDClock::attrWgt() { fdFontFamily->setEditable(false); fdFontFamily->setCurrentText(m_attr.font.family()); connect(fdFontFamily, &QFontComboBox::currentFontChanged, this, [this](const QFont &f) { - QFont font(f.family(), m_attr.font.pointSize()); + QFont font(f.family()); + font.setPixelSize(m_attr.font.pixelSize()); font.setBold(m_attr.font.bold()); font.setItalic(m_attr.font.italic()); font.setUnderline(m_attr.font.underline()); @@ -366,9 +367,9 @@ QWidget* EDClock::attrWgt() { auto fdFontSize = new QSpinBox(); fdFontSize->setRange(4, 9999); - fdFontSize->setValue(m_attr.font.pointSize()); + fdFontSize->setValue(m_attr.font.pixelSize()); connect(fdFontSize, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { - m_attr.font.setPointSize(value); + m_attr.font.setPixelSize(value); update(); }); hBox->addWidget(fdFontSize); @@ -471,7 +472,7 @@ QJsonObject EDClock::attrJson() const{ oWidget["multiline"] = m_attr.multiline; oWidget["font"] = QJsonObject{ {"family", m_attr.font.family()}, - {"size", m_attr.font.pointSize()}, + {"size", m_attr.font.pixelSize()}, {"bold", m_attr.font.bold()}, {"italics", m_attr.font.italic()}, {"underline", m_attr.font.underline()}, diff --git a/LedOK/program/eenviron.cpp b/LedOK/program/eenviron.cpp index 4a92384..9bbb31d 100644 --- a/LedOK/program/eenviron.cpp +++ b/LedOK/program/eenviron.cpp @@ -577,7 +577,7 @@ QWidget* EEnviron::attrWgt() { fdFontFamily->setEditable(false); fdFontFamily->setCurrentText(m_attr.font.family()); connect(fdFontFamily, &QFontComboBox::currentFontChanged, this, [this](const QFont &f) { - QFont font(f.family(), m_attr.font.pointSize()); + QFont font(f.family(), m_attr.font.pixelSize()); font.setBold(m_attr.font.bold()); font.setItalic(m_attr.font.italic()); font.setUnderline(m_attr.font.underline()); @@ -589,9 +589,9 @@ QWidget* EEnviron::attrWgt() { auto fdFontSize = new QSpinBox(); fdFontSize->setRange(4, 9999); - fdFontSize->setValue(m_attr.font.pointSize()); + fdFontSize->setValue(m_attr.font.pixelSize()); connect(fdFontSize, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { - m_attr.font.setPointSize(value); + m_attr.font.setPixelSize(value); calAttr(); update(); }); @@ -730,7 +730,7 @@ QJsonObject EEnviron::attrJson() const{ oWidget["scrollSpeed"] = m_attr.scrollSpeed; oWidget["alignType"] = m_attr.align; oWidget["fontFamily"] = m_attr.font.family(); - oWidget["fontSize"] = m_attr.font.pointSize(); + oWidget["fontSize"] = m_attr.font.pixelSize(); oWidget["fontBold"] = m_attr.font.bold(); oWidget["fontItalics"] = m_attr.font.italic(); oWidget["fontUnderline"] = m_attr.font.underline(); diff --git a/LedOK/program/etimer.cpp b/LedOK/program/etimer.cpp index 3163e32..90e4de9 100644 --- a/LedOK/program/etimer.cpp +++ b/LedOK/program/etimer.cpp @@ -219,7 +219,8 @@ QWidget* ETimer::attrWgt() { fdFont->setCurrentText(attr.font.family()); fdFont->setEditable(false); connect(fdFont, &QFontComboBox::currentFontChanged, this, [this](const QFont &f) { - QFont font(f.family(), attr.font.pointSize()); + QFont font(f.family()); + font.setPixelSize(attr.font.pixelSize()); font.setBold(attr.font.bold()); font.setItalic(attr.font.italic()); font.setUnderline(attr.font.underline()); @@ -230,9 +231,9 @@ QWidget* ETimer::attrWgt() { auto fdFontSize = new QSpinBox(); fdFontSize->setRange(4, 9999); - fdFontSize->setValue(attr.font.pointSize()); + fdFontSize->setValue(attr.font.pixelSize()); connect(fdFontSize, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { - attr.font.setPointSize(value); + attr.font.setPixelSize(value); update(); }); hBox->addWidget(fdFontSize); @@ -340,7 +341,7 @@ QJsonObject ETimer::attrJson() const { obj["text"] = attr.text; obj["isMultiline"] = attr.isMultiline; obj["font"] = attr.font.family(); - obj["fontSize"] = attr.font.pointSize(); + obj["fontSize"] = attr.font.pixelSize(); obj["fontBold"] = attr.font.bold(); obj["fontItalic"] = attr.font.italic(); obj["fontUnderline"] = attr.font.underline(); diff --git a/LedOK/program/gentmpthread.cpp b/LedOK/program/gentmpthread.cpp index 49bdf6e..f184d4c 100644 --- a/LedOK/program/gentmpthread.cpp +++ b/LedOK/program/gentmpthread.cpp @@ -570,7 +570,7 @@ QJsonObject GenTmpThread::convertTimer(const QJsonObject &json) { font.setItalic(json["fontItalic"].toBool()); font.setUnderline(json["fontUnderline"].toBool()); oRes["font"] = font.family(); - oRes["fontSize"] = font.pointSize(); + oRes["fontSize"] = font.pixelSize(); oRes["fontBold"] = font.bold(); oRes["fontItalic"] = font.italic(); oRes["fontUnderline"] = font.underline(); diff --git a/LedOK/program/pageeditor.cpp b/LedOK/program/pageeditor.cpp index 5cedf72..794cb50 100644 --- a/LedOK/program/pageeditor.cpp +++ b/LedOK/program/pageeditor.cpp @@ -1,20 +1,6 @@ #include "pageeditor.h" -#include "cfg.h" -#include "globaldefine.h" #include "tools.h" -#include "program/eaclock.h" -#include "program/eaudio.h" -#include "program/ebase.h" -#include "program/edclock.h" -#include "program/eenviron.h" -#include "program/egif.h" -#include "program/emultiwin.h" -#include "program/ephoto.h" -#include "program/etext.h" -#include "program/etimer.h" -#include "program/evideo.h" -#include "program/eweb.h" -#include "program/pagelistitem.h" +#include "ebase.h" #include #include #include @@ -32,7 +18,9 @@ PageEditor::PageEditor(QWidget *parent) : QWidget(parent) { toolBar->addSeparator(); auto actScaleUp = new QAction(QIcon(":/res/program/ScaleUp.png"), tr("Zoom In")); toolBar->addAction(actScaleUp); //放大 - connect(actScaleUp, &QAction::triggered, this, &PageEditor::onScaleUp); + connect(actScaleUp, &QAction::triggered, this, [this] { + onScale(10); + }); fdScale = new QLabel("100"); QPalette pal; @@ -45,7 +33,9 @@ PageEditor::PageEditor(QWidget *parent) : QWidget(parent) { auto actScaleDown = new QAction(QIcon(":/res/program/ScaleDown.png"), tr("Zoom Out")); toolBar->addAction(actScaleDown);//缩小 - connect(actScaleDown, &QAction::triggered, this, &PageEditor::onScaleDown); + connect(actScaleDown, &QAction::triggered, this, [this] { + onScale(-10); + }); QAction *actScaleOrg = new QAction(QIcon(":/res/program/ScaleOrg.png"), tr("Original size")); connect(actScaleOrg, &QAction::triggered, this, [this] { @@ -127,8 +117,8 @@ void PageEditor::keyReleaseEvent(QKeyEvent *event) { } } void PageEditor::wheelEvent(QWheelEvent *e) { - if(e->angleDelta().y()>0) onScaleUp(); - else onScaleDown(); + qDebug()<<"angleDelta"<angleDelta().y()<<"pixelDelta"<pixelDelta().y(); + onScale(e->angleDelta().y() / 2); } QList PageEditor::sortedEles() { @@ -151,17 +141,11 @@ EBase* PageEditor::getElementSelected(){ return static_cast(selectedItems.at(0)); } -void PageEditor::onScaleUp() { - if(curScale > 790) return; - curScale += 10; - fdScale->setText(QString::number(curScale)); - graphicsView->resetTransform(); - qreal scale = curScale / 100.0; - graphicsView->scale(scale, scale); -} -void PageEditor::onScaleDown() { - if(curScale < 20) return; - curScale -= 10; +void PageEditor::onScale(int angle) { + if(angle>0) { + if(curScale >= 800) return; + } else if(curScale <= 10) return; + curScale += angle; fdScale->setText(QString::number(curScale)); graphicsView->resetTransform(); qreal scale = curScale / 100.0; diff --git a/LedOK/program/pageeditor.h b/LedOK/program/pageeditor.h index b4ec597..b7e53f7 100644 --- a/LedOK/program/pageeditor.h +++ b/LedOK/program/pageeditor.h @@ -24,8 +24,7 @@ signals: void scaleChanged(int); public slots: - void onScaleUp(); - void onScaleDown(); + void onScale(int); void onDelete(); void onClean(); void onLayerUp(); diff --git a/LedOK/program/pagelistitem.cpp b/LedOK/program/pagelistitem.cpp index 8c56443..7412139 100644 --- a/LedOK/program/pagelistitem.cpp +++ b/LedOK/program/pagelistitem.cpp @@ -16,7 +16,6 @@ #include "program/eweb.h" #include "program/etimer.h" #include "program/emultiwin.h" -#include "globaldefine.h" #include #include #include diff --git a/LedOK/test.cpp b/LedOK/test.cpp deleted file mode 100644 index ab501b4..0000000 --- a/LedOK/test.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include -#include - -void testFont() { - QFont font("Arial", 21); - //font.setItalic(m_attr.fontItalics); - font.setStyleStrategy(QFont::NoAntialias); - QFontMetricsF metric(font); - QFontMetrics metricI(font); - qDebug()<<"QFontMetrics"; - qDebug()<<" leading"< -#include -class TestWin : public QWidget { -public: - TestWin(){ - resize(400, 100); - auto hBox = new QHBoxLayout(this); - hBox->setContentsMargins(100,0,0,0); - aaa = new QLabel("Aaaaaaaaaaaaaaaaaaaaaaaa"); - aaa->setAutoFillBackground(true); - QPalette pal; - pal.setColor(QPalette::Window, Qt::darkGreen); - aaa->setPalette(pal); - aaa->setMinimumWidth(10); - hBox->addWidget(aaa); - - bbb = new QLabel("B"); - bbb->setAutoFillBackground(true); - pal.setColor(QPalette::Window, Qt::darkCyan); - bbb->setPalette(pal); - bbb->setMinimumWidth(1); - - auto poli = aaa->sizePolicy(); - poli.setHorizontalPolicy(QSizePolicy::Expanding); - aaa->setSizePolicy(poli); - bbb->setSizePolicy(poli); - - - hBox->addWidget(bbb); - } - void mouseDoubleClickEvent(QMouseEvent *) override { - qDebug()<<"sizeHint "<sizeHint()<sizeHint(); - qDebug()<<"minHint "<minimumSizeHint()<minimumSizeHint(); - qDebug()<<"sizePolicy"<sizePolicy()<sizePolicy(); - qDebug()<<"minSize "<minimumSize()<minimumSize(); - qDebug()<<"maxSize "<maximumSize()<maximumSize(); - qDebug()<<"size "<size()<size(); - } - QWidget *aaa; - QWidget *bbb; -}; -int tttmain(int argc, char *argv[]) { - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); - QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); - QApplication a(argc, argv); - QFont font = a.font(); - font.setPointSize(14); - a.setFont(font); - - TestWin w; - w.show(); - return a.exec(); -} -